Ir para conteúdo
  • Cadastre-se

dev botao

Erro Geração Registro R05 Paf


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

Recommended Posts

Ola pessoal.
 
Efetuei a pré-homologação do PAF-ECF e o fiscal apontou um problema na geração do arquivo R05, onde o campo CCF estava formatando de forma errada, preenchendo as posições não significativas atras do valor.
EX:
CCF = 4725
O campo com 6 posições no registro R05 estava gerando "472500" ao invés de "004725"
 
Verifiquei os fontes e vi que o problema estava na unit ACBrPAF_R_Class.pas na linha 519:
LFill( IfThen(NUM_CONT=-1, RegR04.NUM_CONT, NUM_CONT), 6) +

Este trecho de código esta chamando o método IfThen que está na unit ACBrSPEDUtils.pas.

Esta unit somente tem o método IfThen para os tipos Currency e Char, como os valores passados são inteiros ele usa o método IfThen que retorna um Currency, fazendo com que o método LFill para Currency seja invocado ao invés do LFill para Integer, provocando assim um erro na formatação do registro R05.

Existe duas formas de solucionar o problema:

 

1º Criar um Método IfThen na unit ACBrSPEDUtils.pas que receba dois inteiros como parâmetro, conforme segue:

function IfThen(AValue: Boolean; const ATrue: Integer; AFalse: Integer): Integer;
begin
  if AValue then
     Result := ATrue
  else
     Result := AFalse;
end;

2º Adicionar uma referencia para a unit "Math" do delphi em ACBrPAF_R_Class.pas e modificar a linha 519 conforme segue:

LFill( Math.IfThen(NUM_CONT=-1, RegR04.NUM_CONT, NUM_CONT), 6) +

Desta forma ele usará o método IfThen nativo do Dephi.

 

Esta solução foi testada utilizando o delphi 2010.

Caso lancem a correção nos fontes do SVN me avise para que eu baixe os arquivos atualizados.

Desde já agradeço.

 

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Sugiro a segunda opção.

 

Na verdade não vejo a necessidade nenhuma de ter o método IfThen nas units do SPED. Esse método existe até mesmo no Lazarus.

Teria que verificar com quem adicionou, pode ser para ficar compatível com o Delphi 6 ou anterior.

EDIT: Percebi que os métodos declarados na unit do SPED parecem não existir em outro lugar para os tipos declarados (char e currency).

Continuo achando melhor a segunda opção.

[]'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

Concordo com Você.

A segunda opção é a mais correta. Postei as duas situações porque não entendi a necessidade de ter os Métodos IfThen no ACBR sendo que eles ja existem no delphi, pensei terem algum propósito de compatibilidade igual você comentou. Não tenho o delphi 6 instalado para testar.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Os métodos do ACBrSPEDUtils.pas são diferentes dos que tem no Delphi pois atendem a variáveis do tipo CHAR e CURRENCY. Não existe isso no Delphi. Por isso editei meu post anterior. Mas de qualquer maneira, não sei se são necessários.

   Vamos esperar o Isaque Régys* se pronunciar.

 

EDIT2:

Pensei numa terceira opção. Você poderia testar por favor?

3) Remova a unit ACBrSPEDUtils na linha 96 do ACBrPAF_R_Class.pas que contém a cláusula "uses" e adicione a Math. Verifique se acontece algum problema.

Explicando:

Código atual

implementation

uses ACBrSPEDUtils;

{ ordenações de registros }
Código corrigido

implementation

uses Math;

{ ordenações de registros }
*: Percebi que embora os métodos IfThen estão na classe do SPED por uma adição do Isaque, a remoção da unit Math no ACBrPAF foi feita pelo Régys.

[]'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

Desculpa a demora EMBarbosa.

Testei aqui a alteração sugerida, e ao remover o uses de ACBrSPEDUtils  deu erro de compilação pois a seguinte linha de código faz referencia a essa classe.

Check(funChecaCNPJ(CNPJ), '(R01) ESTABELECIMENTO: O CNPJ "%s" digitado é inválido!', [CNPJ]);

Modifiquei então o uses da seguinte maneira:

uses Math, ACBrSpedUtils;

Efetuei um teste e gerou corretamente sem mais alterações na classe. 

Editado por rlbartz
Link para o comentário
Compartilhar em outros sites

  • Consultores

Ok. Obrigado pelo retorno.

Vou verificar hoje na parte da tarde.

[]'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

  • Consultores

Subi as alterações para o SVN na Revisão  5741.
Pelo que vi está tudo certo.
Favor testar e reportar qualquer problema.
Obrigado.

 

Só fica aberto a questão de nós removermos a dependência do ACBrPAF a uma unit do SPED. Talvez passando esse tipo de método (funChecaCNPJ) para uma unit mais genérica como a ACBrUtils.pas ou quem sabe até criar uma ACBrValidacoes.pas :D

[]'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

  • Moderadores

Elton, talvez fosse melhor utilizar as units do ACBrValidador, ele tem um método para checar isso e como ele faz parte do pacote comum do ACBr, aquele que tem que ser instalado de qualquer forma, simplifica tudo, o que acha?

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Eu concordo com o Regys, já pensei varias vezes mudar para o ACBrValidador, mas o tempo não ajudou :)

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

  • Consultores

Concordo.

Acho até que seria melhor remover esse tipo de função do ACBrSPEDUtils.pas e deixá-las lá.

Acredito que o ACBrSPEDUtils.pas deveria conter só funções que fossem específicas úteis para a implementação do SPED, como o nome mesmo diz.

  • Curtir 1

[]'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

  • 1 ano depois...

Boa tarde.

 

Estou tendo problemas na geração do Registro R05 (Registros PAF-ECF), no campo NUM_CONT está sendo adicionado 2 casas decimais.

 

Ex: CCF = 6777, no arquivo está saindo 000677700.

 

Debugando o componente, percebi que até na linha LFill( IfThen(NUM_CONT=-1, RegR04.NUM_CONT, NUM_CONT), 9) da unit ACBrPAF_R_Class o valor da NUM_CONT é 6777, mas ao passar pela função LFill, está sendo adicionado as casas decimais.

 

Estou passando o campo como Integer, mas na unit ACBrTXTClass está sendo executado a função LFill(Value: Extended;... e não a LFill(Value: Integer;

 

No Registro R04 fica certo, 000006777.

 

Alguém pode me ajudar ?

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

Boa tarde,

Tive o mesmo problema com a geração, na unit ACBrPAF_R_Class.pas, adicionei no uses a referência para a unit Math

uses SysUtils, Classes, Math, DateUtils, ACBrTXTClass,
     ACBrPAF_R, ACBrUtil;

Desta forma, o ifThen não me retornou mais um Decimal e sim o Inteiro.

 

Obrigado.

Editado por renato_oda
Link para o comentário
Compartilhar em outros sites

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