Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Estou com problema na impressão dos dados do remetente no dacte pelo componente acbrctedacteqr1, no meu caso o remetente é pessoa física, portanto tem CPF, mas na nota fiscal o local de retirada é diferente do remetente,

portanto preencho o local de retirada(que é pessoa jurídica-CNPJ) na geração do XML, o arquivo XML está gerado corretamente, porém na impressão dos dados do remetente ao invés de sair o cpf do remetente sai o cnpj do local de retirada, todos os outros dados do remetente imprime corretamente.

  • Consultores
Postado

Bom dia,

 

Descobri o problema.

 

Ele se encontra na function rCampoCNPJCPF que possui a seguinte lógica:

 

  result := rCampo(tcStr, 'CNPJ');
  if trim(result) = '' then
    result := rCampo(tcStr, 'CPF');
 

Note que le primeiramente a tag CNPJ se o retorno for vazio le a tag CPJ.

 

Acontece que dentro do grupo <rem> temos o grupo <enderReme> e podemos ter também um dos grupos: infNF, infNFe, infOutros.

 

Dentro do grupo <infNF> podemos ter o grupo <locRet> ou seja o local de retirada que também poderá ter as tags CNPJ ou CPJ.

 

No seu XML tem o grupo <locRet> com a tag <CNPJ> isso faz com que a funcion pegue o conteudo dessa tag em vez do CPF do Remetente.

 

Se alterarmos a function para a seguinte lógica:

 

  result := rCampo(tcStr, 'CPF');
  if trim(result) = '' then
    result := rCampo(tcStr, 'CNPJ');
 

O seu problema fica resolvido, pois ele vai ler o CPF do Remetente.

 

Mas por outro lado imagina que o Remetente possui CNPJ e a pessoa referente ao local de retirada possui um CPF, a function vai pegar primeiramente o CPF do local de retirada e não o CNPJ do remetente.

 

Sendo assim, a minha sugestão é estudar as function rExtrai e rCampo que estão na unit pcnLeitor.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Ok! entendi, mas acredito que o processo correto seria analisar simplesmente a tag <rem>, se tem <cnpj> ou se tem <cpf>, e não analisar outro <cnpj> ou <cpf> de uma outra tag, mesmo que fosse interna da tag <rem>, como é o caso da tag <locRet>.

 

Muito obrigado! vou analisar aqui!

Postado

Ítalo, alterei aqui e deu certo, o que fiz foi o seguinte, sempre que a TAG analisada for o <rem> a função rExtrai pega tudo que está entre <rem> e </rem> desta maneira traz tanto cnpj ou cpf do remetente quanto do local de retirada, e é isto que causa o problema, o que fiz foi o seguinte, se estou analizando a tag <cnpj> ou a tag <cpf> do grupo <rem>, porém a posição de início da tag for maior que 50, por exemplo, isto quer dizer que este cpf ou cnpj é do local de retirada e não do remetente, então neste caso eu jogo ConteudoTag:='', assim ele vai sair e passar novamente na função rCampo e vai analisar então o cpf, que então estará retornando corretamente.

 

Confira a linha de código que eu acrescentei na função rCampo

 

begin

  Tag := UpperCase(Trim(TAG));
  inicio := pos('<' + Tag + '>', UpperCase(FGrupo));
  if inicio = 0 then
  ConteudoTag := ''

  //Alteração Daniel F. Dixini em 07/08/2013
  Else IF ((Copy(FGrupo,1,5) = '<rem>') and (inicio > 50)) Then ConteudoTag := ''

  else
  begin
    inicio := inicio + Length(Tag) + 2;
    fim := pos('</' + Tag + '>', UpperCase(FGrupo)) - inicio;
    ConteudoTag := trim(copy(FGrupo, inicio, fim));
  end;

  • Consultores
Postado

Boa tarde Daniel,

 

Vamos aguardar mais sugestões para a solução do problema.

 

