DBGrid: Gravação no Banco de Dados

Delphi

14/02/2011

Amigos,

Como faço para gravar as informações alimentadas em dbGrid por um clientdataset diferente.

Exemplo:
Pelo dbnavigator, ao gravar ele vai inserir as informações de alguns campos no cds01.
Ó dbGrid é alimentado com a query do cds02, porém, quero gravar o que foi exibido no dbGrid no cds01.

It's possible?

Obrigado!
Elton Ésqui

Elton Ésqui

Curtidas 0

Respostas

Diego Cavalca

Diego Cavalca

14/02/2011

Amigos,

Como faço para gravar as informações alimentadas em dbGrid por um clientdataset diferente.

Exemplo:
Pelo dbnavigator, ao gravar ele vai inserir as informações de alguns campos no cds01.
Ó dbGrid é alimentado com a query do cds02, porém, quero gravar o que foi exibido no dbGrid no cds01.

It's possible?

Obrigado!


No caso se quiser 'jogar' informações no cds01, com base nos dados do cds02, faz o seguinte...
//cds02 já carregado
cds02.First;
cds01.Close;
cds01.CreateDataSet;

//Percorre os valores alimentados do cds02
while not cds02.eof do
begin
  //Aqui pode colocar algum filtro...
  cds01.insert;

  cds01CAMPO_1.value := cds02CAMPO_1.value;
  cds01CAMPO_2.value := cds02CAMPO_2.value;

  cds01.append;
  cds02.next;
end;


[]'s
GOSTEI 0
Alison Bissoli

Alison Bissoli

14/02/2011

Mande gravar manualmente no seu cds02, algo como abaixo, nao estou seguro do codigo pois esetou sem a IDE mas dá para ter uma idéia espero.
cds01.first;while not cds01.eof dobegin     cds02.append;     for i := 0 to cds02.fields.count     begin          cds02.fields(i).value := cds01.fields(i).value;     end     cds02.applyupdates(0);end;




--------------------------------------------http://garotodesktop.blogspot.com
GOSTEI 0
Alison Bissoli

Alison Bissoli

14/02/2011

correção...
cds01.first;while not cds01.eof dobegin     cds02.append;     for i := 0 to cds02.fields.count - 1;     begin          cds02.fields(i).value := cds01.fields(i).value;     end     cds02.applyupdates(0);     cds01.next;end;

GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Desculpe minha inexperiência, mas em qual evento coloco isso?
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

Desculpe minha inexperiência, mas em qual evento coloco isso?


No caso, quer fazer por dbnavigator né?!

Se o dbnavigator estiver linkado no cds01, coloque no evento 'AfterPost' do cds01...

Se quiser colocar no 'click' do dbNavigator, vai ter que programar na mão...

 if DBNavigator1.DataSource.DataSet.State in [dsInsert,dsEdit] then
   //Chama o código para gravar;


[]'s
GOSTEI 0
Marco Salles

Marco Salles

14/02/2011

Ó dbGrid é alimentado com a query do cds02, porém, quero gravar o que foi exibido no dbGrid no cds01
  Mas para que vc quer isto????   O CloneCds não resolve ????
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

E o que seria o CloneCds?

Joguei no Google e veio: cds da novela o cloneBLAHHHHH

E então descobri que o correto seria: CloneClientDataSet...rsrs
GOSTEI 0
Marco Salles

Marco Salles

14/02/2011

E o que seria o CloneCds?

Joguei no Google e veio: cds da novela o cloneBLAHHHHH

