Jacson Postado 25 Junho Postado 25 Junho Boa tarde, Estamos desenvolvendo uma rotina para registrar o evento de desacordo na CTe. Temos 2 versões desse método, um que é feito a leitura do XML, esse está 100%. E outra que seria apenas informado a chave da CTe, justificativa e UF. Porem percebemos que ele retorna a mensagem de "UF não pode ser vazia.". Debugando o código, percebi que a chCTe esta sumindo no meio do caminho. Em dado momento ele tenta obter a UF, com essa função function ExtrairUFChaveAcesso(const AChave: string): Integer; begin Result := StrToIntDef(Copy(OnlyNumber(AChave),1,2), 0); end; Como a chave chegou ali em branco ele acaba não conseguindo obter a UF. Código da minha função: procedure PrestacaoServicoDesacordoCTe(xObs, UFTomador, CNPJTomador, Chave : string); var iLote: Integer; obCteSefaz : TCteSefaz; begin obCteSefaz := TCteSefaz.Create; with obCTeSefaz do begin ACBrCTe.Conhecimentos.Clear; ACBrCTe.EventoCTe.Evento.Clear; with ACBrCTe.EventoCTe.Evento.Add do begin infEvento.nSeqEvento := 1; // Devemos informar a UF do Emitente do CT-e InfEvento.cOrgao := UFtoCUF(UFTomador); infEvento.chCTe := Chave; infEvento.CNPJ := RemoverCaracteresEspeciais(CNPJTomador); infEvento.dhEvento := now; infEvento.tpEvento := tePrestDesacordo; infEvento.detEvento.xOBS := xObs; end; iLote := 1; // Numero do Lote do Evento ACBrCTe.EnviarEvento(iLote); ACBrCTe.Free; end; obCTeSefaz.Free; end; Tem mais um print em anexo, nele podemos ver que o xml gerado não tem a chave, e podemos ver que na lista de watchList, a variável com chave está devidamente preenchida. Que no caso seria essa: 43250634046620000183570000000000241025021119-cte.xml apenas com os números. Em outros tópicos (já fechados) sobre esse assunto, é dito que não há necessidade de carregar o XML para emitir esse tipo de evento.
Moderadores Juliomar Marchetti Postado 25 Junho Moderadores Postado 25 Junho Sim não precisaria usar o xml tu teria que só informar. tu está usando já o TACBrXMLDocument? senão diria pra mudar pra ele e re testar Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Solution Jacson Postado 25 Junho Autor Solution Postado 25 Junho A principio não estou usado o TACBrXMLDocument. consegui resolver criando em separado e evento e adicionado ele posteriormente. procedure PrestacaoServicoDesacordoCTe(xObs, UFTomador, CNPJTomador, Chave : string); var iLote: Integer; obCteSefaz : TCteSefaz; novoEvento : TInfEvento ; begin novoEvento := TInfEvento.Create; novoEvento.cOrgao := UFtoCUF(UFTomador); novoEvento.chCTe := Chave; novoEvento.CNPJ := RemoverCaracteresEspeciais(CNPJTomador); novoEvento.dhEvento := now; novoEvento.tpEvento := tePrestDesacordo; novoEvento.detEvento.xOBS := xObs; obCteSefaz := TCteSefaz.Create; with obCTeSefaz do begin ACBrCTe.Conhecimentos.Clear; ACBrCTe.EventoCTe.Evento.Clear; ACBrCTe.EventoCTe.Evento.New.InfEvento := novoEvento; iLote := 1; // Numero do Lote do Evento ACBrCTe.EnviarEvento(iLote); ACBrCTe.Free; end; obCTeSefaz.Free; end; Parece que o ADD faz algum tipo de validação e acabava por "eliminar" o conteúdo. Ou não esta sendo passado ao adicionar... Não achei isso no código, apenas especulação. De qualquer forma, fica essa solução temporária, parece gambiarra mas funcionou.
Moderadores Juliomar Marchetti Postado 25 Junho Moderadores Postado 25 Junho há eu sei o que é remove o WITH do seu primeiro código e vai funcionar Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Recommended Posts
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora