Ir para conteúdo
  • Cadastre-se

dev botao

ACBRAAC - Erro de arredondamento


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

Recommended Posts

Bom dia pessoal, testando aqui o componente AcbrAcc ao comparar o valor do GT da ECF e o GT do arquivo, usando a função:

ecf.DoVerificaValorGT;

mesmo os valores sendo iguais, a função retorna que há divergência no valor do grande total.

Valor do ECF....: 47,98

Valor do Arquivo: 47,98

Dei uma pesquisada na função RoundTo do delphi e achei isso:

A função Math.RoundTo do Delphi não faz o arredondamento correto de acordo com o modelo Bankers’s Rounding (diferente do que está no Help). Isso se deve por causa do uso interno de varáveis de tipo flutuante. Segue abaixo uma versão dessa função que trabalha somente com variáveis do tipo Currency e por isso funciona corretamente.

function RoundTo(const AValue: Currency; const ADigit: TRoundToRange): Currency;

var

LFactor: Extended;

rmOrig: TFPURoundingMode;

begin

LFactor := IntPower(10, ADigit);

Result := Round(AValue / LFactor) * LFactor;

rmOrig := GetRoundMode();

if rmOrig <> rmNearest then begin

SetRoundMode(rmNearest);

Result := Round(Result / LFactor) * LFactor;

SetRoundMode(rmOrig);

end;

end;

Link para o comentário
Compartilhar em outros sites

Boa tarde pessoal,

modifiquei o componente acbraac,

basicamente troquei:

if AECF.ValorGT <> RoundTo( ValorGT, -2 ) then

POR

if AECF.ValorGT <> ValorGT then

FUNÇÃO COMPLETA

function TACBrAAC.VerificarGTECF(const NumeroSerie : String ;

var ValorGT : Double) : Integer ;

// Retornos:

// 0 = Tudo OK

// -1 = NumSerie não encontrado

// -2 = GT não confere

var

AECF : TACBrAACECF ;

ValorGTNovo : Double ;

begin

Result := 0;

VerificaReCarregarArquivo;

AECF := AchaECF( NumeroSerie );

if not Assigned( AECF ) then

Result := -1

else

// if AECF.ValorGT <> RoundTo( ValorGT, -2 ) then

if AECF.ValorGT <> ValorGT then

begin

ValorGT := AECF.ValorGT;

Result := -2;

if Assigned( fsOnVerificarRecomporValorGT ) then

begin

ValorGTNovo := AECF.ValorGT;

fsOnVerificarRecomporValorGT( NumeroSerie, ValorGTNovo );

if ValorGTNovo <> AECF.ValorGT then

begin

AtualizarValorGT( NumeroSerie, ValorGTNovo );

Result := 0;

end ;

end ;

end ;

end ;

agora esta funcionando, não o que isso poderá causar em outros sistemas....

Favor avaliarem

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Estranho,

Pois na atribuição de AECF.ValorGT também há um RoundTo, ou seja a comparação deve ser idêntica ... a ideia é justamente evitar esse tipo de problema...

Como você está informando o valor para o método: VerificarGTECF ?

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

Daniel, estou usando:

ecf.DoVerificaValorGT;

Viu no inicio que na internet relataram um erro no roundTo do delphi?

Entendo... então nesse caso o problema é realmente interno....

Por favor faça um teste trocando todas as declarações de RoundTo para SimpleRoundTo

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

Que mal pegunte, esse componente serve para que?

O ACBrAAC, quando interligado com o componente ACBrECF e ACBrPAF cuida sozinho do Arquivo Auxiliar Criptografado (exigência do PAF-ECF)

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

  • 2 semanas depois ...

Daniel, estou usando:

ecf.DoVerificaValorGT;

Viu no inicio que na internet relataram um erro no roundTo do delphi?

Entendo... então nesse caso o problema é realmente interno....

Por favor faça um teste trocando todas as declarações de RoundTo para SimpleRoundTo

Desculpe a demora, o uso do SimpleRound resolveu o problema, ao menos por enquanto, vou fazer mais testes.

Obrigado

Link para o comentário
Compartilhar em outros sites

já vimos em otros tópicos q existe problemas no código

...

if AECF.ValorGT <> RoundTo( ValorGT, -2 ) then

...

do ACBrAAc.VerificarGTECF.

Tivemos d alterando para:

if RoundTo( AECF.ValorGT,-2) <> RoundTo( ValorGT, -2 ) then...

gostaríamos d sabr pq vcs não alteram d modo q possamos atualizar os compenetes e ñ percamos essa alteração, necessária p/ o correto funcionamento do mesmo!

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O ACBrAAC está sendo completamente re-estruturado...

infelizmente haverá quebra de compatibilidade, mas os benefícios compensam... Devo detalhar tudo no Change-Log.txt

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

  • Consultores

Viu no inicio que na internet relataram um erro no roundTo do delphi?

pode postar o site por favor?

Obrigado,

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Esqueci de avisar que o novo ACBrAAC já está no SVN...

-- ACBrAAC --

[*] Ampla reforma nas propriedades de Identificação da S.H. e PAF, que foram

substiuidas por tipos já existente no ABCrECF, mais completos e organizados

ACBrAAC1.SH_RazaoSocial -> ACBrAAC1.IdentPAF.Empresa.RazaoSocial

ACBrAAC1.SH_CNPJ -> ACBrAAC1.IdentPAF.Empresa.CNPJ

ACBrAAC1.SH_IM -> ACBrAAC1.IdentPAF.Empresa.IM

ACBrAAC1.SH_IE -> ACBrAAC1.IdentPAF.Empresa.IE

ACBrAAC1.PAF_Nome -> ACBrAAC1.IdentPAF.Paf.Nome

ACBrAAC1.PAF_Versao -> ACBrAAC1.IdentPAF.Paf.Versao

ACBrAAC1.PAF_MD5 -> ACBrAAC1.IdentPAF.ArquivoListaAutenticados.MD5

Nota: Apesar da modificação os arquivos AAC gerados continuam compatíveis.

[*] Melhor integrado com ACBrPAF. Quando inteligados o ACBrAAC irá fazer a

"alimentação" do componente ACBrPAF.PAF_N. Ou seja, preencha corretamente o

ACBrAAC e apenas chame:

ACBrPAF.SaveFileTXT_N( NomeArquivo );

[*] Melhor integrado com o ACBrECF. Quando interligados o ACBrECF usará as

informações do ACBrAAC no método: ACBrECF.PafMF_RelIdentificacaoPafECF.

dispensando o envio de parâmetros no método.

  • Curtir 1
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

  • Consultores

Puxa. Muito bom! Excelente notícia.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 4704 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.

The popup will be closed in 10 segundos...