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...
The popup will be closed in 10 segundos...