Ir para conteúdo
  • Cadastre-se

dev botao

Erro Arredondamento Ecf Daruma Fs700


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

Recommended Posts

Boa tarde pessoal

Estou as voltas com um cliente onde o mesmo possui uma ECF Daruma FS700, onde
o cupom não fecha e o mesmo é cancelado.

Observando os motivos notei que quanto  do encerramento do
cupom a venda na tela possui um valor de R$13,98 e no cupom
o valor de R$13,99.

Acredito eu ser esse o motivo do não fechamento do cupom.

Estou utilizando o Delphi 7 com o componente ACBR, já tentei mudar a qtde
de decimais no preço para 2 casas utilizando este procedimento no ACBR:
 

 

   if TACBrECFModelo(Ecf.Modelo) = ecfDaruma then
 
       Ecf.DecimaisPreco := 2;
 

 

 

Tenteipassar os valores de Venda no metodo VendeItem com os mesmos arredondamentos
que uso na venda incluindo os descontos e até agora o mesmo erro.

Uma coisa que me intriga é que uso o mesmo software no mesmo cliente com ECFs
bematech  e não ocorre este erro..

Se alguém já passou por isso e puder compartilhar a solução utilizada fico
desde já agradecido.

 

Fausto Alves

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Fausto acho que já tem tópicos que falam sobre o assunto, tenta dar uma pesquisada que está aqui no fórum

mas tem a ver com com o arredondar / truncar da ecf tente verificar isso

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Isso está errado...

if TACBrECFModelo(Ecf.Modelo) = ecfDaruma then
        Ecf.DecimaisPreco := 2;

 

Você não deve atribuir o valor de Decimais ao ACBrECF... Apenas a Epson suporta a definição dinâmica desse parâmetro... Em todos os demais ECFs isso é definido no momento da Lacração..

 

O ACBrECF irá ler o numero de Decimais suportadas pelo ECF no momento da ativação

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

Fausto, como o Daniel falou esse parâmetro é definido na lacração do ECF, sendo assim, vc deve parametrizar o seu sistema para trabalhar como a impressora está, e não tentar parametrizar o ECF.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

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

Pessoal verifiquei todas as respostas .. mudei o meu software e ainda continuo com o mesmo problema..

Agora ficou mais complicado ainda, pois fiz um teste como ACbrECFTeste com os mesmo valores e obtive o resultado mostrado na figura abaixo:

Sinceramente não sei onde posso estar errando.

erro2102.png

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O seu erro parece ser não ajustar o seu calculo interno com o calculo do ECF...

 

Se o ECF arredonda, vc tb deve arredondar... Se o ECF trunca, vc deve truncar..

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 mês depois ...

Olá Pessoal,

 

Não sei se já resolveram o problema, porém gostaria de compartilhar com vocês a solução que utilizei para este problema.

Tive o mesmo problema com uma ECF Elgin que está arredondando e também tenho problemas quando utilizo balanças e ECF que truncam valores.

Pelo que sei a maioria das ECFs truncam, apenas uma ou outra fica com a função de arredondamento ativada, a aqui trabalhamos mais com Bematech e segundo o suporte apenas a MP-4000 tem um função (Bematech_FI_VendeItemArredondamentoMFD) que permite arredondar o valor do item mesmo ela estando para truncar valores.

 

Mas voltando a solução do meu problema, depois de algumas pesquisas descobri que a forma de arredondamento que a Elgin e a Bematech utilizam é a forma definida pela ABNT, a primeira vez que vi a norma achei meio estranha, porém resolvi implementar no meu sistema, assim pelo menos e tenho uma base legal para explicar a forma de arredondamento que utilizo.

 

Segue abaixo o código que faz o trabalho pra mim, pode não estar escrito da melhor forma, porém funciona e resolveu meu problema com as ECFs.:

Só pra constar meu sistema tem uma configuração para definir se ele arredonda ou trunca os valores, ainda não fiz o teste com balanças, mas com ECFs acabou meus problemas.  :-P

function ArredondarTruncarValor(ArredondarValor: Boolean ; AValor: Double; AQtdeCasas: Integer = 2 ): Double;
  var ATemp : string;
