Jump to content

dev botao

Falha de arredondamento na função RoundABNT


  • Este tópico foi criado há 3125 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Uso o ecfvirtual para gerar NFC-e e SAT com o delphi 7.

Ao aplicar um desconto de por exemplo R$ 2,00 na venda de um item é enviado pela procedure   TACBrECFVirtualClassCupom.DescAresItem(NumItem: Integer; ADescAcres: Double

O desconto de 2 reais é passado como -2 para a função  RoundABNT que retorna o valor de -1,99 e não -2 que é esperado. 

Passar número negativo para para  função RoundABNT pode retornar erro enquanto números positivos funcionam normal.

Abaixo alteração que resolveu o problema pontualmente.

--- ACBrECFVirtual.pas    (revision 11135)
+++ ACBrECFVirtual.pas    (working copy)
@@ -1016,8 +1016,14 @@
   if ItemCupom.DescAcres <> 0 then
     raise EACBrECFERRO.create(ACBrStr('Item ('+IntToStrZero(NumItem,3)+') já recebeu Desconto ou Acrescimo.')) ;
 
+  if ADescAcres < 0 then
+     ADescAcres := ADescAcres * -1;
+
   ItemCupom.DescAcres := RoundABNT( ADescAcres, -2);
 
+  if ADescAcres > 0 then
+     ADescAcres := ADescAcres * -1;
+
   fpSubTotal := fpSubTotal + ItemCupom.DescAcres;  // Atualiza SubTotal Cupom
 end;
 
 

Link to comment
Share on other sites

--- ACBrECFVirtual.pas    (revision 11135)
+++ ACBrECFVirtual.pas    (working copy)
@@ -1008,6 +1008,7 @@
   );
 var
   ItemCupom: TACBrECFVirtualClassItemCupom;
+  Desconto : Boolean;
 begin
   VerificaFaixaItem(NumItem);
 
@@ -1016,9 +1017,15 @@
   if ItemCupom.DescAcres <> 0 then
     raise EACBrECFERRO.create(ACBrStr('Item ('+IntToStrZero(NumItem,3)+') já recebeu Desconto ou Acrescimo.')) ;
 
+  if ADescAcres < 0 then
+  begin
+     Desconto   := True;
+     ADescAcres := ADescAcres * -1;
+  end;
+
   ItemCupom.DescAcres := RoundABNT( ADescAcres, -2);
 
-  fpSubTotal := fpSubTotal + ItemCupom.DescAcres;  // Atualiza SubTotal Cupom
+  fpSubTotal := fpSubTotal + (ItemCupom.DescAcres * IfThen(Desconto, -1, 1));  // Atualiza SubTotal Cupom
 end;
 
 procedure TACBrECFVirtualClassCupom.CancelaItem(NumItem: Integer);

ACBrECFVirtual.pas

Link to comment
Share on other sites

  • Fundadores

Não acho que a implementação seja correta, a rotina espera que o valor de "ItemCupom.DescAcres" contenha sinal (loops com a soma pode dar errado)

Não consegui reproduzir o problema que você alega... usando o FPCUnitTeste da ACBrComum, adicionei os testes abaixo:

procedure RoundABNTTest.ValoresNegativos;
var
  AVal: Double;
begin
  AVal := -2;
  CheckEquals( AVal, RoundABNT(AVal, 0) );
  CheckEquals( AVal, RoundABNT(AVal, -1) );
  CheckEquals( AVal, RoundABNT(AVal, -2) );
end;    

... e tudo funcionou a contento...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

Pois é...

Também achei a implementação errada mas tive que faze-la para resolver este problema.

Fiz o teste que você colocou com 2:   -1, -0,9, -0,89

já com o valor positivo -2 -> -2, -2, -2

Vou testar com o Lazarus amanhã para ver o que acontece.

Link to comment
Share on other sites

Pssss decepcionante este compilador do delphi 7....

O FPC do lazarus funcionou 100%

 

Analisando o restante dos casos de uso da função RoundABNT no fonte ACBR me arrisco a dizer que é o único lugar onde a função pode receber um argumento com valor negativo é nesta classe ACBrECFVirtual.

Estaremos migrando o sistema em breve pro Delphi Seatle ai espero que estes casos minimizem.

Obrigado.

Link to comment
Share on other sites

  • Fundadores

Tenho um D7 aqui... Vou tentar nele...

Um workaround, seria mudar o valor para positivo, arredondar e depois voltar ele pra negativo... e só então, somar nos fields da classe 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Fundadores

Apliquei algumas modificações na ACBrUtil, que devem resolver o problema...

Também está disponível um novo Projeto para Delphi, para UnitTeste da ACBrComum

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Este tópico foi criado há 3125 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.