Ir para conteúdo
  • Cadastre-se

dev botao

Dúvida De Melhoria No Tratamento De Retorno Da Receita


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

Recommended Posts

Boa noite a todos primeiramente, estou com uma dúvida devido a um problema que ocorreu nesses tempos que a receita(PR) estava ociosa, funcionava e parava, aconteceu a seguinte situação, supondo que o cliente selecionou duas notas para o envio, o sistema enviava as mesma e tudo ok, só que o cliente me questionou que quando imprimi a X sai os dados da Y, quando fui perceber e não sei porque as duas notas estava com a mesma chave e etc, ou seja, os dados do retorno do werService iguais, agora Não sei se é o processo que faço ou a receita, na dúvida irei colocar um pedaço do meu código para analisarem :

 

 

Lembrando que outra coisa que reparei que o ACBr somente gravou os arquivo "-env-lot.xml" e "-rec.xml".

  if ((trim(cds_nota.fieldbyname('nfe_resultado').asstring) <> '100')  and
      (trim(cds_nota.fieldbyname('nfe_resultado').asstring) <> '110')  and
      (trim(cds_nota.fieldbyname('nfe_resultado').asstring) <> '301')  and
      (trim(cds_nota.fieldbyname('nfe_resultado').asstring) <> '302')  and
      (trim(cds_nota.fieldbyname('nfe_resultado').asstring) <> '101')) then begin
    acbrnfe.Enviar(numero_nota,false);

"--> Aqui está o X da questão, quero que independe do resultado o sistema grave em uma tabela o retorno nota a nota."
    if (acbrnfe.WebServices.Retorno.NFeRetorno <> nil) then begin
      atualiza_pfnfe_status(cod_empr,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].cStat,
                            trunc(numero),
                            cod_evento,
                            numero,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].xMotivo,
                            tipo,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].chNFe,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].nProt,
                            acbrnfe.WebServices.Retorno.NFeRetorno.nRec,'');

      if acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].cStat = 100 then begin
        acbrnfe_danfe_cb.NumCopias := emi.num_cop;
        acbrnfe.NotasFiscais.Imprimir;

Ricardo Rodrigues
Analista Desenvolvedor  – Arapongas - PR
+[email protected]
(: (43) 99917-9907

Link para o comentário
Compartilhar em outros sites

Bom dia,

 

Quando da-se o retorno do envio, você não esta percorrendo os protocolos e atualizando nota por nota. Faça o seguinte:

 



  for i := 0 to acbr.NotasFiscais.Count-1 do
  begin
    if acbr.NotasFiscais.Items[i].Confirmada then
    begin
      // aqui salva os dados
      qryX.parameters.parambyName('protocolo').value :=  acbr.NotasFiscais.Items[i].NFe.procNFe.nProt;
      // .....
    end;
  end;

ou você ainda pode percorrer os itens retornados no 

 

for i := 0 to acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.count -1 do

begin

 // salva os itens

// -->acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.items

end;

 

 

espero q tenha ajudado

Editado por Roberto.Godinho
Link para o comentário
Compartilhar em outros sites

Bom dia,

 

Quando da-se o retorno do envio, você não esta percorrendo os protocolos e atualizando nota por nota. Faça o seguinte:

 


  for i := 0 to acbr.NotasFiscais.Count-1 do
  begin
    if acbr.NotasFiscais.Items[i].Confirmada then
    begin
      // aqui salva os dados
      qryX.parameters.parambyName('protocolo').value :=  acbr.NotasFiscais.Items[i].NFe.procNFe.nProt;
      // .....
    end;
  end;

ou você ainda pode percorrer os itens retornados no 

 

for i := 0 to acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.count -1 do

begin

 // salva os itens

// -->acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.items

end;

 

 

espero q tenha ajudado

 

 

Bom dia Roberto, estou atualizando o protocolo na nota sim. conforme a linha em negrito abaixo :

      atualiza_pfnfe_status(cod_empr,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].cStat,
                            trunc(numero),
                            cod_evento,
                            numero,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].xMotivo,
                            tipo,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].chNFe,
                            acbrnfe.WebServices.Retorno.NFeRetorno.ProtNFe.Items[0].nProt,
                            acbrnfe.WebServices.Retorno.NFeRetorno.nRec,'');

