Ir para conteúdo
  • Cadastre-se

dev botao

Duvida sobre TDistribuicaoDFe.TratarResposta


Ver Solução Respondido por Juliomar Marchetti,

Recommended Posts

Postado

Tenho a seguinte situação quando faço isso

 try
   if ACBrDFe.DistribuicaoDFePorUltNSU(ACBrDFe.Configuracoes.WebServices.UFCodigo,
                                            ACBrDFe.SSL.CertCNPJ, IntToStr(iUltimoNSU)) then
   begin
    // retorno True
   end
   else
   begin
     // retorno False
   end;
except
  // estou tendo que tratar o cStat 656 aqui
end;
 

Verifiquei que em TDistribuicaoDFe.TratarResposta 

Result := (FretDistDFeInt.CStat = 137) or (FretDistDFeInt.CStat = 138);


Creio que como é um retorno documentado deveria ser algo do tipo Result := (FretDistDFeInt.CStat in [137, 138,656])

Isso é porposital ?

 

Postado

Então Juliomar eu li o conteúdo da Nota Técnica 2014.002 v1.21 me parece ser a última versão

 

Se entendi corretamente o Comportamento do cStat=656 "Rejeição: Consumo Indevido", ocorre, por exemplo, quando:

A aplicação cliente continua consultando o WebService com distNSU após receber 137 - Nenhum documento localizado, sem respeitar o intervalo de 1 hora ou  se realiza consultas fora da sequência de ultNSU.

Não testei a consulta ACBrDFe.DistribuicaoDFePorUltNSU(ACBrDFe.Configuracoes.WebServices.UFCodigo, ACBrDFe.SSL.CertCNPJ, IntToStr(iUltimoNSU))

fora de um try except como esta no exemplo.

Realmente deve haver algo que não estou vendo.

Me parece que é claro que em havendo um cStat=656 não pode consultar ate dar pelo menos 60 minutos da ultima consulta informada no resultado.

Mas se cStat=656 é um retorno esperado me parece estranho ele estourar uma exceção me parece que um cStat inexistente ou um retorno truncado deveria fazê-lo.

Poderia se não for abusar esclarecer o ponto ?

Obrigado.

  • Moderadores
  • Solution
Postado

e tu quem controla após não receber mais o cStat 137 e dai é esperar enão disparar novamente.

se tu está recebendo mesmo assim quer dizer que mais alguém está com o certificado manifestando

então é como tu leu na NT enquanto receber 138 continua a consultar. recebeu 137 para e aguarda 1 hora pra fazer novamente senão será consumo indevido

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Obrigado Juliomar por sua atenção, eu não tendo problemas com 656 isso em locais onde a consulta é única.

Realmente como você falou se tem mais de um ator consultando aí é complicado pois todos vão disputar e aí é quem chegar primeiro depois da última consulta.

E por eu já estar tratando no Exception e não dentro de um Case está ok.

A pergunta foi muito mais conceitual, o que levou os desenvolvedores do projeto a adotarem uma Exception ao invés de um retorno normal.

Apenas querendo entender.

Obrigado.

 

 

 

Postado (editado)

porque esse é o padrão do componente DFe (NFe) no caso de nfe/nfce o result é tratado como 100,150 se for cancelamento é tratado como 101,151 etc,

como é padrão quaquer coisa fora disso gera em exception então vc pode tratar qualquer outro result fora  do exception.

    Try
      If ACBrNFe1.DistribuicaoDFePorUltNSU(ACBrDFe.Configuracoes.WebServices.UFCodigo,
        ACBrDFe.SSL.CertCNPJ, IntToStr(iUltimoNSU)) Then
      Begin
        // retorno True
      End
      Else
      Begin
        // retorno False
      End;
    Except
      on E: Exception Do
      Begin
        If ACBrNFe1.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 0 Then
          Raise Exception.Create(
            'Sua mensagem do seu jeito...' + sLineBreak +
            'Erro desconhecido' + sLineBreak +
            'Exception: ' + E.Message);
      End;
    End;

    // e aki vc pode tratar qualquer outro retorno
    If ACBrNFe1.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 656 Then
    Begin
      //trata aki
    End;

lembrando isso é só um exemplo.

mas por padrão qualquer retorno for um "ERRO" será gerado em exception.

vc tambem pode usar assim (é como eu uso):

    Try
      ACBrNFe1.DistribuicaoDFePorUltNSU(
        ACBrDFe.Configuracoes.WebServices.UFCodigo,
        ACBrDFe.SSL.CertCNPJ,
        IntToStr(iUltimoNSU)
        );
    Except
      on E: Exception Do
      Begin
        If ACBrNFe1.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 0 Then
          Raise Exception.Create(
            'Sua mensagem do seu jeito...' + sLineBreak +
            'Erro desconhecido' + sLineBreak +
            'Exception: ' + E.Message);
      End;
    End;

    // e aki vc pode tratar qualquer outro retorno
    If ACBrNFe1.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 656 Then
    Begin
      //trata aki
    End
    Else
    If ACBrNFe1.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 137 Then
    Begin
      //trata aki
    End
    Else
    If ACBrNFe1.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 138 Then
    Begin
      //trata aki
    End;
.........................

 

Editado por datilas
Postado

concordo com vc que se o componente não gerasse exception assim como fizeram no ACBrNFSeX seria melhor para tratar e o codigo ficaria mais "limpo"

principalmente para eu que uso servidores linux e apenas devolvo o csat e o xmotivo  caso o cstat = 0 eu devolvo uma mensagem para o cliente.

entendo que hoje com o tamanho do ACBrNFe seria muito difícil alterar, principalmente para quem já tem em produção.

na minha opinião poderia ter uma [property GerarExeption com  padrão true] para não atrapalhar quem já usa e outra [property  Erro],

caso [GerarExeption = False] não gerar o exception e quando houver um erro (http por exemplo) devolver na  [property  Erro].

fica minha humilde opinião.

Postado

entendi agora o porque  @datilas  realmente na versão inicial da distribuição não existia 656 e deve ter sido definido que não sendo 137, 138 era exception. E talvez adicionar esse 656 va realmente quebrar varios pontos. Mas ja estou tratando no exception  e vida que segue. Obrigado Juliomar também. 

  • Curtir 1
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.

The popup will be closed in 10 segundos...