Antonio Carlos L Postado 25 Julho Postado 25 Julho 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 ?
Moderadores Juliomar Marchetti Postado 25 Julho Moderadores Postado 25 Julho No caso ele é baseado na NT sobre distribuicaoDFe. então sugiro reler ela e notar que tem isso exatamente por tratativas Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Antonio Carlos L Postado 25 Julho Autor Postado 25 Julho 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 Juliomar Marchetti Postado 25 Julho Moderadores Solution Postado 25 Julho 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 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Antonio Carlos L Postado 26 Julho Autor Postado 26 Julho 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.
datilas Postado 26 Julho Postado 26 Julho (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 26 Julho por datilas
datilas Postado 26 Julho Postado 26 Julho 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.
Moderadores Juliomar Marchetti Postado 26 Julho Moderadores Postado 26 Julho Acho que por uma mania ou jeito ou até mesmo vicio em que quase todos começaram com delphi a programar efetuam os tratamentos de forma erronea no fonte então causa confusão e problemas desnecessários. Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Antonio Carlos L Postado 28 Julho Autor Postado 28 Julho 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. 1
Moderadores Juliomar Marchetti Postado 28 Julho Moderadores Postado 28 Julho Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Recommended Posts