Ricardo Rodrigues
Analista Desenvolvedor  – Arapongas - PR
+[email protected]
(: (43) 99917-9907

Link para o comentário
Compartilhar em outros sites

Bom dia Ricardo, 

 

como seria realizado o laço de repetição quando o cliente seleciona mais de uma nota?

 

Considere Arquivos sendo do tipo TStringList onde neste caso carregaria o(s) caminho(s) do(s) arquivo(s) xml desejado(s). Seria algo como:

for I := 0 to Arquivos.Count -1 do
begin
  ACBrNFe1.NotasFiscais.Clear;
  ACBrNFe1.NotasFiscais.Add;
  ACBrNFe1.NotasFiscais.LoadFromFile(Arquivos[I]);
  ...
  //aqui você realiza os processos desejados referente aos arquivos XMLs ou afins
 end;

Caso você não utilize o Clear dentro do laço de repetição para carregar cada XML selecionado, no caso de mais de um xml selecionado, você terá que utilizar conforme o Roberto mencionou acima.

 

PS. O código que montei acima foi somente em caráter de exemplificação.

 

Att.

Rômulo Mayworm

"Não me envergonho de mudar de opinião, porque não me envergonho de pensar" (Blaise Pascal)

Link para o comentário
Compartilhar em outros sites

Exatamente como o Romulo exemplificou acima, se você faz o envio de uma a uma você deverá carregar uma, efetuar o envio, tratar o retorno, limpar novamente e fazer o mesmo processo pra proxima.

 

Se teu sistema esta registrando mais do que uma nota com os mesmo dados de retorno significa que você não esta limpando os dados anteriores do componente, neste caso, o index 0 será sempre a primeira nota que você enviou.

Link para o comentário
Compartilhar em outros sites

Boa tarde pessoal, após analisar meus fontes contatei que ja faço esse procedimento de limpar o componente antes de enviar uma outra nota, o detahe que isso somente acontece quando o recibo vem conforme anexo :

 

 

120899-rec.xml

Ricardo Rodrigues
Analista Desenvolvedor  – Arapongas - PR
+[email protected]
(: (43) 99917-9907

Link para o comentário
Compartilhar em outros sites

Segue em anexo.
 
Só uma observação, na unit ACBrNFeWebService eu comentei os raize, porque não quero que estore o erro na tela pro cliente, independente do resultado, quero gravar o mesmo nomeu banco. Segue código da unit citada :
 
  if not(Self.Enviar.Executar) then
     begin
       if Assigned(TACBrNFe( FACBrNFe ).OnGerarLog) then
          TACBrNFe( FACBrNFe ).OnGerarLog(Self.Enviar.Msg);
         exit;//raise EACBrNFeException.Create(Self.Enviar.Msg);
     end;
 
  if (FConfiguracoes.Geral.ModeloDF = moNFe) or (not ASincrono) then
   begin
    Self.Retorno.Recibo := Self.Enviar.Recibo;
    if not(Self.Retorno.Executar) then
       begin
         if Assigned(TACBrNFe( FACBrNFe ).OnGerarLog) then
            TACBrNFe( FACBrNFe ).OnGerarLog(Self.Retorno.Msg);
           exit;//raise EACBrNFeException.Create(Self.Retorno.Msg);
       end;
   end;

fonte.pas

Editado por ricardo_casc

Ricardo Rodrigues
Analista Desenvolvedor  – Arapongas - PR
+[email protected]
(: (43) 99917-9907

Link para o comentário
Compartilhar em outros sites

Os fontes que você envio são os mesmo que você colou acima, com os fontes que você enviou não da pra gente saber oque esta carregando no componente e oque poderia estar acontecendo. 

 

 

 

edit:

Vi que você alterou a unit ACBrNFeWebService, ao invés de você altera-la você deveria tratar com try except a chamada de envio.

try
  xEnviar := acbrnfe.Enviar(numero_nota,false);
Except
  on e: exception do
  begin
    //...
  end;
end;
Editado por Roberto.Godinho
Link para o comentário
Compartilhar em outros sites

Ressaltando o que o Roberto disse: precisamos da parte do fonte a qual carrega o xml para o componente, aquela parte onde você faz o laço para "varrer" os selecionados, limpar o componente AcbrNFe e carregar os selecionados.

 

Att.

 

 

Os fontes que você envio são os mesmo que você colou acima, com os fontes que você enviou não da pra gente saber oque esta carregando no componente e oque poderia estar acontecendo. 

"Não me envergonho de mudar de opinião, porque não me envergonho de pensar" (Blaise Pascal)

Link para o comentário
Compartilhar em outros sites

Ressaltando o que o Roberto disse: precisamos da parte do fonte a qual carrega o xml para o componente, aquela parte onde você faz o laço para "varrer" os selecionados, limpar o componente AcbrNFe e carregar os selecionados.

 

Att.

 

Então o anexo que nos passou não contem o laço do cds_nota, disponibilize o início do tratamento, onde você seleciona do primeiro registro realizando o loop até o último selecionado pelo usuário, contendo a parte onde você carrega a var numero_nota e também onde você atribui as informações ao acbrnfe.

 

Att.

"Não me envergonho de mudar de opinião, porque não me envergonho de pensar" (Blaise Pascal)

Link para o comentário
Compartilhar em outros sites

bom, pelo que deu pra perceber no seu código esta faltando mesmo limpar o componente acbr após o processamento de cada uma das NF-e's pois toda vez que você executa a função "acbrnfe.notasfiscais.add.nfe" 1 novo item será adicionado ao collection acbrnfe.notasfiscais, assim, quando você for fazer o envio e tratar o retorno, se você acessar pelo index [0] você estará processando novamente a primeira nf-e enviada.
 
faça o seguinte pra confirmar:
Após a linha "with acbrnfe.notasfiscais.add.nfe do begin" coloque o comando ShowMessage(intToStr(acbrnfe.notasfiscais.Count));
 
selecione mais de 1 nota e efetue o envio, no segundo showmessage ele deverá apresentar apenas 1, se mostrar mais do que isso então o componente não esta sendo descaregado antes de processar a proxima nfe.
 
para corrigir basta substituir o ShowMessage acima por acbrnfe.notasfiscais.Clear;
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

bom, pelo que deu pra perceber no seu código esta faltando mesmo limpar o componente acbr após o processamento de cada uma das NF-e's pois toda vez que você executa a função "acbrnfe.notasfiscais.add.nfe" 1 novo item será adicionado ao collection acbrnfe.notasfiscais, assim, quando você for fazer o envio e tratar o retorno, se você acessar pelo index [0] você estará processando novamente a primeira nf-e enviada.
 
faça o seguinte pra confirmar:
Após a linha "with acbrnfe.notasfiscais.add.nfe do begin" coloque o comando ShowMessage(intToStr(acbrnfe.notasfiscais.Count));
 
selecione mais de 1 nota e efetue o envio, no segundo showmessage ele deverá apresentar apenas 1, se mostrar mais do que isso então o componente não esta sendo descaregado antes de processar a proxima nfe.
 
para corrigir basta substituir o ShowMessage acima por acbrnfe.notasfiscais.Clear;

 

Na verdade ele terá de colocar "acbrnfe.notasfiscais.Clear;" na linha anterior a "with acbrnfe.notasfiscais.add.nfe do begin" ...

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • 7 meses depois ...
  • 8 meses depois ...

Olá senhores estou precisando de uma ajuda para o seguinte:

 

-estou consultando uma nfe vinda de outro estado para meu cliente, notas do mesmo estado sem problemas, mas notas que vem de outro estado,

me retorno o status 226, sei que é falha por não selecionar a uf corretamente.

 

-Minha dúvida é onde eu configuro o webservice de acordo com a UF do emitente?

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

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