Ir para conteúdo
  • Cadastre-se

dev botao

CNF finalizando com 1 centavo a mais


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 2353 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Estou com um problema bem estranho ao fazer um CNF, ocorre assim:

Ao registrar um item CNF, estranhamente na ECF fica com 1 centavo a mais.
Para complicar mais o problema, usando o EcfTeste não acontece.
Já atualizei o componente e continuou na mesma.

Tentei debugar e só consegui descobrir que a mudança onde acontece o acréscimo
de 1 centavo é dentro de uma função do componente.

Na procedure, RegistraItemNaoFiscal existe a seguinte chamada "fsECF.RegistraItemNaoFiscal(CodCNF, Valor, Obs);"
Até aqui não ocorre problema mas quando entro debugando vai para
"procedure TACBrECFEscECF.RegistraItemNaoFiscal(CodCNF: String; Valor: Double; Obs: AnsiString);"

Nessa procedure, ao entrar em "EscECFComando.AddParamDouble( Valor ) ;"

vai para 

procedure TACBrECFEscECFComando.AddParamDouble(ADouble: Double; Decimais: Byte);
begin
  AddParamInteger( Round( ADouble * power(10, Decimais) ) ) ;
end;

e aqui a mágica acontece, acrescenta 1 centavo. Ao ir ao próximo ponto já está com o valor alterado.

Já fiz de tudo, conferi a configuração do ACBrECF do EcfTeste com o do nosso sistema e não consegui
encontrar o porque disso acontecer. Se alguém tiver visto isso acontecer e puder me ajudar agradeço.

Em anexo o Log da ECF gerado por ambos os sistemas mas pelo que olhei, não entendo muito o conteúdo desse log,
mas parece que nele não tem o conteúdo que esclarece o problema por este ocorrer antes de ir para a ECF.

 

 

 

 

ECF.TXT

acbrlog.txt

Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Daniel Simoes disse:

Por favor seja mais claro...

Qual é o seu ECF ? Quais são exatamente os parâmetros enviados ?

Olha, temos uma ECF Daruma FS800i e uma Bematech MP 2100. Com ambas as ECF isso tem ocorrido.

Eu não tinha observado que o valor do pagamento também está sofrendo acréscimo de 0.01
eu fiz uma gambiara para ver o que ocorria diminuindo 0.01 antes de registrar o item e acabou por fechar o CNF informando 0.01 de troco.


eu faço:

DM.ECF.AbreNaoFiscal(); (Na abertura eu verifico se foi informado um CPF válido, e se tiver envio os dados do cliente)

DM.ECF.RegistraItemNaoFiscal(Gcnf, Total);  //Gcnf é o código do CNF e já ocorre o problema aqui 

DM.ECF.SubtotalizaNaoFiscal(0); 

DM.ECF.EfetuaPagamentoNaoFiscal(frmPrinc.FormasPagamento[0][0], DM.fdQueryCNFVALODINHEIRO.AsFloat, '', False);

 

Os parâmetros da ECF:
ArredondaitemMFD tentei como true e como false.
 

 

Link para o comentário
Compartilhar em outros sites

Em 14/11/2017 at 17:51, Daniel Simoes disse:

que valores exatamente devem ser enviados no comando?

qualquer valor que tenha casas decimais está fazendo isso.
mas sei lá o que acontece, muito estranho porque não acontece usando o ECFTeste.

mas é sempre que passa por esse ponto:

  • procedure TACBrECFEscECFComando.AddParamDouble(ADouble: Double; Decimais: Byte);
  • begin
  •   AddParamInteger( Round( ADouble * power(10, Decimais) ) ) ;
  • end;


antes de chegar aqui o valor está certo

Haaa não sei se pode fazer diferença, estou com o Delphi XE7

Link para o comentário
Compartilhar em outros sites

  • Fundadores
3 horas atrás, Jefferson Damian disse:

qualquer valor que tenha casas decimais está fazendo isso.

Por favor forneça informações precisas.. não creio que isso ocorra com qualquer valor, até porque nem todos valores seriam passíveis de arredondamento por RoundTo

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

