Clipper On Line • Ver Tópico - GRID Ler dados do DBF e gravar nele as alterações

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

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

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

Mensagempor syslink » 06 Fev 2019 09:31

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!
syslink
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 132
Data de registro: 20 Fev 2018 13:13
Cidade/Estado: joinvile/sc
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

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

Mensagempor MSDN » 06 Fev 2019 11:27

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
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes

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

Mensagempor syslink » 14 Fev 2019 08:18

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... ?
syslink
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 132
Data de registro: 20 Fev 2018 13:13
Cidade/Estado: joinvile/sc
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

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

Mensagempor Heero » 14 Fev 2019 11:12

Pode postar seu código ?
Ricardo Rodrigues
Harbour 3.2 + BCC + Minigui
Cursando Análise e Desenvolvimento de Sistemas
Heero
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 51
Data de registro: 13 Jul 2015 22:10
Cidade/Estado: Guarulhos/SP
Curtiu: 13 vezes
Mens.Curtidas: 5 vezes

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

Mensagempor MSDN » 14 Fev 2019 13:09

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.
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes

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

Mensagempor syslink » 14 Fev 2019 13:28

parte da GRID q está dentro do form_main:
      @ 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:
   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:
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
syslink
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 132
Data de registro: 20 Fev 2018 13:13
Cidade/Estado: joinvile/sc
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

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

Mensagempor asimoes » 14 Fev 2019 15:02

Sugestão:

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

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

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

Mensagempor asimoes » 14 Fev 2019 15:06

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

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

Mensagempor asimoes » 14 Fev 2019 15:17

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

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

Mensagempor asimoes » 14 Fev 2019 15:36

No gravar:

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)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

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

Mensagempor syslink » 15 Fev 2019 08:56

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
Data de registro: 20 Fev 2018 13:13
Cidade/Estado: joinvile/sc
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

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

Mensagempor syslink » 19 Fev 2019 18:06

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?
syslink
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 132
Data de registro: 20 Fev 2018 13:13
Cidade/Estado: joinvile/sc
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

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

Mensagempor asimoes » 19 Fev 2019 18:16

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

   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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

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

Mensagempor asimoes » 19 Fev 2019 18:27

Algumas coisas legais trabalhando com grid

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

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

Mensagempor JoséQuintas » 20 Fev 2019 12:44

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18113
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1213 vezes

Próximo



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro