Vai para o próximo registro sem dar NEXT...é possivel??
Colegas,
Estou trabalhando com DELPHI7/IB6/DBX/CLIENTDATASET(CDS).
Mas está acontecendo uma coisa inesperada em meu programa. Trabalho com dois CDS´s.
Acontece que numa rotina de While, o registro do 2.o CDS pula para o proximo sem a instrução NEXT.
Isto é possível ?? eu não tenho relacionamento de índices.
Como o registro pode pular para o próximo sem NEXT. Eu usei o DEBUG várias vezes e verifiquei que isso ocorre.
Alguem já viu isso ??
Sou novato no Interbase. Eu trabalhava com PARADOX.
Obrigado,
Airton
PS: Abaixo está a rotina onde o evento ocorre. O registro do CDSProd pula sem que eu passe pela instrução de NEXT. Eu percebi que, quando o registro do 2.o CDS (MovEst) pula, porque eu dei NEXT, o registro do 1.o CDS pula automáticamente. E isto não poderia acontecer.
// calcula preço medio de compra - ENTRADA
dm.CDSProd.First;
while dm.CDSProd.eof = false do // while Prod
begin
dm.CDSMovEst.FindKey([dm.CDSProdCODIGO.AsString]);
if dm.CDSProdCODIGO.AsString <> dm.CDSMovEstCODIGOPROD.AsString then // nao tem movimento
begin
progressbar1.position:=progressbar1.Position + 1;
dm.CDSProd.Next;
end else // achou movimento
begin
while (dm.CDSProdCODIGO.AsString = dm.CDSMovEstCODIGOPROD.AsString) and
(dm.CDSMovEst.eof = false) do // while MovEst
begin
if (dm.CDSMovEstTIPOOPERACAO.AsString = ´ENTRADA´) and
(dm.CDSMovEstPRECOUNIT.ascurrency <> 0) then
begin
wValor := wValor + (dm.CDSMovEstQtdeUM.asfloat * dm.CDSMovEstPRECOUNIT.asfloat);
wQtde := wQtde + dm.CDSMovEstQtdeUM.asfloat;
end;
dm.CDSMovEst.Next;
end; // fim do while MovEst
if wQtde <> 0 then
begin
dm.CDSProd.Edit;
dm.CDSProdPRMEDCOMPRA.ascurrency := wValor / wQtde;
dm.CDSProd.Post;
dm.cdsprod.applyupdates(-1);
end else
begin
dm.CDSProd.Edit;
dm.CDSProdPRMEDCOMPRA.ascurrency := 0;
dm.CDSProd.Post;
dm.cdsprod.applyupdates(-1);
end;
progressbar1.position:=progressbar1.Position + 1;
dm.CDSProd.Next;
wValor := 0;
wQtde := 0;
end;
end; // fim do while Prod
Estou trabalhando com DELPHI7/IB6/DBX/CLIENTDATASET(CDS).
Mas está acontecendo uma coisa inesperada em meu programa. Trabalho com dois CDS´s.
Acontece que numa rotina de While, o registro do 2.o CDS pula para o proximo sem a instrução NEXT.
Isto é possível ?? eu não tenho relacionamento de índices.
Como o registro pode pular para o próximo sem NEXT. Eu usei o DEBUG várias vezes e verifiquei que isso ocorre.
Alguem já viu isso ??
Sou novato no Interbase. Eu trabalhava com PARADOX.
Obrigado,
Airton
PS: Abaixo está a rotina onde o evento ocorre. O registro do CDSProd pula sem que eu passe pela instrução de NEXT. Eu percebi que, quando o registro do 2.o CDS (MovEst) pula, porque eu dei NEXT, o registro do 1.o CDS pula automáticamente. E isto não poderia acontecer.
// calcula preço medio de compra - ENTRADA
dm.CDSProd.First;
while dm.CDSProd.eof = false do // while Prod
begin
dm.CDSMovEst.FindKey([dm.CDSProdCODIGO.AsString]);
if dm.CDSProdCODIGO.AsString <> dm.CDSMovEstCODIGOPROD.AsString then // nao tem movimento
begin
progressbar1.position:=progressbar1.Position + 1;
dm.CDSProd.Next;
end else // achou movimento
begin
while (dm.CDSProdCODIGO.AsString = dm.CDSMovEstCODIGOPROD.AsString) and
(dm.CDSMovEst.eof = false) do // while MovEst
begin
if (dm.CDSMovEstTIPOOPERACAO.AsString = ´ENTRADA´) and
(dm.CDSMovEstPRECOUNIT.ascurrency <> 0) then
begin
wValor := wValor + (dm.CDSMovEstQtdeUM.asfloat * dm.CDSMovEstPRECOUNIT.asfloat);
wQtde := wQtde + dm.CDSMovEstQtdeUM.asfloat;
end;
dm.CDSMovEst.Next;
end; // fim do while MovEst
if wQtde <> 0 then
begin
dm.CDSProd.Edit;
dm.CDSProdPRMEDCOMPRA.ascurrency := wValor / wQtde;
dm.CDSProd.Post;
dm.cdsprod.applyupdates(-1);
end else
begin
dm.CDSProd.Edit;
dm.CDSProdPRMEDCOMPRA.ascurrency := 0;
dm.CDSProd.Post;
dm.cdsprod.applyupdates(-1);
end;
progressbar1.position:=progressbar1.Position + 1;
dm.CDSProd.Next;
wValor := 0;
wQtde := 0;
end;
end; // fim do while Prod
Airton Santos
Curtidas 0
Respostas
Afarias
24/03/2004
ClientDataSets não tem a ver com o Interbase (ou qualquer outro banco, pois são apenas tabelas de memória)
Não acredito q isso ocorra normalmente no CDS, vc poderia dizer em q momento no código postado ocorre a ´mudança´ de registro??
T+
Não acredito q isso ocorra normalmente no CDS, vc poderia dizer em q momento no código postado ocorre a ´mudança´ de registro??
T+
GOSTEI 0
Airton Santos
24/03/2004
A. Farias,
Eu tenho a Tabela base que é a PROD e a de movimento que é a MOVEST.
Eu mantenho a tabela base PROD fixa em um registro e fico comparando o codigo de produto com a de movimento MOVEST. Enquanto forem iguais eu faço 2 somas e dou NEXT na de movimento MOVEST. Eu verifiquei pelo DEBUG que no momento em que o codigo de produto da tabela de movimento muda, imediatamente a tabela base muda tambem, mas a tabela base não recebeu next.
É aí que eu fico confuso, pois pelo DEBUG eu vi que não passei por nenhum next para a tabela base.
Eu tenho a Tabela base que é a PROD e a de movimento que é a MOVEST.
Eu mantenho a tabela base PROD fixa em um registro e fico comparando o codigo de produto com a de movimento MOVEST. Enquanto forem iguais eu faço 2 somas e dou NEXT na de movimento MOVEST. Eu verifiquei pelo DEBUG que no momento em que o codigo de produto da tabela de movimento muda, imediatamente a tabela base muda tambem, mas a tabela base não recebeu next.
É aí que eu fico confuso, pois pelo DEBUG eu vi que não passei por nenhum next para a tabela base.
GOSTEI 0
Gandalf.nho
24/03/2004
As tabelas não estão vinculadas entre si? Se estão, no momento que o registro da tabela pai muda, a tabela filha muda pra acompanhar.
GOSTEI 0
Airton Santos
24/03/2004
Caro Gandalf,
É exatamente isso !!. Parece que estão vinculadas, pois o codigo de produto é chave no MOVEST (codigo produto+data+hora) e é chave no PROD (codigo de produto). Quando o codigo do produto do MOVEST muda por causa do NEXT, imediatamente muda no PROD. Parece que estão realmente vinculadas. Mas eu não sei nem como se vincula. Eu simplesmente criei as tabelas e acesso a MOVEST com FINDKEY com o codigo do produto da PROD.
Será que o FINDKEY vincula automaticamente ?? (Desculpe a pergunta).
Eu percebo pelo DEBUG que exatamente no momento em que dou NEXT na tabela MOVEST e muda o codigo de produto nela, imediatamente muda o registro na tabela PROD. E não era pra acontecer isso.
É que eu sou novato no interbase e estou apanhando com essas coisas.
Obrigado,
Airton
É exatamente isso !!. Parece que estão vinculadas, pois o codigo de produto é chave no MOVEST (codigo produto+data+hora) e é chave no PROD (codigo de produto). Quando o codigo do produto do MOVEST muda por causa do NEXT, imediatamente muda no PROD. Parece que estão realmente vinculadas. Mas eu não sei nem como se vincula. Eu simplesmente criei as tabelas e acesso a MOVEST com FINDKEY com o codigo do produto da PROD.
Será que o FINDKEY vincula automaticamente ?? (Desculpe a pergunta).
Eu percebo pelo DEBUG que exatamente no momento em que dou NEXT na tabela MOVEST e muda o codigo de produto nela, imediatamente muda o registro na tabela PROD. E não era pra acontecer isso.
É que eu sou novato no interbase e estou apanhando com essas coisas.
Obrigado,
Airton
GOSTEI 0
Gandalf.nho
24/03/2004
A propriedade MasterSource do ClientDataSet filho está setada apontando para a tabela pai?
GOSTEI 0
Airton Santos
24/03/2004
Não, infelizmente não está setada.
É muito estranho,
Airton :(
É muito estranho,
Airton :(
GOSTEI 0