Ir para conteúdo
  • Cadastre-se

dev botao

ACBRNFeX - Como Consultar Nota


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

Recommended Posts

  • Membros Pro
Postado

Bom dia

Estou fazendo a consulta de uma nota (ISSCuritiba) enviada anteriormente, da seguinte forma:

...
Var
  VResponseRPS : TNFSeConsultaLoteRpsResponse;
  VXMLRet : String;
begin
 VResponseRPS := ACBrNFSeX1.ConsultarLoteRps('637615129589302423', '17');
  VXMLRet := TNFSeConsultaLoteRpsResponse(VResponseRPS).XmlRetorno;

 Neste momento VXMLRet tem todos os dados da nota.

 A dúvida é: como pego o número da nota, código de verificação, data emissão, ...?
 Quais propriedades do componente devem ser lidas?
 Tentei várias formas, inclusive alimentar o ACBrNFSeX1.NotasFiscais, mas não está dando certo.

 Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
Postado

Boa noite Valdir,

Analisando a procedure TratarRetornoConsultaLoteRps que se encontra na Unit ACBrNFSeXProviderABRASFv1

Se a consulta ocorrer com sucesso, o XML da NFS-e será salvo em disco (caso esteja configurado para salvar) e o componente vai estar carregado com os dados da nota.

Se isso não esta ocorrendo, se faz necessário colocar um ponto de parada na primeira linha da procedure em questão e debugar para descobrir o que esta ocorrendo.

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

  • Membros Pro
Postado

Bom dia,

Segui essa sua orientação, mas não consegui descobrir qual exatamente é a causa.

Os arquivos são salvos em disco. Estou anexando eles aqui.
Mas o componente não é alimentado.

O que me parece, o problema está no fato da linha 483 da ACBrNFSeXProviderABRASFv1 -> Response.Situacao := ProcessarConteudoXml(Document.Root.Childrens.FindAnyNs('SituacaoLoteRps'), tcStr);

Nessa linha o componente busca uma variável "SituacaoLoteRps", mas essa variável não existe no XML retornado na consulta.

Obrigado!

637615129589302423-con-lot.xml 637615129589302423-con-lot-soap.xml 637615129589302423-lista-nfse-con-lot.xml 637615129589302423-lista-nfse-con-lot-soap.xml

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado
56 minutos atrás, Rafael Dias disse:

Como sempre os provedores fazendo a alegria das pessoas.

Boa noite,

Não entendi @Rafael Dias. Pelo que você está dizendo, o problema está sendo causado por uma falha no XML retornado pelo provedor, é isso?

Obrigado.

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado
13 horas atrás, Rafael Dias disse:

Sim o provedor não esta seguindo corretamente o padrão e esta enviando faltando campos no xml, o que é muito comum de ocorrer no mundo da NFSe.

Bom dia,

Certo, mas qual seria a sugestão nesse caso? 

Aguardar o provedor corrigir a inconsistência ou há algo que se possa fazer para contornar isso?

Obrigado

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado
1 hora atrás, Rafael Dias disse:

Já esta no log para analisar possivel contorno, pois se formos esperar o provedor nunca vai acontecer.

Show.

Obrigado.

Valdir Dill

Rio de Janeiro - RJ

 

 

  • 2 semanas depois ...
  • Membros Pro
Postado
1 hora atrás, Italo Giurizzato Junior disse:

Boa tarde Valdir,

Desculpe pela demora, favor atualizar os fontes e faça novos testes.

Boa tarde,

Ainda não está trazendo os dados da nota.
Testado inclusive no Demo. Print anexo.

