Erro ao efetuar o Loop p/ um cadastro.

Delphi

27/06/2004

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.

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

Jose Luiz

Curtidas 0

Respostas

Aroldo Zanela

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:

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

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:

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.
[/quote:03132b4789]


GOSTEI 0
POSTAR