Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Eu estou com o seguinte problema, quando eu envio uma NF-e pelo comando ACBrNFe1.Enviar(_tlote.fieldbyname('lote').AsString, false); e ocorre uma Rejeição por NF-e duplicada ou alguma outra rejeição, o próprio AcbrNfe dispara uma raise exception.

Com isso a operação abortada e é executado o finally, mas o que eu queria é que mesmo que tivesse uma rejeição eu gravasse o motivo e o código do status no banco, eu poderia resolver isso retirando o try finally, mas eu preciso forçar a execução do que esta no finally caso ocorra algum erro.

Alguém tem alguma ideia de como posso fazer isso de forma simples e eficiente?


try

   Timer2.Enabled := false; //Desliga o Timer que atualiza as notas que estão entrando.

   CoolBar1.Enabled := false;

   cxPageControl1.Enabled := false;

   Edit1.Enabled := false;

   ActivateMenu(false);


   // N - Não deixa imprimir NF-e com data de emissão diferente da data atual

   if(_tcad_filial.fieldbyname('emis_dtatual').AsString = 'N')and(_tcad_filial.FieldByName('tpemis').AsInteger = 1)then

   begin

     if (_tnota_fiscal_saida.FieldByName('demi').AsDateTime <> Date) then

     begin

       Application.MessageBox('Não podem serem enviadas NFes com data de emissão diferente da data atual, ' + #13 +

       'por favor, solicite a um superior o Inutilização desta NFe.','ATENÇÃO',MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1);

       abort;

     end;

   end;


   ACBrNFe1.Enviar(_tlote.fieldbyname('lote').AsString, false);


   try                                                                                                   

      _inserir.Active := false;                                                                           

      _inserir.SQL.Clear;                                                                                 

      _inserir.SQL.Add('update notafiscal_e.bloco_a set');                                                

      if(ACBrNFe1.WebServices.Retorno.cStat = 100)and(ACBrNFe1.WebServices.Retorno.Protocolo <> null)then 

         _inserir.SQL.Add('status     = ' + QuotedStr('2') + ', ');                                        

      if(ACBrNFe1.WebServices.Retorno.cStat <> null)then                                                  

         _inserir.SQL.Add('cstatus    = ' + IntToStr(ACBrNFe1.WebServices.Retorno.cStat) + ', ')           

      else                                                                                                

         _inserir.SQL.Add('cstatus    = null,');                                                           

      _inserir.SQL.Add('xstatus    = ' + QuotedStr(ACBrNFe1.WebServices.Retorno.xMotivo));                

      _inserir.SQL.Add('where infnfe = ' + _tnota_fiscal.fieldbyname('infnfe').AsString);                 

      _inserir.SQL.Add(';commit;');                                                                       

      _inserir.ExecSQL;                                                                                   

   except                                                                                                

      UServico.verifica_erro(1, _inserir.SQL.Text, true);                                                 

      abort;                                                                                              

   end;


finally

   //Timer2.Enabled := true;

   CoolBar1.Enabled := true;

   cxPageControl1.Enabled := true;

   Edit1.Enabled := true;

   ActivateMenu(true);

   ACBrNFeDANFERave1.MostrarPreview := true;

   ACBrNFe1.NotasFiscais.Clear;

   _tnota_fiscal_saida.Requery;

end;

Att.

Carlos Fitl.

Postado

O comando "ACBrNFe1.Enviar" é um comando que executa vários outros comandos automaticamente. Te aconselho a debugar este comando para ver quais são estes outros comandos e fazer o envio das notas comando a comando. Desta maneira, assim que ele disparar a raise, você a captura, salva a informação no banco de dados e pode mandar continuar o processamento das notas seguintes.

Peterson de Cerqueira Matos
[email protected]
Vivo: (11) 97197-1474 / Oi: (11) 98059-4055

Postado

E eu não postei todo o código, pois, ele é muito grande, o que ocorre é que eu tenho um try dentro de outro, e quando é chamado o raise ele executa o tratamento de excessão do ACBrNFe1.Enviar(_tlote.fieldbyname('lote').AsString,false); e pula para o finally, eu gostaria que ele executa-se o segundo tratamento de excessão.


try

   Timer2.Enabled := false; //Desliga o Timer que atualiza as notas que estão entrando.

   CoolBar1.Enabled := false;

   cxPageControl1.Enabled := false;

   Edit1.Enabled := false;

   ActivateMenu(false);


   try

      ACBrNFe1.Enviar(_tlote.fieldbyname('lote').AsString,false);                                             

   except 

      on Erro: Exception do                                   

      begin                                                   

         msgErro := Erro.Message;                                     

         Application.CreateForm(Tform_erro_nfe, form_erro_nfe);

         form_erro_nfe.vmsg_erro := msgErro;                   

         form_erro_nfe.ShowModal;                              

         form_erro_nfe.Free;  

      end;                                                             

   end;


   try                                                                                                   

      _inserir.Active := false;                                                                           

      _inserir.SQL.Clear;                                                                                 

      _inserir.SQL.Add('update notafiscal_e.bloco_a set');                                               

      if(ACBrNFe1.WebServices.Retorno.cStat = 100)and(ACBrNFe1.WebServices.Retorno.Protocolo <> null)then

         _inserir.SQL.Add('status     = ' + QuotedStr('2') + ', ');                                       

      if(ACBrNFe1.WebServices.Retorno.cStat <> null)then                                                 

         _inserir.SQL.Add('cstatus    = ' + IntToStr(ACBrNFe1.WebServices.Retorno.cStat) + ', ')           

      else                                                                                               

         _inserir.SQL.Add('cstatus    = null,');                                                           

      _inserir.SQL.Add('xstatus    = ' + QuotedStr(ACBrNFe1.WebServices.Retorno.xMotivo));               

      _inserir.SQL.Add('where infnfe = ' + _tnota_fiscal.fieldbyname('infnfe').AsString);                 

      _inserir.SQL.Add(';commit;');                                                                       

      _inserir.ExecSQL;                                                                                   

   except                                                                                               

      UServico.verifica_erro(1, _inserir.SQL.Text, true);                                                 

      abort;                                                                                             

   end;


finally

   //Timer2.Enabled := true;

   CoolBar1.Enabled := true;

   cxPageControl1.Enabled := true;

   Edit1.Enabled := true;

   ActivateMenu(true);

   ACBrNFeDANFERave1.MostrarPreview := true;

   ACBrNFe1.NotasFiscais.Clear;

   _tnota_fiscal_saida.Requery;

end;

Att.

Carlos Fitl.

  • 2 anos depois...
Postado

O problema que eu vejo é que, se a função enviar tem um retorno do tipo boolean, então ou pode resultar em True ou em False.

Porém este comando só te dar condição de tratar execução sucedida. Execução 100% rejeitada ele aborta.

 

No meu caso, eu preciso pegar o retorno mesmo que todo o lote tenha sido rejeitado pra...

Identificar as NF-e onde o cStat=204(Duplicidade) pra possibilitar a recuperação do protocolo das mesmas e remontá-las.

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