Antonio Carlos L Postado Sexta as 13:10 Postado Sexta as 13:10 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 Sexta as 13:38 Moderadores Postado Sexta as 13:38 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 Sexta as 20:10 Autor Postado Sexta as 20:10 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 Sexta as 20:34 Moderadores Solution Postado Sexta as 20:34 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 Sábado as 12:32 Autor Postado Sábado as 12:32 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 Sábado as 14:44 Postado Sábado as 14:44 (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 Sábado as 14:48 por datilas
datilas Postado Sábado as 15:14 Postado Sábado as 15:14 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 Sábado as 20:07 Moderadores Postado Sábado as 20:07 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 Segunda as 17:34 Autor Postado Segunda as 17:34 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 Segunda as 19:04 Moderadores Postado Segunda as 19:04 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