Ir para conteúdo
  • Cadastre-se

dev botao

Consulta NFSe trazendo 50 NSU mas no loop carrega apenas 20 notas.


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

Recommended Posts

Postado

Boa tarde, Pessoal.

Estou fazendo uma consulta de notas de serviço no ambiente nacional, a partir de um NSU. após executar a consulta gravo o JSON retornado no banco de dados.

Posteriormente faço o processamento desse resultado que ainda está no JSON. A procedure abaixo faz o processamento.

Na consulta que faço o teste, são retornadas 50 NSU, 49 NFSe e 1 Evento.

Na hora de carregar os documentos e fazer o loop através de "NFSe.NotasFiscais.Count" só constam 20 notas.

mas no resumo todas as notas constam normalmente, e também são salvos os XML na pasta corretamente.

Só não entendi porque apenas 20 notas são carregadas no Objeto NotasFiscais.

Fiz o teste com a aplicação de exemplo do lazarus, e tive o mesmo resultado.

estou imaginando que tenha algum limite na quantidade de notas que o componente pode carregar de uma vez, mas não encontrei nada nos fontes.

ou talvez eu esteja fazendo algo errado.

agradeço qualquer ajuda.

Procedure que utilizo para fazer o tratamento do retorno do JSON:

procedure TDMDFe.ProcessNFSeCons(const IdNFSeCons: LargeInt);
var
  NFSe: TACBrNFSeX;
  Retorno: TNFSeConsultarDFeResponse;
  StreamJson: TStringStream;
  Provider: TMyProvider;
  I: Integer;
begin
  QNFSeCons.Close;
  QNFSeCons.ParamByName('id_nfse_cons').AsInteger := idNFSeCons;
  QNFSeCons.Open;

  Retorno := TNFSeConsultarDFeResponse.Create;
  StreamJson := TStringStream.Create;
  NFSe := CreateNFSeX(QNFSeConsdoc_pessoa.Value);
  Provider := TMyProvider.Create(NFSe);  //extende TACBrNFSeProviderPadraoNacional

  try
    QNFSeConsjson.SaveToStream(StreamJson);
    Retorno.ArquivoRetorno := StreamJson.DataString;
    Provider.TrataRetorno(Retorno);    //chama TACBrNFSeProviderPadraoNacional.TratarRetornoConsultarDFe(Response);

    try
      DMMysql.ZConn.StartTransaction;

      QNFSeCons.Edit;
      QNFSeConsjson_proc.Value := 'S';
      QNFSeCons.Post;

      //esse for só carrega 20 notas do total de 50 retornadas no JSON
      for I:=0 to NFSe.NotasFiscais.Count-1 do
      begin
        QXMLNFSe.Close;
        QXMLNFSe.Open;
        QXMLNFSe.Insert;
        QXMLNFSedoc_pessoa.Value := QNFSeConsdoc_pessoa.Value;
        QXMLNFSechave.Value := OnlyNumbers(NFSe.NotasFiscais.Items[I].NFSe.infNFSe.ID);
        SetBlobFieldValueAsStream(QXMLNFSexml, NFSe.NotasFiscais.Items[I].XmlNfse);
        QXMLNFSexml_proc.Value := 'N';
        QXMLNFSe.Post;
      end;

      //no resumo aparece as 50 notas normalmente
      for I:=0 to Retorno.Resumos.Count-1 do
      begin
        QNFSeConsItem.Close;
        QNFSeConsItem.Open;
        QNFSeConsItem.Insert;
        QNFSeConsItemchave.Value := Retorno.Resumos.Items[I].ChaveDFe;
        QNFSeConsItemtipodoc.Value := Retorno.Resumos.Items[I].TipoDoc;
        QNFSeConsItemnsu.Value := Retorno.Resumos.Items[I].NSU.ToString;
        QNFSeConsItem.Post;
      end;

      for I:=0 to Retorno.Erros.Count-1 do
      begin
        QNFSeConsMensagem.Close;
        QNFSeConsMensagem.Open;
        QNFSeConsMensagem.Insert;
        QNFSeConsMensagemtipo.Value := 'ERRO';
        QNFSeConsMensagemcodigo.Value := Retorno.Erros.Items[I].Codigo;
        QNFSeConsMensagemdescricao.Value := Retorno.Erros.Items[I].Descricao;
        QNFSeConsMensagemcorrecao.Value := Retorno.Erros.Items[I].Correcao;
        QNFSeConsMensagem.Post;
      end;

      for I:=0 to Retorno.Alertas.Count-1 do
      begin
        QNFSeConsMensagem.Close;
        QNFSeConsMensagem.Open;
        QNFSeConsMensagem.Insert;
        QNFSeConsMensagemtipo.Value := 'ALERTA';
        QNFSeConsMensagemcodigo.Value := Retorno.Alertas.Items[I].Codigo;
        QNFSeConsMensagemdescricao.Value := Retorno.Alertas.Items[I].Descricao;
        QNFSeConsMensagemcorrecao.Value := Retorno.Alertas.Items[I].Correcao;
        QNFSeConsMensagem.Post;
      end;

      DMMysql.ZConn.Commit;
    except
      DMMysql.ZConn.Rollback;
      raise;
    end;
  finally
    Provider.Free;
    NFSe.Free;
    StreamJson.Free;
    Retorno.Free;
  end;
