Erro ao efetuar o Loop p/ um cadastro.
TENHO UM CADASTRO DE ENTRADA DE PRODUTOS, LIGADA NUM DBGRID VOU ENTRANDO COM OS PRODUTOS QUE DESEJO, E DEPOIS AO CLICAR NUM BOTÃO RODO O LOOP DESCRITO ABAIXO. SÓ QUE TÁ ENTRANDO AOS POUCOS COM OS PRODUTOS NO ESTOQUE, DE VEZ DE ENTRAR DE UMA SÓ VEZ.ELE ENTRA DE DOIS EM DOIS PRODUTOS NÃO CONSIGO ACHAR ONDE ERREI.
GRATO: JOSE LUIZ
:arrow: [color=red:855c26d4e6]Título alterado pelo Moderador oTTo.[/color:855c26d4e6]
:arrow: [color=red:855c26d4e6]Evite usar caixa alta no título.[/color:855c26d4e6]
:arrow: [color=red:855c26d4e6]Usado BBCode pra facilitar a leitura.[/color:855c26d4e6]
:idea: [color=blue:855c26d4e6]Leia as regras de conduta do fórum[/color:855c26d4e6]
procedure TFrmEntraProd.SpeedButton1Click(Sender: TObject); Var conta,item:Integer; begin conta:=0; item:=QProd.RecordCount; if (QProd.recordcount <> 0)then begin QProd.First; if Application.MessageBox(´Deseja Realmente entrar com estes produtos em seu estoque?´,´Produtos ´,MB_YESNO+MB_ICONQUESTION)=ID_YES then While not QProd.Eof do begin tbProd.FindNearest([QProd.FieldByName(´CodProd´).AsInteger]); gauge.Progress:=conta; tbProd.edit; QProd.edit; tbProd.Fieldbyname(´CM_QNTEST´).Value:=tbProd.fieldbyname(´CM_QNTEST´).value+QProd.Fieldbyname(´qtde´).value; QProd.FieldByName(´Baixou´).value:=´S´; tbProd.Fieldbyname(´CM_PERCVE´).value:=QProd.Fieldbyname(´ETIQ´).Value; tbProd.Fieldbyname(´CM_PCUSTO´).value:=QProd.Fieldbyname(´CustoRDia´).Value; tbProd.FieldByName(´CM_CUSTOBRT´).value:=tbProdCM_PCUSTO.value*(100 + tbProdCM_PERC.value)/100; tbProd.Fieldbyname(´CM_PVENDA´).value:=(tbProd.Fieldbyname(´CM_CUSTOBRT´).Value*(100+tbprod.fieldbyname(´CM_PERCVE´).value)/100); tbProd.Fieldbyname(´CM_DATENT´).value:=DATE; tbProd.Post; QProd.Post; gauge.Progress:=conta+1*100; item:=item+1; QProd.Next; end; //end; ShowMessage(´Foi alterado em seu estoque ´+IntToStr(item)+´ Produtos!!´); gauge.Progress:=0; DMDados.tbEntraProd.Refresh; //DBGrid1.Enabled:=false; //QProd.close; end; end;
GRATO: JOSE LUIZ
:arrow: [color=red:855c26d4e6]Título alterado pelo Moderador oTTo.[/color:855c26d4e6]
:arrow: [color=red:855c26d4e6]Evite usar caixa alta no título.[/color:855c26d4e6]
:arrow: [color=red:855c26d4e6]Usado BBCode pra facilitar a leitura.[/color:855c26d4e6]
:idea: [color=blue:855c26d4e6]Leia as regras de conduta do fórum[/color:855c26d4e6]
Jose Luiz
Curtidas 0
Respostas
Aroldo Zanela
27/06/2004
Colega,
Fiz algumas alterações no seu código para tentar entender o problema e percebi duas ´coisas´ que podem estar contribuindo para o erro:
1. Não utilize FindNearest nestes casos, pois não faz uma pesquisa exata (substituir por, Findkey, Locate, select, etc);
2. Não faça edições na query que está sendo utilizada para o laço, pois pode causar conflitos, ou seja, utilize outra query para atualizar os dados no final da transação.
Como não sei o conteúdo/descrição da query, fiz algumas mudanças para sua análise:
Fiz algumas alterações no seu código para tentar entender o problema e percebi duas ´coisas´ que podem estar contribuindo para o erro:
1. Não utilize FindNearest nestes casos, pois não faz uma pesquisa exata (substituir por, Findkey, Locate, select, etc);
2. Não faça edições na query que está sendo utilizada para o laço, pois pode causar conflitos, ou seja, utilize outra query para atualizar os dados no final da transação.
Como não sei o conteúdo/descrição da query, fiz algumas mudanças para sua análise:
Var conta,item:Integer; begin conta:=0; item:=QProd.RecordCount; if QProd.recordcount = 0 then exit; QProd.First; if Application.MessageBox(´Deseja Realmente entrar com estes produtos em seu estoque?´,´Produtos ´,MB_YESNO+MB_ICONQUESTION)<> ID_YES then exit; While not QProd.Eof do begin if tbProd.FindKey([QProd.FieldByName(´CodProd´).AsInteger]) then begin tbProd.edit; tbProd.Fieldbyname(´CM_QNTEST´).Value:= tbProd.fieldbyname(´CM_QNTEST´).value+QProd.Fieldbyname(´qtde´).value; tbProd.Fieldbyname(´CM_PERCVE´).value:= QProd.Fieldbyname(´ETIQ´).Value; tbProd.Fieldbyname(´CM_PCUSTO´).value:= QProd.Fieldbyname(´CustoRDia´).Value; tbProd.FieldByName(´CM_CUSTOBRT´).value:= tbProdCM_PCUSTO.value*(100 + tbProdCM_PERC.value)/100; tbProd.Fieldbyname(´CM_PVENDA´).value:= (tbProd.Fieldbyname(´CM_CUSTOBRT´).Value*(100+tbprod.fieldbyname(´CM_PERCVE´).value)/100); tbProd.Fieldbyname(´CM_DATENT´).value:= DATE; tbProd.Post; end; QProd.Next; end; ShowMessage(´Foi(ram) alterado(s) em seu estoque ´+IntToStr(item)+´ Produto(s)!!´); end.
GOSTEI 0
Jose Luiz
27/06/2004
Colega..
Obrigado pela força, deu certinho era o TQuery que tava pipocando o loop aqui, coloquei um ttbale e deu certo..
Jose Luiz
[quote:03132b4789=´Aroldo Zanela´]Colega,
Fiz algumas alterações no seu código para tentar entender o problema e percebi duas ´coisas´ que podem estar contribuindo para o erro:
1. Não utilize FindNearest nestes casos, pois não faz uma pesquisa exata (substituir por, Findkey, Locate, select, etc);
2. Não faça edições na query que está sendo utilizada para o laço, pois pode causar conflitos, ou seja, utilize outra query para atualizar os dados no final da transação.
Como não sei o conteúdo/descrição da query, fiz algumas mudanças para sua análise:
[/quote:03132b4789]
Obrigado pela força, deu certinho era o TQuery que tava pipocando o loop aqui, coloquei um ttbale e deu certo..
Jose Luiz
[quote:03132b4789=´Aroldo Zanela´]Colega,
Fiz algumas alterações no seu código para tentar entender o problema e percebi duas ´coisas´ que podem estar contribuindo para o erro:
1. Não utilize FindNearest nestes casos, pois não faz uma pesquisa exata (substituir por, Findkey, Locate, select, etc);
2. Não faça edições na query que está sendo utilizada para o laço, pois pode causar conflitos, ou seja, utilize outra query para atualizar os dados no final da transação.
Como não sei o conteúdo/descrição da query, fiz algumas mudanças para sua análise:
Var conta,item:Integer; begin conta:=0; item:=QProd.RecordCount; if QProd.recordcount = 0 then exit; QProd.First; if Application.MessageBox(´Deseja Realmente entrar com estes produtos em seu estoque?´,´Produtos ´,MB_YESNO+MB_ICONQUESTION)<> ID_YES then exit; While not QProd.Eof do begin if tbProd.FindKey([QProd.FieldByName(´CodProd´).AsInteger]) then begin tbProd.edit; tbProd.Fieldbyname(´CM_QNTEST´).Value:= tbProd.fieldbyname(´CM_QNTEST´).value+QProd.Fieldbyname(´qtde´).value; tbProd.Fieldbyname(´CM_PERCVE´).value:= QProd.Fieldbyname(´ETIQ´).Value; tbProd.Fieldbyname(´CM_PCUSTO´).value:= QProd.Fieldbyname(´CustoRDia´).Value; tbProd.FieldByName(´CM_CUSTOBRT´).value:= tbProdCM_PCUSTO.value*(100 + tbProdCM_PERC.value)/100; tbProd.Fieldbyname(´CM_PVENDA´).value:= (tbProd.Fieldbyname(´CM_CUSTOBRT´).Value*(100+tbprod.fieldbyname(´CM_PERCVE´).value)/100); tbProd.Fieldbyname(´CM_DATENT´).value:= DATE; tbProd.Post; end; QProd.Next; end; ShowMessage(´Foi(ram) alterado(s) em seu estoque ´+IntToStr(item)+´ Produto(s)!!´); end.
GOSTEI 0