Fórum Inclusão DBGrid #395941

18/02/2011

0

Amigos

Estou na luta referente ao aprendizado da utilização do DBGrid.

Vamos lá.
Essa deve ser simples, mas não tanto para um aprendiz feito eu.

Componentes:
DBEdit [NOTA]
Button [Incluir]
DBGrid [NOTAS]
Button [Gravar] //Esse pode ser no DBNavigator
2 Tabelas cdsOrigem e cdsDestino

1) Ao informar o número no DBEdit e clicar em Incluir, vai incluir os dados (cdsOrigem) no DBGrid. Deve repetir essa operação acumulando os dados inseridos.

2) Ao clicar em gravar, todos os dados acumulados no DBGrid serão gravados no cdsDestino.

Agradeço antecipadamente a ajuda de todos.

Obrigado!

PS: Eu consegui montar até a inclusão. A partir de fazer a inclusão acumulando e gravar eu já não sei, pois ao incluir um outro ele limpa o DBGrid. :(
Elton Ésqui

Elton Ésqui

Responder

Posts

18/02/2011

Rogerio

Não sei se ajuda, mas qualquer coisa volte a postar amigo! Parar incluir os dados de um CDS para o outro:cdsDestino.Insert;
cdsDestino.fieldByName(seuCampo1).value := cdsOrigem.fieldByName(seuCampo1).value;
cdsDestino.fieldByName(seuCampo1).AsString := cdsOrigem.fieldByName(seuCampo1).AsString;
cdsDestino.fieldByName(seuCampo1).AsInteger := cdsOrigem.fieldByName(seuCampo1).AsInteger;
cdsDestino.fieldByName(seuCampo1).AsDate := cdsOrigem.fieldByName(seuCampo1).AsDate;
cdsDestino.fieldByName(seuCampo1).AsCurrency := cdsOrigem.fieldByName(seuCampo1).AsCurrency;
.....
.....
cdsDestino.Post; Quando você disse em acumular o valor, você esta se referindo tipo um autoincremento?      
Responder

Gostei + 0

18/02/2011

Elton Ésqui

Rogerio!

A princípio, a gravação está ok, mas grava só a primeira linha do DBGrid.
Acumular os seria assim (no DBGrid):
A cada vez que digitar o valor e clicar em incluir ele adicona uma nova linha no DBGrid com os novos dados, mantendo o que já foi incluído.

Obrigado!


Responder

Gostei + 0

18/02/2011

Rogerio

Para gravar vários registros de um dataSet, você pode fazer um loop utilizando um While, Repeat ou For.   Se você não conseguir volte a postar que eu faço um exemplo!     Boa Sorte!  
Responder

Gostei + 0

18/02/2011

Rogerio

A cada vez que digitar o valor e clicar em incluir ele adicona uma nova linha no DBGrid com os novos dados, mantendo o que já foi incluído.

Obrigado!


    Seria isso:
procedure TForm1.Button1Click(Sender: TObject);
begin
   ClientDataSet1.Insert;
   ClientDataSet1.FieldByName('codigo').AsInteger := StrToInt(Edit1.Text);
   ClientDataSet1.FieldByName('nome').AsString := Edit2.Text;
   ClientDataSet1.Post;
end;
 
Responder

Gostei + 0

18/02/2011

Diego Cavalca


cdsGRID.First;

//Aqui percorre Linha por Linha do registro (entenda linha do grid), 
//Como setamos o primeiro registro, ele percorre do inicio ao fim do cds carregado
while no cdsGRID.eof do
begin
  cdsTABELA.Append;

  cdsTABELACAMPO_ALFA.value := cdsGRIDCAMPO_ALFA.value;
  cdsTABELACAMPO_BETA.value := cdsGRIDCAMPO_BETA.value;
  cdsTABELA.Post;

  cdsGRID.Next;
end;



A lógica é mais ou menos essa, tente aplicar, use break-point se continuar gravando só a primeira linha...
Responder

Gostei + 0

18/02/2011

Elton Ésqui

Para gravar vários registros de um dataSet, você pode fazer um loop utilizando um While, Repeat ou For.   Se você não conseguir volte a postar que eu faço um exemplo!     Boa Sorte!  


Fiz assim:
procedure TForm1.btnGravarClick(Sender: TObject);
begin
  while  not DMForm.cdsNotas.Eof do
  begin
    DMForm.cdsColeta.Open;
    DMForm.cdsColeta.Insert;
    DMForm.cdsColeta.Edit;

    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;

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


Não acontece nada. Dei um breakpoint e ele passa três vezes no while, a mesma quantidade de linhas no DBGrid, mas nao gravou nada.
Responder

Gostei + 0

18/02/2011

Elton Ésqui


cdsGRID.First;

//Aqui percorre Linha por Linha do registro (entenda linha do grid), 
//Como setamos o primeiro registro, ele percorre do inicio ao fim do cds carregado
while no cdsGRID.eof do
begin
  cdsTABELA.Append;

  cdsTABELACAMPO_ALFA.value := cdsGRIDCAMPO_ALFA.value;
  cdsTABELACAMPO_BETA.value := cdsGRIDCAMPO_BETA.value;
  cdsTABELA.Post;

  cdsGRID.Next;
end;



A lógica é mais ou menos essa, tente aplicar, use break-point se continuar gravando só a primeira linha...


D. Cavalca

Fiz assim:
[code]
procedure TForm1.btnGravarClick(Sender: TObject);
begin
    DMForm.cdsNotas.First;
  while  not DMForm.cdsNotas.Eof do
  begin
    DMForm.cdsColeta.Open;
    DMForm.cdsColeta.Append;

    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;

    DMForm.cdsColeta.Post;
    DMForm.cdsNotas.Next;
  end;
end;
[code]

Só coloquei o Open que não havia, pois tinha dado um erro.
Ele continua não gravando. Percorre três vezes (a qtde de linhas preenchidas no DBGrid), mas não grava e nem da erro.
Responder

Gostei + 0

18/02/2011

Diego Cavalca

Está utilizando ibquery pra conexão com o banco?
Responder

Gostei + 0

18/02/2011

Elton Ésqui

Está utilizando ibquery pra conexão com o banco?


TSQLConnection
Responder

Gostei + 0

18/02/2011

Diego Cavalca

TSQLConnection ...


Foi mal, rsrs, perguntei errado,
costume ruim de programação aki da empresa, vou reformular minha pergunta, qual componente usa para conexão com as TABELAS do banco de dados? uma IBQuery?
Responder

Gostei + 0

18/02/2011

Elton Ésqui

TSQLConnection ...


Foi mal, rsrs, perguntei errado,
costume ruim de programação aki da empresa, vou reformular minha pergunta, qual componente usa para conexão com as TABELAS do banco de dados? uma IBQuery?


São eles:

TClientDataSet
TDataSetProvider
TSqlDataSet
Responder

Gostei + 0

18/02/2011

Marco Salles

Bem , ja pensei diferente 1) Ao informar o número no DBEdit e clicar em Incluir, vai incluir os dados (cdsOrigem) no DBGrid. Este numero é um Limitador ??? Se for ´w de Máximo ?? é de Mínimo ?? ou é de igualdade ??? Isto não seria um Filtro , onde o Numero que esta no DbEdit é que vai determinar o Filtro ???   Deve repetir essa operação acumulando os dados inseridos.
Acumular o que de que ( Acumular o Valor das Notas ou a quantidade de Notas ???? ou acumular um Outro campo ??? Somar ?? Contar ???
2) Ao clicar em gravar, todos os dados acumulados no DBGrid serão gravados no cdsDestino. No DbGrid não tem nada acumulado , ele apenas representa de forma visual os dados que são provenientes de algum DataSet   Porém para vc passar os Dados do CdOrigem para Outro CdDestino Isto é um exemplo caso classico do CloneCds (lembra CloneCds para os Intimos...), onde vc vai clonar os dados do CdsOrigem Filtrado para o cdsDestino O unico cuidado aqui é os paramentros que devem ser usados noCloneCursor Sem o Intuito de fazer mershandising ontem postei algo a respeito http://marcosalles.wordpress.com/2011/02/17/clonecursor-como-definir-os-parametros-reset-keepsettings/   Ressalto aqui , se é que entendi a sua dúvida . Porque a outra que vc tinha postado anteirormente estou sem entender ate agora ...
Responder

