escolha de campos da base em Dbedit
Moderador: Moderadores
escolha de campos da base em Dbedit
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.
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

- Mensagens: 1908
- Registrado em: 07 Dez 2012 16:14
- Localização: São Paulo
- Contato:
escolha de campos da base em Dbedit
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
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:
Estou usando o Harbour em modo console.
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)Inacio de Carvalho Neto
-
Kapiaba
- Colaborador

- Mensagens: 1908
- Registrado em: 07 Dez 2012 16:14
- Localização: São Paulo
- Contato:
escolha de campos da base em Dbedit
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
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
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.
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
escolha de campos da base em Dbedit
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.Até+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
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
escolha de campos da base em Dbedit
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ê.
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
escolha de campos da base em Dbedit
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.
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.
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
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
escolha de campos da base em Dbedit
Em execução:
Nota:
Gostei da rotina.
Faz o que precisa, de forma simples, e faz direito.
Por isso acabei formatando.
Parabéns Andril.
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/
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/
escolha de campos da base em Dbedit
Agora funcionou perfeitamente, muito obrigado.
Inacio de Carvalho Neto

