Página 1 de 1

escolha de campos da base em Dbedit

Enviado: 10 Jun 2015 15:00
por cjp
Meus caros,

Alguém teria alguma função pronta para que o usuário escolha os campos de uma base de dados para editar num dbedit?

Eu estou querendo fazer uma função assim, mas não estou sabendo por onde começar. Alguém poderia me ajudar?

Estou usando o Harbour, em modo console, com base DBF sem índice.

escolha de campos da base em Dbedit

Enviado: 12 Jun 2015 10:12
por Kapiaba
Algo asim?

Código: Selecionar todos

#include "inkey.ch"
#include "dbedit.ch"

Function Main()
   Local aCols := {{"PadR(AllTrim(FIRST)+' '+AllTrim(LAST),30)", {|x| IIf(FIELD->SALARY<10000, {3,2}, IIf(FIELD->SALARY<100000,{1,2},{4,5}))}},;
                "CITY",;
                "SALARY"}

  set scoreboard off

  Use test
  @maxrow(),0 say "<Ctrl-Down/Up>-Toggle columns  <Space bar>-Edit cell" 
  DBEdit(0,0,MaxRow()-1,MaxCol(), aCols, "TstFnc",,{"Name", "City", "Salary"})
  Close
  Cls
  ? "Have a nice day ;)"
  ?
Return Nil

Function TstFnc(nMode, nCol, oTBR)
LOCAL GetList := {}
Local nRet := DE_CONT

  Do Case
    Case nMode == DE_INIT // EXTENSION: Initialization mode
      oTBR:colorSpec := "n/bg,w/n,r/bg,w+/bg,w+/gr"
    Case nMode == DE_HITTOP
      Keyboard Chr(K_CTRL_PGDN)
    Case nMode == DE_HITBOTTOM
      Keyboard Chr(K_CTRL_PGUP)
    Case LastKey() == K_ESC
      nRet := DE_ABORT
    Case LastKey() == K_SPACE .And. oTBR:getColumn(nCol):heading != "Name"
      SetCursor(1)
      @ Row(), Col() Get &(oTBR:getColumn(nCol):heading)
      Read
      SetCursor(0)
      Clear TypeAhead
  End

Return nRet

escolha de campos da base em Dbedit

Enviado: 12 Jun 2015 16:00
por cjp
Precisa de alguma coisa extra pra compilar essa função?

Tentei compilar para entender melhor como ela funciona, mas deu o seguinte erro: Error E0048 GET contains complex macro. Na seguinte linha do programa:

Código: Selecionar todos

   @ Row(), Col() Get &(oTBR:getColumn(nCol):heading)
Estou usando o Harbour em modo console.

escolha de campos da base em Dbedit

Enviado: 22 Jun 2015 09:25
por Kapiaba
CJP, infelizmente não uso modo console a long long time ago... Você teria uma tela de algum exemplo para melhor entedimento do que queres? abs.

Veja se esta telas te ajudam:

http://www.sandata.com.br/teladbed.htm

De uma lida neste manual de Clipper, pode ser que te ajude:

http://underpop.free.fr/c/clipper/comandos-clipper.pdf

escolha de campos da base em Dbedit

Enviado: 04 Ago 2015 01:07
por cjp
Não exatamente.

Eu só queria selecionar alguns campos para ser exibidos no Dbedit(), deixando a escolha ao usuário. Então, se, por exemplo, a base tem 10 campos, o usuário poderá escolher exibir só 2, ou 3, ou quantos quiser.

escolha de campos da base em Dbedit

Enviado: 04 Ago 2015 07:47
por ANDRIL
cjp escreveu:Então, se, por exemplo, a base tem 10 campos, o usuário poderá escolher exibir só 2, ou 3, ou quantos quiser.

Amigo segue esse codigo que preparei, veja se lhe serve.

Código: Selecionar todos

/* teste para exibir campos do dbf e o usuario escolher o que mostrar no DBEdit() */
CLS

USE NF_CLIEN /* coloque aqui seu DBF */
nCmps=fCount()

DO WHILE .T.
arCmps:={}
arDbedit:={}
for i =  1 to nCmps
	aadd(arCmps," "+fieldname(i))
	//aadd(arNulo,.t.)
next
@08,05 say "ESPACO = Seleciona os campos para exibicao"
@09,05 say repli("-",63) ; @21,05 say repli("-",63) ; @22,05 say padc("ESC - Para sair",63)
achoice(10, 05,20, 68, arCmps, "", "udfSelecao")

if lastkey()=27
EXIT
endif

for i = 1 to len(arCmps)
    
	if left(arCmps[i],1)="*"
	    aadd(arDbedit,substr(arCmps[i],2))
    endif    
