Ir para conteúdo
  • Cadastre-se

dev botao

Como Tratar O Envio Da Nfe


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

Recommended Posts

Preciso saber como tratar o envio da Nfe qdo ocorrer um time out no envio. Me ocorreu com varios cliente da minha empresa que ao enviar deu uma certa demora e ocorreu um time out ai nao grava o retorno e ao tentar enviar novamente retorna que esta em duplicidade, 

Ai eu tento consultar com a chave fala que nao exista na base.

Entao eu preciso saber:

 

- Qual o melhor parametro pra intervalo de tentativas e numero de tentativas.

 

- Como tratar o envio. Veja meu codigo:

 

Try
    DM_NFE.ACBrNFe1.Enviar(0,False);
 
    // inserir evento na tabela nfe_eventos
    DM.QCuringa.Close;
    DM.QCuringa.SQL.Text:='Insert Into nfe_eventos(id_nfe,xml,data,protocolo,historico,chave,codigo_status,ambiente)';
    DM.QCuringa.SQL.Add('Values(:id_nfe,:xml,:data,:protocolo,:historico,:chave,:codigo_status,:ambiente)');
    DM.QCuringa.ParamByName('id_nfe').AsInteger       :=QNotaid_nfe.AsInteger;
    DM.QCuringa.ParamByName('Xml').Value                :=DM_NFE.ACBrNFe1.NotasFiscais.Items[0].XML;
    DM.QCuringa.ParamByName('data').AsDateTime      :=DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NFe.procNFe.dhRecbto;
    DM.QCuringa.ParamByName('Protocolo').AsString     :=DM_NFE.ACBrNFe1.WebServices.Retorno.Protocolo;
    DM.QCuringa.ParamByName('Chave').AsString         :=DM_NFE.ACBrNFe1.WebServices.Retorno.ChaveNFe;
    DM.QCuringa.ParamByName('codigo_status').AsInteger:=DM_NFE.ACBrNFe1.WebServices.Retorno.cStat;
    DM.QCuringa.ParamByName('ambiente').AsInteger     :=QNotaambiente.AsInteger;
    If QNotaambiente.AsInteger=1 then
      DM.QCuringa.ParamByName('historico').AsString     :='ENVIO DA NFE EM PRODUCAO'
    else
      DM.QCuringa.ParamByName('historico').AsString     :='ENVIO DA NFE EM HOMOLOGAÇÃO';
    DM.QCuringa.ExecSQL;
 
       //enviar email
       DM_NFE.EnviaEmailACBRDireto(QNotaid_nfe.AsInteger,'SUA NFE '+QNotanf.AsString);
     end;
 
     //imprimir
     DM_NFE.ACBrNFe1.NotasFiscais.Imprimir;
   except
    on e:Exception do
     begin
       btnEnviar.Enabled:=True;
 
       if (DM_NFE.ACBrNFe1.WebServices.Retorno.cStat=105) or (pos('LOTE EM PROCESSAMENTO',uppercase(e.message))>0) then
        begin
          // caso ocorra um erro o sistema salva a chave para futuras consultas
          DM.QCuringa.Close;
          DM.QCuringa.SQL.Text:='Insert Into nfe_eventos(id_nfe,data,historico,chave,codigo_status,ambiente)';
          DM.QCuringa.SQL.Add('Values(:id_nfe,:data,:historico,:chave,:codigo_status,:ambiente)');
          DM.QCuringa.ParamByName('id_nfe').AsInteger       :=QNotaid_nfe.AsInteger;
          DM.QCuringa.ParamByName('data').AsDateTime        :=Date;
          DM.QCuringa.ParamByName('Chave').AsString         :=xChave;
          DM.QCuringa.ParamByName('codigo_status').AsInteger:=DM_NFE.ACBrNFe1.WebServices.Retorno.cStat;
          DM.QCuringa.ParamByName('ambiente').AsInteger     :=QNotaambiente.AsInteger;
          DM.QCuringa.ParamByName('historico').AsString     :='LOTE EM PROCESSAMENTO';
          DM.QCuringa.ExecSQL;
        end
       ELSE
        begin
          DM.QCuringa.Close;
          DM.QCuringa.SQL.Text:='Insert Into nfe_eventos(id_nfe,data,historico,chave,codigo_status,ambiente)';
          DM.QCuringa.SQL.Add('Values(:id_nfe,:data,:historico,:chave,:codigo_status,:ambiente)');
          DM.QCuringa.ParamByName('id_nfe').AsInteger       :=QNotaid_nfe.AsInteger;
          DM.QCuringa.ParamByName('data').AsDateTime        :=Date;
          DM.QCuringa.ParamByName('Chave').AsString         :=xChave;
          DM.QCuringa.ParamByName('codigo_status').AsInteger:=DM_NFE.ACBrNFe1.WebServices.Retorno.cStat;
          DM.QCuringa.ParamByName('ambiente').AsInteger     :=QNotaambiente.AsInteger;
          DM.QCuringa.ParamByName('historico').AsString     :='OCORREU UM ERRO AO ENVIAR';
          DM.QCuringa.ExecSQL;
        end;
     end;
   end;

 

