Ir para conteúdo
  • Cadastre-se

dev botao

Dúvida no processamento da função Emitir do ACBrNFSeX


Diego A. Folieni
  • Este tópico foi criado há 941 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Estou recebendo um retorno em branco/vazio ao tentar emitir NFSe para a cidade de Mineiros do Tiete usando o programa exemplo.
Enquanto aguardava retorno do Provedor a prefeitura para que a mesma me passase continuei tentando no programa exemplo, na esperança de ser alguma configuração que passei errado, ou algo do gênero, alguma coisa que pudesse corrigir sem precisar aguardar a boa vontade do pessoal do provedor.
Enquanto debugava o método Emitir do componente no Programa Exemplo, cheguei nas seguintes situações:
* A Unit ACBrNFSeXWebServiceBase possui a função chamada Executar. Dentro dela, tem a chamada HttpClient.Execute. Entrando nela através do F7 chego a seguinte procedure:

procedure TDFeHttpWinHttp.Execute;
begin
  inherited;

  // Enviando, dispara exceptions no caso de erro //
  try
    FWinHTTPReqResp.Execute(DataResp);
    HeaderResp.Text := FWinHTTPReqResp.HeaderResp.Text;
  finally
    FpHTTPResultCode := FWinHTTPReqResp.HttpResultCode;
    FpInternalErrorCode := FWinHTTPReqResp.InternalErrorCode;
  end;

  // DEBUG //
  //DataResp.SaveToFile('c:\temp\ReqResp.xml');
end;

Considerando o comentário, não deveria ser um try except ao invés de try finally ?
Nela para mim os valores de FWinHTTPReqResp.HttpResultCode é 404 e FWinHttpReqResp.HeaderResp.Text é HTTP/1.1 404 Not Found Date: Mon, 20 Sep 2021 16:36:09 GMT Content-Length: 0 Server: Microsoft-IIS/10.0 X-Powered-By: ASP.NET.
Ainda assim considera como sucesso a requisição e trata o Retorno "Bem Sucedido".
Isso está correto?
* Na Unit ACBrNFSeXWebserviceBase, na procedure Executar tem o seguinte trecho de código:
 


HttpClient.Execute;

HttpClient.DataResp.Position := 0;
FPRetorno := ReadStrFromStream(HttpClient.DataResp, HttpClient.DataResp.Size);

// Alsuns provedores retorna uma string apenas com a mensagem de erro
if Pos('Body', FPRetorno) = 0 then
  FPRetorno := GetSoapBody(FPRetorno);

if Pos('ISO-8859-1', FPRetorno) > 0 then
begin
  FPRetorno := RemoverDeclaracaoXML(FPRetorno);
  FPRetorno := TranslateString(FPRetorno, 0, 28591);
end;

if Pos('<?xml version="1.0" ?>', FPRetorno) > 0 then
  FPRetorno := RemoverDeclaracaoXML(FPRetorno);

// Alguns provedores não retornam o XML em UTF-8
FPRetorno := ConverteXMLtoUTF8(FPRetorno);

// Verifica se o ResultCode é: 200 OK; 201 Created; 202 Accepted
// https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
if not (HttpClient.HTTPResultCode in [200..202]) then
begin
  aRetorno := TACBrXmlDocument.Create;

  if FPRetorno <> '' then
  begin
	aRetorno.LoadFromXml(FPRetorno);

	try
	  ChecarRetorno(aRetorno);
	finally
	  aRetorno.Free;
	end;
  end
  else
	raise EACBrDFeException.Create('WebService retornou um XML vazio.');
end;

Nele, a função GetSoapBody é assim:

  aXml := SeparaDados(Response, 'Body');

  if aXml = '' then
    aXml := '<a>' +
              '<ListaMensagemRetorno>' +
                '<MensagemRetorno>' +
                  '<Codigo>' + '</Codigo>' +
                  '<Mensagem>' + Response + '</Mensagem>' +
                  '<Correcao>' + '</Correcao>' +
                '</MensagemRetorno>' +
              '</ListaMensagemRetorno>' +
            '</a>';

  Result :=  aXml;

Então mesmo que FPResponse seja vazio(que está sendo o meu caso)ele vai passar um valor para FPResponse e assim não cai na exceção se o retorno vier vazio.

Editado por Diego A. Folieni
Link para o comentário
Compartilhar em outros sites

  • Diego A. Folieni changed the title to Dúvida no processamento da função Emitir do ACBrNFSeX
  • Moderadores
8 minutos atrás, Diego A. Folieni disse:

Considerando o comentário, não deveria ser um try except ao invés de try finally ?

Ao contrário, o try..except seria pra tratar a exceção, nesse caso o método não trata, se ocorrer uma exceção ela será devolvida ao método que chamou.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

15 horas atrás, BigWings disse:

Ao contrário, o try..except seria pra tratar a exceção, nesse caso o método não trata, se ocorrer uma exceção ela será devolvida ao método que chamou.

Mas pelo que pude entender essa informação não é utilizada posteriormente no método que chamou.
A procedure Execute é chamada dentro da Executar e a mesma retorna uma String contendo o XML de Retorno.
E é esse XML de retorno que ele válida então esse erro acaba sendo ignorado.

Link para o comentário
Compartilhar em outros sites

26 minutos atrás, Diego A. Folieni disse:

Mas pelo que pude entender essa informação não é utilizada posteriormente no método que chamou.
A procedure Execute é chamada dentro da Executar e a mesma retorna uma String contendo o XML de Retorno.
E é esse XML de retorno que ele válida então esse erro acaba sendo ignorado.

** A procedure Execute é chamada dentro do método Executar através de HttpClient.Execute e o retorno da Executar é uma String contendo o XML de Retorno.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 941 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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...