GARANTIR DESCONTO

Fórum Entrando em Loop Infinito - a 1ª vista está correto #333537

23/11/2006

0

Tenho esse trecho de código onde está entrando em Loop Infinito, a primeira vista está tudo correto, qndo a minha tabela tem apenas um produto ele faz corretamente esse trecho, porém se acrescento mais de um produto ele entra em um loop. Como posso resolver isso?


procedure TFCadPedido.DBRG4Click(Sender: TObject);
begin
    DMDados.TCadPedido2.First;
    while not DMDados.TCadPedido2.Eof do
    begin
        if DBRG4.ItemIndex = 0 then
        begin
            DMDados.TCadPedido.Edit;
            DMDados.TCadPedidoTipoPreco.Value := ´V´;

            DMDados.TCadPedido2.Edit;
            if IsProdPromocao( DMDados.TCadPedido2Cod_Prod.Value ) then
               DMDados.TCadPedido2VlrUnit.Value := ValorPromocao( DMDados.TCadPedido2Cod_Prod.Value )
            else
               DMDados.TCadPedido2VlrUnit.Value := ValorVista( DMDados.TCadPedido2Cod_Prod.Value );
        end
        else if DBRG4.ItemIndex = 1 then
        begin
            DMDados.TCadPedido.Edit;
            DMDados.TCadPedidoTipoPreco.Value := ´P´;

            DMDados.TCadPedido2.Edit;
            if IsProdPromocao( DMDados.TCadPedido2Cod_Prod.Value ) then
               DMDados.TCadPedido2VlrUnit.Value := ValorPromocao( DMDados.TCadPedido2Cod_Prod.Value )
            else
               DMDados.TCadPedido2VlrUnit.Value := ValorPrazo( DMDados.TCadPedido2Cod_Prod.Value );
        end;
        DMDados.TCadPedido2.Next;
    end;
end;



Desde já agradeço a atenção


Facc

Facc

Responder

Posts

23/11/2006

Facc

Esqueci... é D7, Firebird, Componentes BDE

outra coisa... ele fica preso no ultimo registro, como se o [b:06d6367531]NEXT[/b:06d6367531] não estivesse funcionando.


Responder

Gostei + 0

23/11/2006

Titanius

à Primeira vista está correto, você não possui nenhum evento no OnCalcFields ?

[]s


Responder

Gostei + 0

23/11/2006

Facc

à Primeira vista está correto, você não possui nenhum evento no OnCalcFields ? []s



Tem sim... Como posso resolver?


Responder

Gostei + 0

23/11/2006

Titanius

Então é isso...

Com certeza, lá no onCalc vc deve estar dando um edit, ou um while, correto?

Se for, voce cria um variavel booleana global na unit, e quando vc for dar o while mostrado aqui, vc seta tal variavel como True.

No OnCalcField, vc poe no inicio de tudo um

if VARIAVEL then Exit;

assim, quando ele estiver no while ele nao processa o OnCalc...


[]s


Responder

Gostei + 0

23/11/2006

Facc

Então é isso... Com certeza, lá no onCalc vc deve estar dando um edit, ou um while, correto? Se for, voce cria um variavel booleana global na unit, e quando vc for dar o while mostrado aqui, vc seta tal variavel como True. No OnCalcField, vc poe no inicio de tudo um if VARIAVEL then Exit; assim, quando ele estiver no while ele nao processa o OnCalc... []s