next
if len(arDbedit)=0
	alert("Nenhum campo escolhido!;Escolha um campo pelo menos.")
	LOOP
endif
@08,05 say "RESULTADO - Somente campos escolhidos     "


DbEdit(10,05,20,68,arDbedit)

ENDDO
USE
QUIT


function udfSelecao(modo,elem,selecao)

if lastkey()=32
    arCmps[elem]=if(left(arCmps[elem],1)="*"," ","*")+substr(arCmps[elem],2)
	//arNulo[elem]=if(arNulo[elem]=.t.,.f.,.t.)
	keyb chr(1)
	return 2
elseif lastkey()=27 .or. lastkey()=13
    return 0
else
	return 2
endif
Até+

escolha de campos da base em Dbedit

Enviado: 12 Ago 2015 01:23
por cjp
Parece que é isso mesmo que eu quero sim, muito obrigado.

Mas estou estranhando um fato: não está editando a base depois da escolha dos campos.

Testei com ?len(ardbedit), está retornando 0, não sei porquê.

escolha de campos da base em Dbedit

Enviado: 12 Ago 2015 22:26
por JoséQuintas
A rotina é boa, só contém uma falha simples:

O ESC encerra a seleção, mas também encerra tudo.
Por isso o dbEdit não aparece, porque não chega nele.

Só formatei o fonte, e retirei o ESC.

Código: Selecionar todos

#include "inkey.ch"

MEMVAR acFields

PROCEDURE Main

   LOCAL acSelectedFields, nCont, nFCount
   PRIVATE acFields

   SetMode( 40, 120 )
   CLS
   USE d:\jpa\cordeiro\jpcadas
   nFCount = FCount()
   DO WHILE .T.
      acFields    := {}
      FOR nCont = 1 TO nFCount
         aadd( acFields, " " + FieldName( nCont ) )
      NEXT
      @  1, 5 SAY "ESPACO = Seleciona os campos para exibicao"
      @  2, 5 TO 2, MaxCol() - 5
      @ MaxRow() - 1, 5 TO MaxRow() - 1, MaxCol() - 5
      @ MaxRow(),     5 SAY Padc( "ESC - Para sair", 63 )
      Achoice( 3, 5, MaxRow() - 2, MaxCol() - 10, acFields, "", "UDFSelecao" )

      acSelectedFields := {}
      FOR nCont = 1 TO Len( acFields )
         IF Left( acFields[ nCont ], 1 ) == "*"
            Aadd( acSelectedFields, Substr( acFields[ nCont ], 2 ) )
         ENDIF
      NEXT

      Alert( Str( Len( acSelectedFields ) ) + " campos selecionados" )

      IF Len( acSelectedFields ) == 0
         Alert( "Nenhum campo escolhido!;Escolha um campo pelo menos." )
         LOOP
      ENDIF

      @ 1, 5 CLEAR TO MaxRow() - 2, MaxCol()
      @ 1, 5 SAY "RESULTADO - Somente campos escolhidos  "

      DbEdit( 2, 5, MaxRow() - 2, MaxCol() - 10, acSelectedFields )

      EXIT

   ENDDO
   USE
   QUIT

FUNCTION UDFSelecao( nModo, nElemento, nSelecao )

   IF LastKey() = K_SPACE
      acFields[ nElemento ] := iif( Left( acFields[ nElemento ], 1 ) == "*", " ", "*" ) + Substr( acFields[ nElemento ], 2 )
      KEYBOARD Chr(1)
      RETURN 2
   ELSEIF LastKey() = K_ESC .OR. LastKey() = K_ENTER
      RETURN 0
   ENDIF
   HB_SYMBOL_UNUSED( nModo + nSelecao )
   RETURN 2
Nota:
Comparem os dois fontes.
É exatamente o mesmo código, mas agora formatado.
Só pra ilustrar como isso ajuda a entender o fonte, e ajuda em manutenções futuras.
Não faz diferença para o compilador, mas faz pra nós mesmos na hora de fazer manutenção.

Mas é o mesmo fonte do ANDRIL, o mérito da rotina é dele.
Apenas formatei, pra mostrar como isso ajuda a decifrar rápido um fonte.

escolha de campos da base em Dbedit

Enviado: 12 Ago 2015 22:34
por JoséQuintas
Em execução:
tela1.png
tela2.png
Nota:
Gostei da rotina.
Faz o que precisa, de forma simples, e faz direito.
Por isso acabei formatando.

Parabéns Andril.

escolha de campos da base em Dbedit

Enviado: 02 Set 2015 16:42
por cjp
Agora funcionou perfeitamente, muito obrigado.