Grato

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde,

 

Ai que esta o problema, depois do envio se ocorre um timeout, não se deve enviar novamente e sim realizar uma consulta.

 

Se o problema foi no retorno, a consulta vai retornar o resultado do processamento da nota.

 

Agora se problema ocorreu durante o envio a consulta vai retornar que a nota não existe, ai sim você tenta o envio novamente.

  • Curtir 1
Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Ola boa tarde Italo.

 

Mas isto vc faz automaticamente , ou seja, ao ocorrer um time out vc automaticamente gera uma consulta e trata isto , ou se deixa para o usuario tratar isto manualmente???

 

Agora por exemplo estou num cliente e notamos que esta muito lento para enviar, demora muito, antes na versao 2.1 era rapido o envio. Tem algum outro parametro para aplicar???

 

Grato

Link para o comentário
Compartilhar em outros sites

  • Consultores

Esse processo na minha aplicação é manual.

 

Como não ocorre a impressão do DANFE o usuário já sabe que algo de errado ocorreu, alem de aparecer na tela uma mensagem apontando o problema.

 

O componente possui algumas configurações tais como Numero de tentativas, tempo de espera antes da primeira consulta, tempo de espera entre uma tentativa e outra.

 

Você pode mudar essa configuração visando resolver esse problema.

 

A principio o componente realiza no máximo 5 tentativas, você pode alterar para 10, por exemplo.

 

Com certeza isso vai demandar mais tempo, mas derepente logo na sexta tentativa o componente consegue a resposta da SEFAZ.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Ola boa tarde Italo.

 

Eu estava importando o XML para gravar em disco e estava fazendo da seguinte forma:

 

       DM.QCuringa2.Close;
       DM.QCuringa2.SQL.Text:='Insert Into nfe_eventos(id_nfe,xml,data,protocolo,historico,chave,codigo_status,ambiente)';
       DM.QCuringa2.SQL.Add('Values(:id_nfe,:xml,:data,:protocolo,:historico,:chave,:codigo_status,:ambiente)');
       DM.QCuringa2.ParamByName('id_nfe').AsInteger          :=dm.QCuringa.FieldByName('id_nfe').AsInteger;
       DM.QCuringa2.ParamByName('Xml').LoadFromFile(DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NomeArq,ftMemo);
       DM.QCuringa2.ParamByName('data').AsDateTime          :=DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NFe.procNFe.dhRecbto;
       DM.QCuringa2.ParamByName('Protocolo').AsString         :=DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NFe.procNFe.nProt;
       DM.QCuringa2.ParamByName('Chave').AsString             :=DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NFe.procNFe.chNFe;
       DM.QCuringa2.ParamByName('codigo_status').AsInteger:=DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NFe.procNFe.cStat;
       (...)
Ai nao estava gravando o  dhRecbto, nProt, chNFe e cStat (isto vindo do XML autorizado)
 
ai mudei o codigo para:
 
with DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NFe do
     begin
       DM.QCuringa2.Close;
       DM.QCuringa2.SQL.Text:='Insert Into nfe_eventos(id_nfe,xml,data,protocolo,historico,chave,codigo_status,ambiente)';
       DM.QCuringa2.SQL.Add('Values(:id_nfe,:xml,:data,:protocolo,:historico,:chave,:codigo_status,:ambiente)');
       DM.QCuringa2.ParamByName('id_nfe').AsInteger       :=dm.QCuringa.FieldByName('id_nfe').AsInteger;
       DM.QCuringa2.ParamByName('Xml').LoadFromFile(DM_NFE.ACBrNFe1.NotasFiscais.Items[0].NomeArq,ftMemo);
       DM.QCuringa2.ParamByName('data').AsDateTime         :=procNFe.dhRecbto;
       DM.QCuringa2.ParamByName('Protocolo').AsString        :=procNFe.nProt;
       DM.QCuringa2.ParamByName('Chave').AsString            :=procNFe.chNFe;
       DM.QCuringa2.ParamByName('codigo_status').AsInteger:=procNFe.cStat;
     end;
 
ai neste caso veio as informações corretamente, agora eu pergunto , nao seria a mesma coisa fazendo a referencia direto ou usando o With???????????
 
 
Grato
Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde,

 

Tenho varias rotinas que atualizam o banco de dados com informações lidas do XML e funciona perfeitamente bem da primeira forma que você apresentou, ou seja, sem o With.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Bom dia Italo.

Tenho uma outra duvida em relacao a tratar o retorno. 

 

Apos enviar hj eu estou fazendo a seguinte checagem:

 

If DM_NFE.ACBrNFe1.NotasFiscais.Items[0].Confirmada Then 

 {..} Salvo no banco

 

Isto esta correto ou deveria usar:

 

if (DM_NFE.ACBrNFe1.WebServices.Retorno.cStat=100 Then

 {..} Salvo no banco

 

Grato

LUMORAES

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia,

 

Na minha aplicação utilizo:

 

if (DM_NFE.ACBrNFe1.WebServices.Retorno.cStat=100 Then

 {..} Salvo no banco

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

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