Gostei + 0

21/02/2011

Elton Ésqui

Bem , ja pensei diferente 1) Ao informar o número no DBEdit e clicar em Incluir, vai incluir os dados (cdsOrigem) no DBGrid. Este numero é um Limitador ??? Se for ´w de Máximo ?? é de Mínimo ?? ou é de igualdade ??? Isto não seria um Filtro , onde o Numero que esta no DbEdit é que vai determinar o Filtro ???   Deve repetir essa operação acumulando os dados inseridos.
Acumular o que de que ( Acumular o Valor das Notas ou a quantidade de Notas ???? ou acumular um Outro campo ??? Somar ?? Contar ???
2) Ao clicar em gravar, todos os dados acumulados no DBGrid serão gravados no cdsDestino. No DbGrid não tem nada acumulado , ele apenas representa de forma visual os dados que são provenientes de algum DataSet   Porém para vc passar os Dados do CdOrigem para Outro CdDestino Isto é um exemplo caso classico do CloneCds (lembra CloneCds para os Intimos...), onde vc vai clonar os dados do CdsOrigem Filtrado para o cdsDestino O unico cuidado aqui é os paramentros que devem ser usados noCloneCursor Sem o Intuito de fazer mershandising ontem postei algo a respeito http://marcosalles.wordpress.com/2011/02/17/clonecursor-como-definir-os-parametros-reset-keepsettings/   Ressalto aqui , se é que entendi a sua dúvida . Porque a outra que vc tinha postado anteirormente estou sem entender ate agora ...