16 minutos atrás, Daniel Simoes disse:

Por favor forneça informações precisas.. não creio que isso ocorra com qualquer valor, até porque nem todos valores seriam passíveis de arredondamento por RoundTo

Ex.:
Valor        Como Fica
10,30             10,31
8,50                8,51
15,64           15,65
10,00           10,00

Sempre que tem casa decimais está aumentando 0,01 centavos

Então fiz uma gambiarra para testar da seguinte forma
Em fez de mandar 10,30 mando 10,29, daí o valor é registrado corretamente como 10,30
Daí para informar o pagamento informo 10,30 e ao finalizar, finaliza com troco de 0,01
ou seja, ao enviar 10,30 esta mudando para 10,31.

Não sei se há algum parâmetro que é obedecido para definir as casas decimais nesse ponto
mas infelizmente não consegui achar de onde vem o erro porque fui debugando e ao chegar nesse ponto
magicamente aparece um centavo a mais.

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores
21 minutos atrás, Jefferson Damian disse:

10,30             10,31
8,50                8,51
15,64           15,65
10,00           10,00

Não faz sentido... Parece ser algo errado na RoundTo do seu Delphi...

Qual é o passo a passo para reproduzir o problema, usando o projeto Demo, ECFTeste ?

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

1 hora atrás, Daniel Simoes disse:

Não faz sentido... Parece ser algo errado na RoundTo do seu Delphi...

Qual é o passo a passo para reproduzir o problema, usando o projeto Demo, ECFTeste ?

Não consegui fazer o erro acontecer no ECFTeste, no mesmo ponto onde debugando pelo nosso sistema ocorre o acréscimo de 0,01 pelo ECFTeste não acontece.

Faço em ambas a situações com o componente atualizado e usando a mesma versão do Delphi.
Mas como a mudança tem ocorrido dentro do fonte do componente, eu imaginava que alguém
pudesse ter visto isso acontecer ou que soubesse de algo que pode influenciar no acréscimo desse 0,01.
 

E a única diferença que encontrei é que no ECFTeste, pega um valor de texto e converte em float e
eu passo direto uma variável do tipo real. Mesmo assim já tentei converter em texto e imitar o comando.

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores
1 hora atrás, Jefferson Damian disse:

eu passo direto uma variável do tipo real

Pode ser isso... experimente usa TCurrency, é o mais indicado para Valores monetários...

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

29 minutos atrás, Daniel Simoes disse:

Pode ser isso... experimente usa TCurrency, é o mais indicado para Valores monetários...

Ok vou testar.
Enquanto isso fiz um passo a passo debugando e mostrando os valores até o momento que acontece o problema.
Por ter ficado com mais de 2MB coloquei no drive e compartilhei.
https://drive.google.com/open?id=1IWUESa1TR02YZxTLSrSapqMXS99aygC6

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Para que eu possa investigar / corrigir algo...  eu preciso ser capaz de reproduzir o problema em minha máquina...

Então... fico no aguardo de um passo a passo detalhado, de como reproduzir o problema usando o Demo do ACBrECF...

Como opção, você também poderia criar um mini projeto, que demonstre o problema, e anexá-lo aqui no tópico...

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
  • Solution

Enviei modificações para o SVN, que devem evitar esse tipo de problema, mesmo sem as declarações da Round()

Poderia por favor testar novamente, sem o SetRoundMode ?

Citar

-- ACBrECFEscECF --
[-] Ajuste para evitar arredondamentos nas chamadas de TACBrECFEscECFComando.AddParamDouble
    https://www.projetoacbr.com.br/forum/topic/39917-cnf-finalizando-com-1-centavo-a-mais/

 

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

59 minutos atrás, Daniel Simoes disse:

Enviei modificações para o SVN, que devem evitar esse tipo de problema, mesmo sem as declarações da Round()

Poderia por favor testar novamente, sem o SetRoundMode ?

 

Testei, funcionou.
Obrigado

Editado por Jefferson Damian
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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