escolha de campos da base em Dbedit

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

escolha de campos da base em Dbedit

Mensagem 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.
Inacio de Carvalho Neto
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

escolha de campos da base em Dbedit

Mensagem 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
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

escolha de campos da base em Dbedit

Mensagem 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.
Inacio de Carvalho Neto
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

escolha de campos da base em Dbedit

Mensagem 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
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

escolha de campos da base em Dbedit

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

escolha de campos da base em Dbedit

Mensagem 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é+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

escolha de campos da base em Dbedit

Mensagem 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ê.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

escolha de campos da base em Dbedit

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

escolha de campos da base em Dbedit

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

escolha de campos da base em Dbedit

Mensagem por cjp »

Agora funcionou perfeitamente, muito obrigado.
Inacio de Carvalho Neto
Responder