Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

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

 

 

  • Consultores
Postado

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

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.

  • Consultores
Postado

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.
Postado (editado)

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
  • Consultores
Postado

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.
  • Consultores
Postado

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

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

 

  • Consultores
Postado

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

EMBarbosa, baixei as alterações da Revisão  5741, testei e gerou certinho.

Irei homologar o PAF-ECF nos próximos meses na TECPAR em Curitiba - Pr. Se tiver mais algum problema reporto no fórum. 

Muito obrigado a  todos!

  • 1 ano depois...
Postado

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.

Postado

Na verdade  problema não está na LFilll, o NUM_CONT está sendo convertido para Currency na função IfThen.

 

Percebi que na atualização 8573 existia a unit Math no uses e na 8574 foi removido do uses, com isso o IfThen que está sendo executado é da unit ACBrTXTUtils.

Postado (editado)

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