Ir para conteúdo
  • Cadastre-se

dev botao

Falha de arredondamento na função RoundABNT


  • Este tópico foi criado há 3004 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.