Olhe o código que está no OnCalc...
procedure TDMDados.TCadPedido2CalcFields(DataSet: TDataSet);
begin
  if FPrincipal.bAcertaPreco then // a Variavel Global tipo boolean
    exit;
    if DMDados.TCadConfigCadMoeda.Value=´S´ then // usa moedas
    begin
         if (TCadPedido2MoedaProd.Value = TCadPedidoMoeda.Value) then // moeda do produto = a da venda
            TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value
         else if (TCadPedido2MoedaProd.Value <> TCadPedidoMoeda.Value) then
         begin
              if (DMDados.TCadConfigMoedaPad.Value=TCadPedidoMoeda.Value) and (TCadPedido2MoedaProd.Value<>TCadPedidoMoeda.Value) then
                 TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value*TCadPedido2VlrCotacao.Value
              else if (DMDados.TCadConfigMoedaPad.Value=TCadPedidoMoeda.Value) and (TCadPedido2MoedaProd.Value=TCadPedidoMoeda.Value) then
                 TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value
              else
              begin
                 if (TCadPedido2VlrCotacao.Value = 0) or  (TCadPedido2VlrCotacao.AsString = ´´) then
                    TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value
                 else
                    TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value/TCadPedido2VlrCotacao.Value;
              end;
         end
         else
             TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value;

         TCadPedido2VrUnitCalc.Value:=(TCadPedido2VlrConvertido_Calc.Value-(TCadPedido2VlrConvertido_Calc.Value*(TCadPedido2Desconto.Value*0.01)));
         TCadPedido2VlrTotal_Calc.Value:=(TCadPedido2VrUnitCalc.Value*TCadPedido2Qtde.Value);
    end
    else
    begin
         TCadPedido2VrUnitCalc.Value:=(TCadPedido2VlrUnit.Value-(TCadPedido2VlrUnit.Value*(TCadPedido2Desconto.Value*0.01)));
         TCadPedido2VlrTotal_Calc.Value:=(TCadPedido2VrUnitCalc.Value*TCadPedido2Qtde.Value);
    end;

end;



Responder

Gostei + 0

23/11/2006

Facc

[quote:dd2cc67912=´titanius´]Então é isso... Com certeza, lá no onCalc vc deve estar dando um edit, ou um while, correto? Se for, voce cria um variavel booleana global na unit, e quando vc for dar o while mostrado aqui, vc seta tal variavel como True. No OnCalcField, vc poe no inicio de tudo um if VARIAVEL then Exit; assim, quando ele estiver no while ele nao processa o OnCalc... []s



Olhe o código que está no OnCalc...
procedure TDMDados.TCadPedido2CalcFields(DataSet: TDataSet);
begin
  if FPrincipal.bAcertaPreco then // a Variavel Global tipo boolean
    exit;
    if DMDados.TCadConfigCadMoeda.Value=´S´ then // usa moedas
    begin
         if (TCadPedido2MoedaProd.Value = TCadPedidoMoeda.Value) then // moeda do produto = a da venda
            TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value
         else if (TCadPedido2MoedaProd.Value <> TCadPedidoMoeda.Value) then
         begin
              if (DMDados.TCadConfigMoedaPad.Value=TCadPedidoMoeda.Value) and (TCadPedido2MoedaProd.Value<>TCadPedidoMoeda.Value) then
                 TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value*TCadPedido2VlrCotacao.Value
              else if (DMDados.TCadConfigMoedaPad.Value=TCadPedidoMoeda.Value) and (TCadPedido2MoedaProd.Value=TCadPedidoMoeda.Value) then
                 TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value
              else
              begin
                 if (TCadPedido2VlrCotacao.Value = 0) or  (TCadPedido2VlrCotacao.AsString = ´´) then
                    TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value
                 else
                    TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value/TCadPedido2VlrCotacao.Value;
              end;
         end
         else
             TCadPedido2VlrConvertido_Calc.Value:=TCadPedido2VlrUnit.Value;

         TCadPedido2VrUnitCalc.Value:=(TCadPedido2VlrConvertido_Calc.Value-(TCadPedido2VlrConvertido_Calc.Value*(TCadPedido2Desconto.Value*0.01)));
         TCadPedido2VlrTotal_Calc.Value:=(TCadPedido2VrUnitCalc.Value*TCadPedido2Qtde.Value);
    end
    else
    begin
         TCadPedido2VrUnitCalc.Value:=(TCadPedido2VlrUnit.Value-(TCadPedido2VlrUnit.Value*(TCadPedido2Desconto.Value*0.01)));
         TCadPedido2VlrTotal_Calc.Value:=(TCadPedido2VrUnitCalc.Value*TCadPedido2Qtde.Value);
    end;

end;
[/quote:dd2cc67912]

Verifiquei ele está ficando preso no ultimo produto da tela. O Next não dá a impressão que não está funcionando...
Por favor... é urgente....
Muito obrigado


Responder

Gostei + 0

23/11/2006

Facc

sobe


Responder

Gostei + 0

27/11/2006

Emerson Nascimento

vc conseguiu resolver?


Responder

Gostei + 0

27/11/2006

Facc

vc conseguiu resolver?


Consegui sim...

O Erro estava no after post. Resolvi verificando uma condição, se verdadeira, não faz os procedimentos no afterpost. caso contrario, executa normal


Responder

Gostei + 0

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

Aceitar