Inclusão DBGrid
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. :(
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
Curtidas 0
Respostas
Rogerio
18/02/2011
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?
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?
GOSTEI 0
Elton Ésqui
18/02/2011
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!
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!
GOSTEI 0
Rogerio
18/02/2011
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!
GOSTEI 0
Rogerio
18/02/2011
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:
Obrigado!
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Insert;
ClientDataSet1.FieldByName('codigo').AsInteger := StrToInt(Edit1.Text);
ClientDataSet1.FieldByName('nome').AsString := Edit2.Text;
ClientDataSet1.Post;
end;GOSTEI 0
Diego Cavalca
18/02/2011
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...
GOSTEI 0
Elton Ésqui
18/02/2011
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.
GOSTEI 0
Elton Ésqui
18/02/2011
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.
GOSTEI 0
Diego Cavalca
18/02/2011
Está utilizando ibquery pra conexão com o banco?
GOSTEI 0
Elton Ésqui
18/02/2011
Está utilizando ibquery pra conexão com o banco?
TSQLConnection
GOSTEI 0
Diego Cavalca
18/02/2011
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?
GOSTEI 0
Elton Ésqui
18/02/2011
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
GOSTEI 0
Marco Salles
18/02/2011
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 ...
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 ...
GOSTEI 0
Elton Ésqui
18/02/2011
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 ...
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.... :'(
GOSTEI 0
Elton Ésqui
18/02/2011
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 ...
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.... :'(
GOSTEI 0
Diego Cavalca
18/02/2011
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...
Enfim, qualquer coisa, boa sorte...
GOSTEI 0
Elton Ésqui
18/02/2011
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...
Enfim, qualquer coisa, boa sorte...
Seria isso o meu Apply? Está assim:
procedure TDMForm.cdsColetaAfterPost(DataSet: TDataSet); begin try sqlConexaoADM.CloseDataSets; (DataSet as TClientDataSet).ApplyUpdates(-1); except on e: exception do begin ShowMessage(e.message); Exit; end; end; end;
GOSTEI 0
Elton Ésqui
18/02/2011
Tchurma...Resolvi fazer com seleção...Dúvida de outro tópico que estava aberto.
Obrigado!
Obrigado!
GOSTEI 0