GRID Ler dados do DBF e gravar nele as alterações

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por syslink »

No link abaixo:
https://hmglights.wordpress.com/tag/grid

tem um exemplo de como ler dados de uma tabela DBF diretamente na GRID, mas, não tem algo inverso, ou seja, gravar as alterações feitas na GRID diretamente no DBF.

Alguém tem algum exemplo de como na ONCHANGE da GRID salvar diretamente no DBF as alterações feitas?

obrigado!
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por MSDN »

Nesse caso é simples, basta seguir essa sequência lógica :

1 - Pegar o código/ID ou algum campo que seja chave ( da mesma linha onde foi feita a edição ) para dar um SEEK no DBF ;
2 - Achando o registro no DBF, proceder com a alteração e gravar

Para saber como resgatar o conteúdo de uma linha do GRID, e saber os valores dos campos ( colunas ), use como base esses exemplos :
C:\MiniGUI\SAMPLES\BASIC\Grid_7

Abraços
syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por syslink »

MSDN escreveu:use como base esses exemplos :
C:\MiniGUI\SAMPLES\BASIC\Grid_7
muito boa sua dica Marcelo.
testei todos os exemplos, inclusive usando ON QUERYDATA QueryTest(aData) de alugm dos exemplos que já carrega os dados da tabela pra dentro da grid.
usando também a COLUMNWHEN para impedir acesso a linha/coluna que não quero alterar.
Mas, algo me intriga:
1) Após o duplo clique, abre a CELL para edição, só que após alterar e pressionar enter, volta o valor que está na tabela
2) como salvar isso na tabela? Existe algum tipo de onenter, onchange... ?
Heero
Usuário Nível 2
Usuário Nível 2
Mensagens: 51
Registrado em: 13 Jul 2015 22:10
Localização: Guarulhos/SP

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por Heero »

Pode postar seu código ?
Ricardo Rodrigues
Harbour 3.2 + BCC + Minigui
Cursando Análise e Desenvolvimento de Sistemas
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por MSDN »

2) como salvar isso na tabela? Existe algum tipo de onenter, onchange... ?
Comecei no Clipper Summer 87 na década de 80, fui evoluindo, Clipper 5.0, Rick Spence, Ramalho, 5.2, 5.3, LightLib, xHarbour, Harbour e MiniGUI, apanhei muito para mudar a cabeça do DOS para o Windows, e para mudar de console para gráfico, hoje até vendo material para programadores, e como consegui isso ? Estudando, pesquisando e testando, testando, testando tudo o que aparecia na frente, por isso, quando vejo vc falar dessa forma, desculpe minha sinceridade, dá a impressão que vc não tem aquele espírito de programador que fuça, se esforça, vai atrás, e digo isso, pq na mesma pasta onde tem os exemplos que eu te indiquei, tem um monte de exemplo que responde a tua pergunta, fora o manual, fora o sistema de exemplo da pizzaria que fica em C:\MiniGUI\SAMPLES\Applications\Super.
syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por syslink »

parte da GRID q está dentro do form_main:

Código: Selecionar todos

		@ 140,405 GRID Grid_1 ;
         PARENT FORM_MAIN ;
			WIDTH 400 ;
			HEIGHT 200 ;
			HEADERS {"Cod","Descricao","Cobrar S/N","Valor"};
			WIDTHS {40,200,80,65};
			VIRTUAL ;
			ITEMCOUNT Len(aData) ;
			ON QUERYDATA QueryTest(aData) ;
			CELLNAVIGATION ;
         DYNAMICFORECOLOR { fColor , fColor , fColor , fColor } ;
			DYNAMICBACKCOLOR { bColor , bColor , bColor , bColor } ;
         JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER } 	;
			COLUMNWHEN { { || .F. } ,  { || .F. } , { || .T. } ,  { || iif( Form_Main.Grid_1.Cell(GetProperty("Form_Main","Grid_1",'Value')[1], GetProperty("Form_Main","Grid_1",'Value')[2]-1)='S' , .t. , .f. ) }  }  ;
			EDIT ;
         INPLACE { ;
					{'TEXTBOX','NUMERIC','9'} , ;
					{'TEXTBOX','CHARACTER','AAAAAAAAAAAAAAAAAAAA'} , ;
					{'TEXTBOX','CHARACTER','A'} , ;
					{'TEXTBOX','NUMERIC','9.99'} } 
obs.: 1- no INPLACE, não sei como definir que terceiro textbox se aceite apenas S ou N
2- no columnwhen as 2 primeiras colunas estão bloqueadas para edição. a terceira aceita alteração. já a quarta só aceita se a terceira estiver com S
3 - os dados são pegos de uma tabela comum dbfntx através do on querydata
4 - como se faz para salvar de volta no dbf? tenho feito mas tem algo estranho que salva no arquivo todas os conteúdos com o mesmo... fica tudo igual.
5 - criei um botão abaixo para clicar e salvar de volta na tabela mas penso que não é assim que o Marcelo tentou passar:

