Página 1 de 2

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

Enviado: 06 Fev 2019 10:31
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!

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

Enviado: 06 Fev 2019 12:27
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

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

Enviado: 14 Fev 2019 09:18
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... ?

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

Enviado: 14 Fev 2019 12:12
por Heero
Pode postar seu código ?

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

Enviado: 14 Fev 2019 14:09
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.

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

Enviado: 14 Fev 2019 14:28
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

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

Enviado: 14 Fev 2019 16:02
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

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

Enviado: 14 Fev 2019 16:06
por asimoes
Esse código ai é para atualizar um registro ou vários ? não entendi isso

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

Enviado: 14 Fev 2019 16:17
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

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

Enviado: 14 Fev 2019 16:36
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

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

Enviado: 15 Fev 2019 09:56
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".

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

Enviado: 19 Fev 2019 18:06
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?

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

Enviado: 19 Fev 2019 18:16
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

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

Enviado: 19 Fev 2019 18:27
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


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

Enviado: 20 Fev 2019 12:44
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.