end; 

 

  • Consultores
Postado

Boa tarde Fabiano,

Abra todos os XML das notas salvas em disco e verifique se não tem XMLs com numero de DPS repetido.

Pois o componente verifica somente o numero do DPS para decidir se vai adicionar a lista ou não.

  • Curtir 1
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. É isso mesmo Italo.

As notas retornadas no loop (aquelas 20) não repetem numeração do DPS, enquanto que nos xml no disco várias tem numeração repetida.

tem muita nota com numeração baixa, que acabou repetido entre diferentes Prestadores de Serviço.

Minha dúvida agora é como conseguir tratar esses casos, Quando diferentes Prestadores de Serviço tem mesmo numero de DPS.

Vou dar uma estudada nos fontes pra tentar identificar se consigo contornar isso, qualquer coisa aviso aqui, mas se alguém tiver uma ideia de como resolver agradeço.

Abraços.

  • Consultores
Postado

Fabiano,

O componente só leva em consideração o numero do DPS.

Podemos ter 2 situações neste caso:

1. Mesmo Prestador, numero de DPS igual com série diferente.

2. Prestadores diferentes com numero de DPS iguais.

A checagem vai ter que levar em consideração o CNPJ do Prestador, o numero do DPS e a série quando for executado o método ConsultarDFe.

  • Curtir 1
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

Exatamente, Italo. São esses os casos que precisam ser tratados.

No momento, pra atender a minha necessidade mais imediata, vou implementar da seguinte maneira no meu software:

Consulto pelo último NSU e depois confiro quais as notas que estão no resumo não foram incluídas no objeto NotasFiscais.

Ai com essa lista vou ter que fazer pra cada xml não carregado, importar através do xml em disco ou fazer uma busca individual dos xml por chave.

Assim consigo pelo menos por hora garantir que vou ter os xml das notas e as NSU não ficarem faltantes na minha base.

depois vou analisar com mais calma se consigo alterar o componente pra ter o comportamento esperado.

Caso eu tenha sucesso ou dúvidas comunico aqui.

Valeu. Muito obrigado.

  • Consultores
Postado

Bom dia Fabiano,

Vamos fazer a seguinte alteração:

Abra a unit PadraoNacional.Provider;

Procure pela procedure: TratarRetornoConsultarDFe;

Nessa procedure procure pela linha abaixo: 

                ANota := TACBrNFSeX(FAOwner).NotasFiscais.FindByRps(NumRps);

deve ser a linha 1024.

Altere ela deixando da seguinte forma:

                ANota := TACBrNFSeX(FAOwner).NotasFiscais.FindByRps('-1');

O que esta ocorrendo, na variável NumRps temos o numero do DPS, caso ele já tenha carregado outra nota com o mesmo numero essa segunda vai se sobrepor, ou seja, você perde os dados da primeira lida.

Por outro lado passando um valor fixo "-1" para o numero do DPS ele nunca vai encontra, logo ele sempre vai adicionar a nota retornado.

Assim eu espero.

Faça a alteração, reinstale o ACBr e faça um novo teste.

  • Curtir 2
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

  • Solution
Postado

Boa tarde, Italo.

Eu estou fazendo as alterações no componente, considerando serie, cnpj e numero, como sugerido inicialmente.

Fiz as alterações, recompilei e reinstalei.

A principio funcionou 100%. Fiz os testes no delphi e no lazarus.

foram 3 units alteradas. vou colocar aqui pra sua avaliação:

1- ACBrNFSeXNotasFiscais.pas
2- PadraoNacional.Provider.pas
3- ACBrJSON.pas

nos pontos onde os arquivos foram alterados incluí o comentário //alt fabiano

preciso só testar pra ter certeza que notas realmente repetidas, ou seja, mesmo fornecedor, serie e numero não sejam incluídas.

mas nos casos de mesmo numero e fornecedores diferente, que é o problema a principio, ficou resolvido, funcionou 100%. 

ainda vou fazer mais alguns testes e qualquer coisa comunico aqui.

o arquivo ACBrJSON.pas teve apenas um problema especifico do lazarus, que estava retornando nil, em um objeto que tentava chamar um método do objeto, gerando um access violation. Apenas incluí uma verificação.

 

ACBrJSON.pas ACBrNFSeXNotasFiscais.pas PadraoNacional.Provider.pas

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