Código: Selecionar todos

	DEFINE BUTTON BUTTON_4
               PARENT Form_Main
               ROW	365
               COL	530
               CAPTION 'Salvar' 
               TOOLTIP 'Clique aqui para Salvar'
               ACTION  SalvaGrid (aData)
	END BUTTON
ao clicar no botão a função SalvaGrid é acionada:

Código: Selecionar todos

static function SalvaGrid (aRows)
		local mARQ := select()  , I  , N
      for N = 1 to len (aRows)
         MsgInfo (aRows[N,1])
         MsgInfo (aRows[N,2])
         MsgInfo (aRows[N,3])
         MsgInfo (aRows[N,4])
      next N
		
      sele dTabela3
      go top
	
    do while .t.
			if rlock()
         
            for I = 1 to len (aRows)
               replace  COD         with aRows[I,1] ,;
                        DESCRICAO   with aRows[I,2] ,;
                        SIMNAO      with aRows[I,3] ,;
                        VALOR       with aRows[I,4]
            next I

            unlock
				commit
				exit
			else
				MsgInfo ('Nao deu certo! Tente novamente!')
			endif
    enddo
    select (mARQ)
return
obs.:
1- o for/next N esta temporariamente presente para observacao
2- talvez a falta de um skip resolva nao sei.

os outros codigos q n postei sao dos exemplos da pasta samples
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por asimoes »

Sugestão:

Trabalha com o que o harbour oferece: For Each In... Next

Código: Selecionar todos

LOCAL oElemento

           for Each oElemento In aRows
               replace  COD         with oElemento[1] ,;
                        DESCRICAO   with oElemento[2] ,;
                        SIMNAO      with oElemento[3] ,;
                        VALOR       with oElemento[4]
            next I
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por asimoes »

Esse código ai é para atualizar um registro ou vários ? não entendi isso
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por asimoes »

Eu trocaria

{'TEXTBOX','CHARACTER','A'} , ;

Por

{ 'CHECKBOX' , 'Sim' , 'Não' } , ;

Nesse campo você testar se no dbf o campo SIMNAO for = S coloca .T. ou .F. para N no vetor que carrega na grid
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por asimoes »

No gravar:

Código: Selecionar todos

LOCAL oElemento

           for Each oElemento In aRows
               replace  COD         with oElemento[1] ,;
                        DESCRICAO   with oElemento[2] ,;
                        SIMNAO      with IF(oElemento[3], "S", "N") ,;
                        VALOR       with oElemento[4]
            next
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por syslink »

asimoes escreveu:Esse código ai é para atualizar um registro ou vários ?
. são 3 registros pré-definidos na criação da tabela. o funcionario so tera acesso a tres campos "simnao" e "valor".
syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por syslink »

tudo funfando redondinho. criamos um botao para enviar os dados
ao enviar a matriz arows ela continua com os mesmos valores
na tela mostra que a grid tem novos valores
qual matriz entao tem estas informacoes alteradas?
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por asimoes »

Aqui você vai ler as celulas da grid

SeuForm = Nome do sua janela

O código abaixo vai ler os dados das colunas da grid

Código: Selecionar todos

   FOR I:=1 TO SeuForm.Grid_1.ItemCount
        MsgInfo( SeuForm.Grid_1.Cell(I,1) )
        MsgInfo( SeuForm.Grid_1.Cell(I,2) )
        MsgInfo( SeuForm.Grid_1.Cell(I,3) )
    NEXT
Ai você testa pra ver quem modificou
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por asimoes »

Algumas coisas legais trabalhando com grid

Código: Selecionar todos

Assim você pega a posição (linha) da celula aResult[ 1 ]

aResult := fConsultaBoleto.Grid_Boletos.Value

cApto := fConsultaBoleto.Grid_Boletos.cell( aResult[ 1 ], 1 )

O exemplo irá pegar o número do apto na linha/coluna aResult[ 1 ], 1

►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

GRID Ler dados do DBF e gravar nele as alterações

Mensagem por JoséQuintas »

Geralmente a grid deve ter algum campo que faz parte da chave.
Apenas exemplo, considerando um pedido.

WITH OBJECT seuform.grid_1
FOR nCont = 1 TO :ItemCount
SEEK mPedido + :cell( nCont, 1 )
REPLACE ...
NEXT
END WITH
[/code]

Apenas baseando nos posts anteriores, deve ter algum jeito melhor de fazer isso.
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/
Responder