begin
  //Esta regra de arredondamento segue a norma "ABNT NBR 5891:1977" da Associação Brasileira de Normas Técnicas - ABNT

  ATemp := Copy( FloatToStr( Frac(AValor) ), 3, AQtdeCasas + 2) ; //Começa a Copiar a partir da Terceira casa para ignorar o 0. que fica no inicio da string

  if Length(ATemp) < (AQtdeCasas + 2) then
    ATemp := ATemp + stringOfChar('0', (AQtdeCasas + 2) - Length(ATemp) ); //Força a string a ter dois digitos a mais do que a qtde de casas decimais desejada

  if ArredondarValor then
  begin
    if StrToInt( ATemp[AQtdeCasas + 1] ) = 5 then //Se o primeiro digito apos a ultima casa a se manter for 5
    begin

      //Se o algarismo a ser conservado for ímpar, soma-se uma unidade ao algarismo a ser conservado e retira-se os posteriores.
      // OU
      //Se o algarismo a ser conservado for par e o primeiro algarismo após o 5 for diferente de zero,
      // soma-se uma unidade ao algarismo a ser conservado e retira-se os posteriores.

      if ( (Odd(StrToInt(ATemp[AQtdeCasas]))) or (StrToInt(ATemp[AQtdeCasas + 2]) > 0)) then
      begin
        //Verificação para caso o algarismo a ser conservado seja igual a 9.
        if StrToInt(ATemp[ AQtdeCasas ]) < 9 then
          ATemp[AQtdeCasas] := IntToStr(StrToInt(ATemp[AQtdeCasas]) + 1)[1]
        else
          ATemp := IntToStr( StrToInt(Copy(ATemp, 1, AQtdeCasas)) + 1 );
      end;
    end
    else if StrToInt( ATemp[AQtdeCasas + 1] ) > 5 then
    begin
      //Verificação para caso o algarismo a ser conservado seja igual a 9.
      if StrToInt(ATemp[ AQtdeCasas ]) < 9 then
        ATemp[AQtdeCasas] := IntToStr(StrToInt(ATemp[AQtdeCasas]) + 1)[1]
      else
        ATemp := IntToStr( StrToInt(Copy(ATemp,1,AQtdeCasas)) + 1 );  
    end;

    Result := StrToFloat(IntToStr(Trunc(AValor)) + ',' + Copy(ATemp,1,AQtdeCasas));
  end
  else
    Result := StrToFloat(IntToStr(Trunc(AValor)) + ',' + Copy(ATemp,1,AQtdeCasas)); //Truncamento de Valores
end;

Era isso o que tinha para compartilhar, espero que minha solução possa ajudar mais alguém.

 

Att.

 

Willians R. Gonçalves

[email protected]

"Sou louco porque vivo em um mundo que não merece minha lucidez" (Bob Marley)

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Essa função já existia em ACBrUtil.pas

 

 

{-----------------------------------------------------------------------------
 Arredondamento segundo as normas da ABNT NBR 5891/77  (por: DSA)
 Fontes:
 http://www.sofazquemsabe.com/2011/01/como-fazer-arredondamento-da-numeracao.html
 http://partners.bematech.com.br/2011/12/edicao-98-entendendo-o-truncamento-e-arredondamento-no-ecf/
 -----------------------------------------------------------------------------}
function RoundABNT(const AValue: Double; const Digits: SmallInt):Double;
var
   Pow, PowValue, RestPart : Extended;
   IntPart, FracPart, LastNumber : Integer;
Begin
   Pow      := intpower(10, abs(Digits) );
   PowValue := SimpleRoundTo( AValue * Pow, -9) ; // SimpleRoundTo elimina dizimas ;
   IntPart  := trunc( PowValue );
   FracPart := trunc( frac( PowValue ) * 100);

   if (FracPart > 50) then
      Inc( IntPart )

   else if (FracPart = 50) then
    begin
      LastNumber := round( frac( IntPart / 10) * 10);

      if odd(LastNumber) then
         Inc( IntPart )
      else
       begin
         RestPart := frac( PowValue * 10 ) ;

         if RestPart > 0 then
            Inc( IntPart );
       end ;
    end ;

   Result := (IntPart / Pow);
end;

  • 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

Além de da rotina do ACBr ter ficado mais curta e simples, está melhor do que a minha, como sempre aconteceu no cliente de aparecer um valor que ela não arredondou corretamente e a rotina RoundABNT fez certinho, o jeito foi substituir a minha...rsrs.

Willians R. Gonçalves

[email protected]

"Sou louco porque vivo em um mundo que não merece minha lucidez" (Bob Marley)

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Apenas para efeito de informação... a "Bobina" em Memo ou HTML, gerada pelo ACBrECF usa essa função quando ela detecta que o ECF arredonda... Ou seja, o valor da Bobina do ACBRECF deve bater com o valor da bobina do 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

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