E então descobri que o correto seria: CloneClientDataSet...rsrs
  cloneCds para os intimos ... Para os demais é  CloneClientDataSet
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Não consegui pensar direito :(

Como faço agora para clonar de um DBGRID para o outro?

O código abaixo clona dentro do próprio DBGRID.

procedure TForm1.btnClonarRegistroClick(Sender: TObject);
var
 varCdsClne : TClientDataSet;
 varI       : Integer;
begin
  varCdsClne := TClientDataSet.Create(Self);
  try
    varCdsClne.CloneCursor(TClientDataSet(cds1), True);
    cds1.Append;
    for varI := 0 to cds1.FieldCount - 1 do
      begin
        if (cds1.Fields[varI].FieldKind = fkData) then
        cds1.Fields[varI].Value := varCdsClne.FieldByName(cds1.Fields[varI].FieldName).Value;  
      end;
  finally
    varCdsClne.Close;
    varCdsClne.Free;
  end;
end;


PS: Ainda não toda essa intimidade...rsrs
GOSTEI 0
Marco Salles

Marco Salles

14/02/2011

Amigos,

Como faço para gravar as informações alimentadas em dbGrid por um clientdataset diferente.

Exemplo:
Pelo dbnavigator, ao gravar ele vai inserir as informações de alguns campos no cds01.
Ó dbGrid é alimentado com a query do cds02, porém, quero gravar o que foi exibido no dbGrid no cds01.

It's possible?

Obrigado!
Elton deixa eu entender ..   Veja se é isto que vc quer ??   Vc tem um dbgrid alimentado por um ClientDataSet ()   Vc tem (1000) N_esimos registros neste ClientDatSet , mas o DbGrid visualiza uma quantidade de cada vez (correto)   Ai neste momento , vc insere mais um Registro , Mais outro , mais Outro .. Totalizado 1000+3 = 1003 Regustro   O que vc quer é esses Gravar esse Tres Registros  ????      
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Oi Marco.

Não é bem isso.

Eu tô fazendo uma coisa, que talvez tenha um caminho mais simples.

A parada é assim:

Tenho lá doi DBEdits, por exemplo

[edtNumero] [edtData] <--- Cds01

Então abaixo o DBGRID
[dataini] até [datafin] [OK] <--- Filtro

No DBGrid tenho o Cds02, porque tenho duas tabelas. Uma vou gravar as informações dos dois DBEdits incluindo algumas informações da outra tabela que é carregado do Cds02.

Se eu fizer assim:
Colocar no DBGrid o Cds01 e incluir dados na mão, grava de boa, mas o que eu preciso é gravar o resultado do DBgrid na tabela do Cds01.

Ai meu Deus, será que fui claro?...rsrs
GOSTEI 0
Marco Salles

Marco Salles

14/02/2011

Mas esses clientDataSet tem estruturas diferentes .. Ou vc quer valores soemente de alguns Campo ??? Porque no inicio do seu post ja foi reportado estrutura de bloco com While Não gosto muito , mas a principio resolve .
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Somente de alguns campos (chave).

Eu tentei implementar as dicas anteriores, mas não rolou.
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

Somente de alguns campos (chave).

Eu tentei implementar as dicas anteriores, mas não rolou.


Qual erro foi reportado no bloco de código 'WHILE'?
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

D. Cavalca

É como se não estivesse lendo.

Field 'NOTA' have a must value.
Esse erro da com ou sem o While, pois de fato não existe um campo com esses valores, os valores estão no DBGrid, que são carregado de outra tabela.
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

D. Cavalca

É como se não estivesse lendo.

Field 'NOTA' have a must value.
Esse erro da com ou sem o While, pois de fato não existe um campo com esses valores, os valores estão no DBGrid, que são carregado de outra tabela.


Esse erro se dá devido ao campo NOTA ser requerido na tabela do Banco de dados (primary key ou coisa do tipo)...
Posta a estrutura da sua tabela e o código que está usando pra gravar...
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

D. Cavalca

Alguma coisa errada pra copiar as informações, pois se eu faço um DBGRid com o CDS01 e inserir manualmente "célula" por "célula", a gravação vai de boa. Quando o DBGRid está ligado ao CDS02 que quebra a rocha.
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

Élton...

Verifique se o Cds02 não possui o campo 'NOTA' no seu FieldDefs
(Dois clique nos CDS e 'FieldDefs' no ObjectInspector). Pode ter ficado 'sujeira' no seu cds...
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Acabei por usar da forma abaixo no finally da QUERY que eu estava a usar.
    DMForm.cdsColeta.FieldByName('CAMPO').AsFloat := StrToFloat(dbgColeta.Fields[1].Value);


Infelizmente não pude implementar da maneira que eu necessitava, mas isto deve me ajudar por hora.

Obrigado aos companheiros que dispuseram de seu tempo a me ajudar.
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Amigos.

Retomando ao assunto.

Meu código ficou assim, com base na dica do D. Cavalca.
    while not DMForm.cdsNotas.eof do
    begin
    //FILTRO SE NECESSÁRIO
    //DMForm.cdsColeta.Insert;
    DMForm.cdsColeta.Edit;

    //DMForm.cdsColeta.FieldByName('ORDEM_COLETA').AsFloat := StrToFloat(ORDEM_COLETA.Text);
      DMForm.cdsColeta.FieldByName('NOTA').Value := dbgColeta.Fields[1].Value;
      DMForm.cdsColeta.FieldByName('CLIENTE').Value := dbgColeta.Fields[2].Value;
      DMForm.cdsColeta.FieldByName('PEDIDO').Value := dbgColeta.Fields[3].Value;
      DMForm.cdsColeta.FieldByName('TIPO_SITU').Value := dbgColeta.Fields[4].Value;
      DMForm.cdsColeta.FieldByName('CLASS_NOTA').Value := dbgColeta.Fields[5].Value;
      DMForm.cdsColeta.FieldByName('CAIXA').Value := dbgColeta.Fields[6].Value;
      DMForm.cdsColeta.FieldByName('DATA_EMI').Value := dbgColeta.Fields[7].Value;
      DMForm.cdsColeta.FieldByName('NOTSERIE').Value := dbgColeta.Fields[8].Value;
      DMForm.cdsColeta.FieldByName('EMPRESA').Value :=     DMForm.sqlEmp.FieldByName('CODIGO').Value;//dbgColeta.Fields[9].Value;

      //DMForm.cdsColeta.Append;
      DMForm.cdsColeta.Post;
      DMForm.cdsNotas.Next;
    end;


O que tá comentado está sendo realizado em outro momento da alpicação.
O problema é que so grava a primeira linha do DBGrid, não gravou todas as linhas.

Deveria funcionar assim:

DBGrid:
01213 | 2000 | ...
01213 | 2001 | ...
01213 | 2002 | ...

No banco gravar:
01213 | 2000 | ...
01213 | 2001 | ...
01213 | 2002 | ...

Mas só grava:
01213 | 2000 | ...

Help-me please.
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

Uma dúvida, em qual cds seu grid está ligado?


me add no msn pra tentarmos esclarecer melhor: diegocavalca.ti@gmail.com

GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Está ligado ao cdsNotas.
Não funfa o MSN aqui :(

cdsNotas e cdsColeta, onde:
cdsNotas recebe dados da tabela NOTAS
Alguns dados de NOTAS deverá ser gravado na tabela COLETA (cdsColeta).

Quando eu faço a busca pela query do cdsNotas, ele alimenta o DBGrid (TwwDBGrid) com os dados.
Aí então gravo esse dados na tabela COLETA com mais algumas informações que estão em Edits pelo form.
Só que não grava tudo do DBGrid, só a primeira linha.

Depois que consegui gravar tudo, ainda preciso fazer gravar somente o que está selecionado (Option / MultSelect = True).

Valeu!
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

Uma dúvida, em qual cds seu grid está ligado?


me add no msn pra tentarmos esclarecer melhor: diegocavalca.ti@gmail.com



Só pra ficar esclarecido, testei e funcionou, entaum a logica está certa, põe um breakpoint e ve o PQ, não está varrendo o CDS...

Será que você não inverteu o CDS que está ligado no grid ou entaum, não setou para o primeiro registro o cds no qual será varrido?

Dá uma olhada, coloque um breakpoint..

procedure TForm7.BitBtn1Click(Sender: TObject);
var
  i : integer;
begin
    //Vou carregar seu Cds com exemplo
    cdsNotas.CreateDataSet;
    for i := 0 to 3 do
    begin
      cdsNotas.Append;
      cdsNotasCODIGO.Value := i;
      cdsNotas.Post;
    end;
    //Seta o primeiro registro do Cds que está ligado ao grid
    cdsNotas.First;

    cdsColeta.CreateDataSet;

    while not cdsNotas.eof do
    begin
      cdsColeta.Append;

      //Aqui serão os campos no qual quer manipular, do Grid(que está linkado no cdsNotas) para o cdsColeta
      cdsColetaCODIGO.Value := cdsNotasCODIGO.Value;

      cdsColeta.Post;

      //Mensagem só para confirmar os valores
      Showmessage('Valor do '+IntToStr(cdsColeta.RecNo)+'º registro do '+UpperCase(cdsColeta.Name)+': '+cdsColetaCODIGO.Text );
      cdsNotas.Next;
    end;
end;


Teseti, funcionou perfeitamente...
GOSTEI 0
Diego Cavalca

Diego Cavalca

14/02/2011

Uma dúvida, em qual cds seu grid está ligado?


me add no msn pra tentarmos esclarecer melhor: diegocavalca.ti@gmail.com



Só pra ficar esclarecido, testei e funcionou, entaum a logica está certa, põe um breakpoint e ve o PQ, não está varrendo o CDS...

Será que você não inverteu o CDS que está ligado no grid ou entaum, não setou para o primeiro registro o cds no qual será varrido?

Dá uma olhada, coloque um breakpoint..

procedure TForm7.BitBtn1Click(Sender: TObject);
var
  i : integer;
begin
    //Vou carregar seu Cds com exemplo
    cdsNotas.CreateDataSet;
    for i := 0 to 3 do
    begin
      cdsNotas.Append;
      cdsNotasCODIGO.Value := i;
      cdsNotas.Post;
    end;
    //Seta o primeiro registro do Cds que está ligado ao grid
    cdsNotas.First;

    cdsColeta.CreateDataSet;

    while not cdsNotas.eof do
    begin
      cdsColeta.Append;

      //Aqui serão os campos no qual quer manipular, do Grid(que está linkado no cdsNotas) para o cdsColeta
      cdsColetaCODIGO.Value := cdsNotasCODIGO.Value;

      cdsColeta.Post;

      //Mensagem só para confirmar os valores
      Showmessage('Valor do '+IntToStr(cdsColeta.RecNo)+'º registro do '+UpperCase(cdsColeta.Name)+': '+cdsColetaCODIGO.Text );
      cdsNotas.Next;
    end;
end;


Testi, funcionou perfeitamente...
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Meu cód ficou assim:

procedure TForm1.btnGravarDoisClick(Sender: TObject);
var
  i : integer;
begin
  with DMForm do
  begin
    //Vou carregar seu Cds com exemplo
    cdsNotas.Close;
    cdsNotas.CreateDataSet;
    for i := 0 to 3 do
    begin
      cdsNotas.Append;
      //cdsNotasCODIGO.Value := i;
      DMForm.cdsNotas.FieldByName('NOTA').Value := i;
      cdsNotas.Post;
    end;
    //Seta o primeiro registro do Cds que está ligado ao grid
    cdsNotas.First;

    cdsColeta.CreateDataSet;

    while not cdsNotas.eof do
    begin
      cdsColeta.Append;

      //Aqui serão os campos no qual quer manipular, do Grid(que está linkado no cdsNotas) para o cdsColeta
      DMForm.cdsColeta.FieldByName('ORDEM_COLETA').Value := ORDEM_COLETA.Text;
      DMForm.cdsColeta.FieldByName('NOTA').Value := dbgNotas.Fields[0].Value;
      DMForm.cdsColeta.FieldByName('CLIENTE').Value := dbgNotas.Fields[1].Value;
      DMForm.cdsColeta.FieldByName('PEDIDO').Value := dbgNotas.Fields[2].Value;
      DMForm.cdsColeta.FieldByName('TIPO_SITU').Value := dbgNotas.Fields[3].Value;
      DMForm.cdsColeta.FieldByName('CLASS_NOTA').Value := dbgNotas.Fields[4].Value;
      DMForm.cdsColeta.FieldByName('CAIXA').Value := dbgNotas.Fields[5].Value;
      DMForm.cdsColeta.FieldByName('DATA_EMI').Value := dbgNotas.Fields[7].Value;
      DMForm.cdsColeta.FieldByName('NOTSERIE').Value := dbgNotas.Fields[8].Value;
      DMForm.cdsColeta.FieldByName('EMPRESA').Value := DMForm.sqlEmp.FieldByName('CODIGO').Value;

      cdsColeta.Post;

      //Mensagem só para confirmar os valores
      Showmessage('Valor do '+IntToStr(cdsColeta.RecNo)+'º registro do '+UpperCase(cdsColeta.Name)+': '+DMForm.cdsNotas.FieldByName('NOTA').Text );
      cdsNotas.Next;
    end;
  end;
end;


Da um erro aqui no Post
    begin

      cdsNotas.Append;

      //cdsNotasCODIGO.Value := i;

      DMForm.cdsNotas.FieldByName('NOTA').Value := i;

      cdsNotas.Post;

    end;

Field 'CLIENTE' must have a value.
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Ficou assim:
[code]
procedure TForm1.btnGravarDoisClick(Sender: TObject);
var
  i : integer;
begin
  with DMForm do
  begin
    //Vou carregar seu Cds com exemplo
    cdsNotas.Close;
    //cdsNotas.CreateDataSet;

    for i := 0 to 3 do
    begin
      //cdsNotas.Append;
      cdsNotas.Open;
      cdsNotas.Edit;
      //cdsNotasCODIGO.Value := i;
      DMForm.cdsNotas.FieldByName('NOTA').Value := i;
      cdsNotas.Post;
    end;
    //Seta o primeiro registro do Cds que está ligado ao grid
    cdsNotas.First;

    //cdsColeta.CreateDataSet;
      cdsColeta.Close;
    while not cdsNotas.eof do
    begin
      //cdsColeta.Append;
      cdsColeta.Open;
      cdsColeta.Edit;

      //Aqui serão os campos no qual quer manipular, do Grid(que está linkado no cdsNotas) para o cdsColeta
      DMForm.cdsColeta.FieldByName('ORDEM_COLETA').Value := ORDEM_COLETA.Text;
      DMForm.cdsColeta.FieldByName('NOTA').Value := dbgNotas.Fields[0].Value;
      DMForm.cdsColeta.FieldByName('CLIENTE').Value := dbgNotas.Fields[1].Value;
      DMForm.cdsColeta.FieldByName('PEDIDO').Value := dbgNotas.Fields[2].Value;
      DMForm.cdsColeta.FieldByName('TIPO_SITU').Value := dbgNotas.Fields[3].Value;
      DMForm.cdsColeta.FieldByName('CLASS_NOTA').Value := dbgNotas.Fields[4].Value;
      DMForm.cdsColeta.FieldByName('CAIXA').Value := dbgNotas.Fields[5].Value;
      DMForm.cdsColeta.FieldByName('DATA_EMI').Value := dbgNotas.Fields[7].Value;
      DMForm.cdsColeta.FieldByName('NOTSERIE').Value := dbgNotas.Fields[8].Value;
      DMForm.cdsColeta.FieldByName('EMPRESA').Value := DMForm.sqlEmp.FieldByName('CODIGO').Value;

      cdsColeta.Post;

      //Mensagem só para confirmar os valores
      Showmessage('Valor do '+IntToStr(cdsColeta.RecNo)+'º registro do '+UpperCase(cdsColeta.Name)+': '+DMForm.cdsNotas.FieldByName('NOTA').Text );
      cdsNotas.Next;
    end;
  end;
end;
[code]

Gera o ShowMessage, mas aparece sempre assim: "Valor do 1º"
Valor do 1º registro do CDSCOLETA: 10
Valor do 1º registro do CDSCOLETA: 20
Valor do 1º registro do CDSCOLETA: 30

E não grava!
GOSTEI 0
Elton Ésqui

Elton Ésqui

14/02/2011

Fiz assim e deu certo:

Valeu a todos que contribuíram.

   for i := 0 to SelectedList.Count - 1 do
    begin
      GotoBookmark(SelectedList.items[i]);
      Freebookmark(SelectedList.items[i]);

      //Gravar número do Código selecionado
      Append;
      DMForm.cds02.FieldByName('CODIGO').AsFloat := StrToFloatDef(edtCodigo.Text, 0);
      Post;

      //Criar registro da coleta
      DMForm.cds01.Append;
      DMForm.cds01.FieldByName('CODIGO').Value := edtCodigo.Text;
     
      //Informações dos Edits
      DMForm.cds01.FieldByName('NOME').Value := edtNome.Text;

      DMForm.cds01.Post;
    end;

GOSTEI 0
POSTAR