Ir para conteúdo
  • Cadastre-se

dev botao

Erro ao ativar ACBrECF utilizando ECF Virtual


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

Recommended Posts

Postado

Boa tarde Pessoal,

   Tenho um PDV homologado para trabalhar com PAF-ECF e que também faz emissão de NFC-e. Depois da ultima atualização do ACBr começou acontecer um problema onde utilizo NFC-e.

   Quando vou fazer o ACBrECF.Ativar, utilizando ACBr Virtual tenho um retorno de acess violation em algumas situações. Debugando o código cheguei a seguinte conclusão.     

   Abro uma venda e faço o registro de dois itens, com tributações diferentes, um isento e um substituição, por exemplo. Depois disso faço o cancelamento de um dos itens. Se abrir o .ini da ecf virtual dentro dele tenho dois grupos de informações 'Cupom_items e Cupom_aliquotas'. Veja que o item cancelado continua aparecendo já a alíquota foi excluída. Digamos que essa maquina se desligou e vou para abrir o PDV novamente, no momento que vou fazer o ACBrECF.Ativar é retornado o acess violation. Isso ocorre na unit ACBrECFVirtual na procedure LoadFromINI(AIni: TCustomIniFile); na linha 1274 -> if (fpAliquotasCupom.Find(ItemCupom.AliqPos).Tipo = 'S') then. No momento que ele vai executar a function TACBrECFVirtualClassAliquotasCupom.Find(APos: Integer): TACBrECFVirtualClassAliquotaCupom; ele não encontra a alíquota do item cancelado e retorna o acess violation.

{Trecho do .ini da ECF Virtual}

[Cupom_Items]
000=1|4466|ABACATE KG|0|4,2|0|KG|-1|1|
001=2|3483428|A1 STANDART 50L|1|87,27|0|UN|-1|0|

[Cupom_Aliquotas]
00=0|0|87,27|0|T|

{Quando faz a linha ACBrECF.Ativar o erro é retornado}

ACBrECF.Desativar;
ACBrECF.ECFVirtual := frmPrincipal.ACBrECFVirtualNaoFiscal;
ACBrECF.Porta := portaNFCe;
ACBrECF.Ativar;

Postado

Tem uma forma simples de ser contornada, mais não sei se é a melhor. No ACBrECFVirtual na procedure procedure TACBrECFVirtualClassCupom.LoadFromINI(AIni: TCustomIniFile);  no seguinte trecho

 

  S := 'Cupom_Items';
  I := 0 ;
  while True do
  begin
    T := AIni.ReadString(S, IntToStrZero(I, 3), '*FIM*');
    if T = '*FIM*' then Break;

    ItemCupom := fpItensCupom.New(Self);
    ItemCupom.AsString := T;

    if fpAliquotasCupom.Count > 0 then
    begin
      if (fpAliquotasCupom.Find(ItemCupom.AliqPos).Tipo = 'S') then
        fpSubtotalISSQN := fpSubtotalISSQN + ItemCupom.TotalLiquido
      else
        fpSubtotalICMS  := fpSubtotalICMS + ItemCupom.TotalLiquido;

    end;

    Inc(I);
  end;

 

   O erro ocorre pelo fato do find aliquota não encontrar nenhuma alíquota para determinado item que já foi cancelado, conforme exemplo que passei no primeiro tópico, dessa forma o .tipo não esta carregado e acaba retornando o access violation. Como esse teste em vermelho é só para determinar se o valor vai ser somado em total de icms ou total de issqn e como o item em que da acess violation não precisa mais ser considerado seria só colocar um try except.

      try
        if (fpAliquotasCupom.Find(ItemCupom.AliqPos).Tipo = 'S') then
          fpSubtotalISSQN := fpSubtotalISSQN + ItemCupom.TotalLiquido
        else
          fpSubtotalICMS  := fpSubtotalICMS + ItemCupom.TotalLiquido;
      except
        //
      end;

  Alterei o fonte e fiz testes e a principio não ocorreu mais erros. Anexei a unit

 

ACBrECFVirtual.pas

  • Fundadores
Postado

Creio que o problema está na verdade, em "TACBrECFVirtualClass.INItoClass", onde os dados do cupom, eram lidos, antes da memória do ECF estar composta...

Por favor teste com a Unit em anexo

ACBrECFVirtual.pas

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.

Postado
2 horas atrás, Daniel Simoes disse:

Creio que o problema está na verdade, em "TACBrECFVirtualClass.INItoClass", onde os dados do cupom, eram lidos, antes da memória do ECF estar composta...

Por favor teste com a Unit em anexo

ACBrECFVirtual.pas

Boa tarde Daniel,

   Apesar de mudar a ordem de  fpCupom.LoadFromINI(Ini); não resolveu. Quando chega nesse teste if (fpAliquotasCupom.Find(ItemCupom.AliqPos).Tipo = 'S') then continua com o acess violation.

   Só para recapitular, o problema só ocorre quando é feito o registro de dois itens com tributações diferentes e vc cancela um deles. Nesse momento se vc tiver que ativar a ECF por algum motivo, acontece o exception.

  Abaixo como fiz o teste, registrei dois itens com tributações isento e substituição e cancelei o ultimo que é o abacaxi. Ele deleta o [Cupom_Aliquotas] do .ini e deixou o item no [Cupom_Items]. Quando ele executa a function TACBrECFVirtualClassAliquotasCupom.Find no ativar, ele não encontra a alíquota do item cancelado, o que gera a exception.

[Cupom_Items]
000=1|3483428|A1 STANDART 50L|1|87,27|0|UN|-1|0|
001=2|1113|ABACAXI PEROLA UNIDADE|0|5,8|0|UN|-1|1|

[Cupom_Aliquotas]
00=0|0|87,27|0|T|

  • Curtir 1
Postado

Bom dia Daniel,

   Sobre a situação que esta ocorrendo nesse caso, pode ser adicionado a alteração que sugeri aos fontes? Ou vocês  pensam em contornar o erro de outra maneira?

Obrigado.

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