Não devemos alterar essas funções para resolver um problema no componente ACBrCTe, uma vez que elas são utilizadas por outros componentes e dependendo da alteração realizada, corremos o risco de prejudicar o funcionamento dos demais componentes.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

ok, vou alterar no meu projeto então, mas acredito que esta alteração não haverá problema, uma vez que a finalidade desta função é simplesmente retornar os valores das tag do xml, e no caso da tag <rem> está realmente está retornando errado, e a alteração só será usada de fato quando for a tag <rem>

valeu obrigado!

  • Consultores
Postado

Bom dia a todos,

 

Acredito ter encontrado uma solução para o problema acima, vamos a um estudo de caso.

 

Layout do CT-e temos:

 

<rem> nivel 1

  <CNPJ> ou <CPF> nivel 2

  (...)

  <enderReme> nivel 2

   <xCpl> nivel 3 - opcional

   (...)

  <infNF> nivel 2

   (...)

   <locRet> nivel 3 - opcional

     <CNPJ> ou <CPF> nivel 4

     <xCpl> nivel 4 - opcional

  <infNFe> nivel 2

   (...)

  <infOutros> nivel 2

   (...)

 

Não sei se ficou claro mas vamos ao estudo.

 

    if Leitor.rExtrai(2, 'enderReme') <> '' then
    begin

      CTe.Rem.enderReme.xCpl    := Leitor.rCampo(tcStr, 'xCpl');
 

A linha em negrito acima le o conteudo da tag xCpl e armazena o seu valor na propriedade xCpl, que neste caso se refere ao complemento de endereço do remetente.

Muito bem, essa tag é opcional e vamos supor que ela não foi informada, mas foi informado o local de retirada e este possui o complemento.

Estudando a lógica da funcion rCampo que encontra-se na unit pcnLeitor ao ser executado a linha acima o rCampo não vai encontrar a tag xCpl do endereço do rememente por não ter sido informada, mas vai encontrar a tag de mesmo nome dentro do grupo <locRet> uma vez que este grupo esta contido dentro do grupo <rem>.

No final tanto o complemento de endereço do remetente quanto o do local de retirada vão possuir a mesma informação.

 

Problema semelhante apontado pelo nosso amigo Daniel F. Dixini, com relação ao CNPJ/CPF.

 

Solução proposta por mim:

 

Incluir na function rCampo um terceiro parametro chamado TAGparada.

Esse paramentro tem por finalidade de abortar a busca pela TAG quando for encontrada a TAGparada, vamos ao exemplo:

 

    if Leitor.rExtrai(2, 'enderReme') <> '' then
    begin

      CTe.Rem.enderReme.xCpl    := Leitor.rCampo(tcStr, 'xCpl', 'locRet');

 

Na linha acima em negrito, quando o rCampo for buscar pela tag xCpl para ler o seu conteudo, se localizar primeiro a tag locRet retorna vazio, caso contrario retorna o conteudo da tag xCpl.

 

Algo semelhante poderiamos ter na função rCampoCNPJCPF, ela passaria a ter o parametro TAGparada, exemplo.

 

  if Leitor.rExtrai(1, 'rem') <> '' then
  begin
    CTe.Rem.CNPJCPF := Leitor.rCampoCNPJCPF('locRet');
 

Na linha acima em negrito, quando o rCampoCNPJCPF for buscar pela tag CNPJ ou CPF para ler o seu conteudo, se localizar a tag locRet retorna vazio, caso contrario retorna o conteudo.

 

Acredito que desta forma vamos ler a tag correta.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Bom dia!

Entendi, se encontrar <LocRet> primeiro, isto quer dizer que não encontrou o campo referente ao remetente, uma vez que LocRet na sequência da string está mais no fim, desta maneira serviria também para tags como a tag xcpl, uma vez que também esta poderá estar na tag locRet

 