Não sei se pode ter relação, mas debugando verifiquei que, ao passar pela função TratarRetornoConsultaLoteRps(, em uma das linhas dessa função, ele chama a seguinte:
ANodeArray := ANode.Childrens.FindAllAnyNs('CompNfse');

Aí vai para a função FindAllAnyNs( da ACBrXmlDocument.pas.
Nesta função, a linha 947 (if Node.LocalName <> Name then continue), o LocalName aparece com valor "access violation...", conforme print anexo.

Debug.png

DemoAcbr.png

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
Postado

Valdir,

Preciso saber se o valor de ANode na linha abaixo é diferente de Nil.

      ANode := Document.Root.Childrens.FindAnyNs('ListaNfse');

E também se o valor de AnodeArray na linha abaixo é diferente de Nil.

      ANodeArray := ANode.Childrens.FindAllAnyNs('CompNfse');

 

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

  • Membros Pro
Postado
12 minutos atrás, Italo Giurizzato Junior disse:

Valdir,

Preciso saber se o valor de ANode na linha abaixo é diferente de Nil.

      ANode := Document.Root.Childrens.FindAnyNs('ListaNfse');

E também se o valor de AnodeArray na linha abaixo é diferente de Nil.

      ANodeArray := ANode.Childrens.FindAllAnyNs('CompNfse');

 

Sim, são diferentes. Prints anexos.

ANode.png

ANodeArray.png

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
Postado

Valdir,

Se essas duas variáveis são diferente de nil, com certeza ele deve ter entrado dentro do FOR.

      for I := Low(ANodeArray) to High(ANodeArray) do
      begin
        ANode := ANodeArray[I];
        AuxNode := ANode.Childrens.FindAnyNs('tcCompNfse');

        if AuxNode = nil then
          AuxNode := ANode.Childrens.FindAnyNs('Nfse')
        else
          AuxNode := AuxNode.Childrens.FindAnyNs('Nfse');

        if AuxNode <> nil then     <<<<< verifica se ele esta entrando dentro desse IF
        begin
          AuxNode := AuxNode.Childrens.FindAnyNs('InfNfse');
//          AuxNode := AuxNode.Childrens.FindAnyNs('IdentificacaoRps');
          AuxNode := AuxNode.Childrens.FindAnyNs('Numero');
          NumNFSe := ProcessarConteudoXml(AuxNode, tcStr);

          ANota := TACBrNFSeX(FAOwner).NotasFiscais.FindByNFSe(NumNFSe);

          if Assigned(ANota) then
            ANota.XML := ANode.OuterXml
          else
          begin
            TACBrNFSeX(FAOwner).NotasFiscais.LoadFromString(ANode.OuterXml, False);
            ANota := TACBrNFSeX(FAOwner).NotasFiscais.Items[TACBrNFSeX(FAOwner).NotasFiscais.Count-1];
          end;

          SalvarXmlNfse(ANota);

          Response.Situacao := '4';
        end
        else
        begin
          AErro := Response.Erros.New;
          AErro.Codigo := Cod203;
          AErro.Descricao := Desc203;
          Exit;
        end;
      end;

 

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

  • Membros Pro
Postado
26 minutos atrás, Italo Giurizzato Junior disse:

Valdir,

Se essas duas variáveis são diferente de nil, com certeza ele deve ter entrado dentro do FOR.

      for I := Low(ANodeArray) to High(ANodeArray) do
      begin
        ANode := ANodeArray[I];
        AuxNode := ANode.Childrens.FindAnyNs('tcCompNfse');

        if AuxNode = nil then
          AuxNode := ANode.Childrens.FindAnyNs('Nfse')
        else
          AuxNode := AuxNode.Childrens.FindAnyNs('Nfse');

        if AuxNode <> nil then     <<<<< verifica se ele esta entrando dentro desse IF
        begin
          AuxNode := AuxNode.Childrens.FindAnyNs('InfNfse');
//          AuxNode := AuxNode.Childrens.FindAnyNs('IdentificacaoRps');
          AuxNode := AuxNode.Childrens.FindAnyNs('Numero');
          NumNFSe := ProcessarConteudoXml(AuxNode, tcStr);

          ANota := TACBrNFSeX(FAOwner).NotasFiscais.FindByNFSe(NumNFSe);

          if Assigned(ANota) then
            ANota.XML := ANode.OuterXml
          else
          begin
            TACBrNFSeX(FAOwner).NotasFiscais.LoadFromString(ANode.OuterXml, False);
            ANota := TACBrNFSeX(FAOwner).NotasFiscais.Items[TACBrNFSeX(FAOwner).NotasFiscais.Count-1];
          end;

          SalvarXmlNfse(ANota);

          Response.Situacao := '4';
        end
        else
        begin
          AErro := Response.Erros.New;
          AErro.Codigo := Cod203;
          AErro.Descricao := Desc203;
          Exit;
        end;
      end;

 

Está bastante esquisito. Não estou conseguindo entender direito o debug.

Olha só, ao passar por  if AuxNode <> nil then, AuxNode tem valor nil. Mas mesmo assim ele entra nesse begin -> if AuxNode <> nil then begin...

Além disso, tem vários pontos que o debug não para. Se eu colocar um ponto de parada na linha  if AuxNode <> nil then, ele não para ali. Bem estranho.
        
        

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado (editado)
1 hora atrás, Italo Giurizzato Junior disse:

Valdir,

Realmente esta muito estranho.

Ele chega na linha abaixo?

NumNFSe := ProcessarConteudoXml(AuxNode, tcStr);

Se sim, qual é o valor de NumNFSe?

Não, ele pula essa linha. Veja o print anexo. No break point dessa linha NumNFSe := ProcessarConteudoXml(AuxNode, tcStr), ele não para.

Mas na linha 529 que nem código tem, ele para. O valor de NumNFSe, nesse momento, está sem nada.

Acbr.png

Editado por Valdir Dill
Faltou anexo.

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
Postado

Bom dia Valdir,

Você não precisa ficar colocando "N" break point, basta colocar na primeira linha e depois ir pressionando a tecla F8 para que ele vá para as próximas linhas da rotina.

Depois que ele executar a linha abaixo você verifica qual é o valor de NumNFSe.

          NumNFSe := ProcessarConteudoXml(AuxNode, tcStr);

 

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

  • Membros Pro
Postado

Boa noite,

Sim, mas ele não passa por essa linha NumNFSe := ProcessarConteudoXml(AuxNode, tcStr). Mesmo com F8, ele para na linha 529 (que não tem código). Mas na linha 526, ele não para. Quando para na linha 529, NumNFSe está com valor '' (sem nenhum valor).

Obrigado.

 

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
Postado

Boa tarde Valdir,

Primeiramente quero que você atualize todos os fontes de todas as pastas.

Segundo reinstale a suíte ACBr usando o ACBrInstall_Trunk2 com a opção de apagar arquivos antigos marcada.

Terceiro, abra o programa exemplo do novo componente, compile ele com a opção Build.

Por fim faça o teste abaixo:

 

Preciso que você consulte o lote cujo protocolo é 637615129589302423.

Na rotina que estamos analisando preciso saber se o valor de AuxNode é diferente de Nil que esta na linha que procura pela tag InfNfse.

E se o valor de AuxNode é diferente de Nil que esta na linha que procura pela tag Numero.

Se ambos forem diferente de nil, temos que analisar o porque ele não esta lendo o numero da nota que se encontra na tag Numero.

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

  • Membros Pro
Postado
Em 25/07/2021 at 13:43, Italo Giurizzato Junior disse:

Boa tarde Valdir,

Primeiramente quero que você atualize todos os fontes de todas as pastas.

Segundo reinstale a suíte ACBr usando o ACBrInstall_Trunk2 com a opção de apagar arquivos antigos marcada.

Terceiro, abra o programa exemplo do novo componente, compile ele com a opção Build.

Por fim faça o teste abaixo:

 

Preciso que você consulte o lote cujo protocolo é 637615129589302423.

Na rotina que estamos analisando preciso saber se o valor de AuxNode é diferente de Nil que esta na linha que procura pela tag InfNfse.

E se o valor de AuxNode é diferente de Nil que esta na linha que procura pela tag Numero.

Se ambos forem diferente de nil, temos que analisar o porque ele não esta lendo o numero da nota que se encontra na tag Numero.

Boa noite,

Segui as instruções e parece que houve progresso.

O valor de AuxNode agora é diferente de nil e NumNFse tem valor 680, corretamente.

Uma dúvida: como recupero o número da nota. Pelo que entendi, deveria pegar essa informação pela ACBrNFSeX1.NotasFiscais.Items[0].NFSe.Numero, isso após fazer a consulta. Mas essa propriedade não está sendo alimentada.

Ou seria outra forma?

Obrigado.

 

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado
16 horas atrás, Valdir Dill disse:

Boa noite,

Segui as instruções e parece que houve progresso.

O valor de AuxNode agora é diferente de nil e NumNFse tem valor 680, corretamente.

Uma dúvida: como recupero o número da nota. Pelo que entendi, deveria pegar essa informação pela ACBrNFSeX1.NotasFiscais.Items[0].NFSe.Numero, isso após fazer a consulta. Mas essa propriedade não está sendo alimentada.

Ou seria outra forma?

Obrigado.

 

Não sei se tem a ver, mas, na linha AItemIndex := FindObject(AItem, TComparer<TObject>.Construct(CompNFSePorNumero)), após essa linha ser executada, o AItemIndex fica com valor -1. Vide print anexo.

ACbr.png

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado
1 hora atrás, Italo Giurizzato Junior disse:

Boa tarde Valdir,

Após realizar a consulta o XML da NFS-e é salvo em disco na pasta Notas?

Boa noite,

Sim. Mas o nome do arquivo recebe apenas o sufixo "-NFse", conforme print anexo.

Também estou anexando o XML que é salvo nessa pasta \Notas\.

Obrigado

Acbr.png

-nfse.xml

Valdir Dill

Rio de Janeiro - RJ

 

 

×
×
  • 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.