Fórum Erro ao efetuar o Loop p/ um cadastro. #240005

27/06/2004

0

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

Responder

Posts

27/06/2004

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.



Responder

Gostei + 0

28/06/2004

Jose Luiz

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]


Responder

Gostei + 0

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

Aceitar