outra alteração interessante seria na máscara do campo cpf, cnpj, no caso de empresas está sempre colocando máscara de cnpj, mesmo que o campo seja um cpf, poderia verificar pela quantidade de caracteres e jogar máscara de cpf ou cnpj

  • Consultores
Postado

Daniel,

 

Você entendeu exatamente o meu post anterior, só ficou faltando informar se a TAGparada for vazia, a rotina procederia como ela é hoje, desta forma não teriamos nenhum problema quanto aos demais componentes.

 

Com relação a mascara na impressão do CNPJ / CPF no DACTE vou providenciar a alteração.

 

Já a alteração nas funções relatadas no post anterior, fica ai a minha sugestão para resolver o problema, posso até implementar a solução, mas preciso do aval dos nossos mestres.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Boa tarde!

ok! enquanto não altera em definitivo no acbr vou implementar o meu código abaixo na função rCampo, pq meu cliente não está aceitando sair o cnpj ao invés do cpf do remetente no dacte! valeu obrigado!

 

  Tag := UpperCase(Trim(TAG));
  inicio := pos('<' + Tag + '>', UpperCase(FGrupo));
  if inicio = 0 then
  ConteudoTag := ''

  //Alteração Daniel F. Dixini em 08/08/2013
  Else IF (   ((Copy(FGrupo,1,5) = '<rem>') and (inicio > 50))   and   ((Tag='CNPJ') or (Tag='CPF'))   ) Then ConteudoTag := ''

  else
  begin
    inicio := inicio + Length(Tag) + 2;
    fim := pos('</' + Tag + '>', UpperCase(FGrupo)) - inicio;
    ConteudoTag := trim(copy(FGrupo, inicio, fim));
  end;
 

  • Consultores
Postado

Bom dia Daniel,

 

Já encontra-se disponivel as alterações no DACTE - Quick Report, para que o mesmo formate o CNPJ/CPF de forma correta.

 

Fica ainda a pendencia para a solução do problema que você apresentou.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

Bom dia! 

Ok, enquanto isso mantenho minha alteração no meu fonte!

Tenho que marcar este tópico como resolvido?

Editado por dfdixini
  • 1 mês depois ...
  • Membros Pro
Postado

Bom dia Italo,

 

Atualizei os componentes e reparei que ficou um bug na impressão do DACTE no quickreport nos campos Remetente,Destinatario, Expedidor, Recebedor e Tomador. O numero do documento CPF/CNPJ esta saindo sempre formatado como se fosse CPF  mesmo sendo o numero de um CNPJ, ai ele oculta os outros numeros do CNPJ.

 

no xml o numero esta completo, ou seja esta com os 14 digitos de CNPJ.

 

Se puder me dar um help ficarei muito agradecido.

  • Membros Pro
Postado

Achei o problema, na linha 721 do ACBrFDUtil.pas a variavel AValue estava indo com 18 quando estava fazendo o preview, ous seja estava indo formatada,

resolvi aumentando a condição para     if (Length(AValue) = 14)or(Length(AValue) = 18)then

quando sair uma solução melhor atualizo.

 

Obrigado.

 

class function DFeUtil.FormatarCNPJCPF(AValue: String): String;
begin
  if Length(AValue) = 0 then
     Result := AValue
  else
   begin
    if (Length(AValue) = 14)or(Length(AValue) = 18)then
     Result := FormatarCNPJ(AValue)
    else
     Result := FormatarCPF(AValue);
   end;
end;
  • Moderadores
Postado

que tal tratar assim

 

class function DFeUtil.FormatarCNPJCPF(AValue: String): String;
begin
   AValue := OnlyNumber(AValue);
  if Length(AValue) = 0 then
     Result := AValue
  else
   begin
    if (Length(AValue) = 14)then
     Result := FormatarCNPJ(AValue)
    else
     Result := FormatarCPF(AValue);
   end;
end;
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

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

 

  • 1 mês depois ...
  • Este tópico foi criado há 4020 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.