Entrando em Loop Infinito - a 1ª vista está correto
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?
Desde já agradeço a atenção
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
Curtidas 0
Respostas
Facc
23/11/2006
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.
outra coisa... ele fica preso no ultimo registro, como se o [b:06d6367531]NEXT[/b:06d6367531] não estivesse funcionando.
GOSTEI 0
Titanius
23/11/2006
à Primeira vista está correto, você não possui nenhum evento no OnCalcFields ?
[]s
[]s
GOSTEI 0
Facc
23/11/2006
à Primeira vista está correto, você não possui nenhum evento no OnCalcFields ?
[]s
Tem sim... Como posso resolver?
GOSTEI 0
Titanius
23/11/2006
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
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
GOSTEI 0
Facc
23/11/2006
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;
GOSTEI 0
Facc
23/11/2006
[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;
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
GOSTEI 0
Facc
23/11/2006
sobe
GOSTEI 0
Emerson Nascimento
23/11/2006
vc conseguiu resolver?
GOSTEI 0
Facc
23/11/2006
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
GOSTEI 0