A princípio deveria acumular a quantidade de notas.
Ex.: Nota 01, 05, 10, 18, 22 e etc.

Percebi que terei um problema se fizer assim, pois se eu digitar nota 100, por exemplo, ele traz resultados antigos e /ou duplicados, ou seja, notas que foram emitidas com o mesmo número. A não ser que eu fizesse um método para excluir as"indesejadas", mas para o usuário isso seria trabalhoso demais.
A saída foi passar o parâmetro por data, mas desta forma, terei que voltar ao problema do outro tópico :(, ou seja, carregar no DBGrid as notas de dd/mm/yyyy até dd/mm/yyyy e com o MultSelect ativo, selecionar as notas desejadas e grava-las na tabela destino. Still frynig.... :'(
Responder

Gostei + 0

21/02/2011

Elton Ésqui

Bem , ja pensei diferente 1) Ao informar o número no DBEdit e clicar em Incluir, vai incluir os dados (cdsOrigem) no DBGrid. Este numero é um Limitador ??? Se for ´w de Máximo ?? é de Mínimo ?? ou é de igualdade ??? Isto não seria um Filtro , onde o Numero que esta no DbEdit é que vai determinar o Filtro ???   Deve repetir essa operação acumulando os dados inseridos.
Acumular o que de que ( Acumular o Valor das Notas ou a quantidade de Notas ???? ou acumular um Outro campo ??? Somar ?? Contar ???
2) Ao clicar em gravar, todos os dados acumulados no DBGrid serão gravados no cdsDestino. No DbGrid não tem nada acumulado , ele apenas representa de forma visual os dados que são provenientes de algum DataSet   Porém para vc passar os Dados do CdOrigem para Outro CdDestino Isto é um exemplo caso classico do CloneCds (lembra CloneCds para os Intimos...), onde vc vai clonar os dados do CdsOrigem Filtrado para o cdsDestino O unico cuidado aqui é os paramentros que devem ser usados noCloneCursor Sem o Intuito de fazer mershandising ontem postei algo a respeito http://marcosalles.wordpress.com/2011/02/17/clonecursor-como-definir-os-parametros-reset-keepsettings/   Ressalto aqui , se é que entendi a sua dúvida . Porque a outra que vc tinha postado anteirormente estou sem entender ate agora ...


A princípio deveria acumular a quantidade de notas.
Ex.: Nota 01, 05, 10, 18, 22 e etc.

Percebi que terei um problema se fizer assim, pois se eu digitar nota 100, por exemplo, ele traz resultados antigos e /ou duplicados, ou seja, notas que foram emitidas com o mesmo número. A não ser que eu fizesse um método para excluir as"indesejadas", mas para o usuário isso seria trabalhoso demais.
A saída foi passar o parâmetro por data, mas desta forma, terei que voltar ao problema do outro tópico :(, ou seja, carregar no DBGrid as notas de dd/mm/yyyy até dd/mm/yyyy e com o MultSelect ativo, selecionar as notas desejadas e grava-las na tabela destino. Still frying.... :'(
Responder

Gostei + 0

21/02/2011

Diego Cavalca

Voltando ao assunto de não estar gravando, não seria porque voce está esquecendo de dar o ApplyUpdates no cds depois de gravar os dados (cds.Post), pois no 'post', é o armazenamento local do cds...

Enfim, qualquer coisa, boa sorte...
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar