Ir para conteúdo
  • Cadastre-se

dev botao

ISSNet - Dourados/MT - XML de retorno com caracteres especiais


Alex Heinen
Ver Solução Respondido por Alex Heinen,
  • Este tópico foi criado há 416 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom Dia Pessoal,

Preciso de um auxilio referente aos xml de retorno da prefeitura de Dourados ISSNet versão 2.04

Atualmente ao receber o xml o ACBR converte o xml em ANSI ocasionando problemas na acentuação do XML conforme arquivo em anexo.

Fazendo um debug do ACBR dentro da unit ACBrNFSexWebServiceBase.pas na procedure EnvioInterno quando recebemos o retorno identifiquei na linha 994 o seguinte comando:

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

 

Analisando os dados dentro do HttpClient.DataResp percebi que o que recebo é no formato ANSI onde neste caso deveria ser UTF8.

Formato ANSI que é como atualmente estou recebendo.

image.thumb.png.4c64fbe1e6f98ebbf101409b76652ae6.png

 

Formato que deveria receber é UTF8

image.thumb.png.b8a6ccf15661c7fbd1b812e8df30f86f.png

Existe algum parâmetro no ACBR para tratar esse problema? alguém pode me auxiliar de como resolver?

NFSe-597.xml

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia Alex,

Você diz o ACBr esta convertendo o retorno para o formato ANSI.

Sabe me dizer em qual unit e linha que esta ocorrendo essa conversão?

Pois essa linha que você destaca na imagem em anexo ela esta apenas lendo o retorno e armazenando na variável FPRetorno.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Bom Dia italo,

Acredito que seja nesta linha o comando ReadStringFromStream

Porque a variável FPRetorno é uma string e é alimentada já com os caracteres especiais do do formato ANSI.

Antes disso não encontrei nenhum lugar que recebe o retorno.

Editado por Alex Heinen
Link para o comentário
Compartilhar em outros sites

  • Consultores

Alex,

Veja o que a função ReadStrFromStream faz:

function ReadStrFromStream(const Stream: TStream; len: integer): AnsiString;
var
  x: integer;
{$IFDEF CIL}
  buf: Array of Byte;
{$ENDIF}
begin
{$IFDEF CIL}
  Setlength(buf, Len);
  x := Stream.read(buf, Len);
  SetLength(buf, x);
  Result := StringOf(Buf);
{$ELSE}
  Setlength(Result, Len);
  x := Stream.read(PAnsiChar(Result)^, Len);
  SetLength(Result, x);
{$ENDIF}
end;

 

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

Alex,

Você disse que o ACBr esta convertendo o XML retornado do provedor para o formato ANSI.

Será que não é o próprio provedor que esta gerando o XML no formato ANSI e colocando o encoding UTF-8 no inicio?

Eu já vi muito isso ocorrer.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Nós entramos em contato com a ISSNet antes mesmo de abrir a thread aqui no ACBR e recebemos o seguinte parecer.

Que outros sistemas nunca tiveram problemas com isso. E que, inclusive a informação dentro dela esta tabelada no sistema deles também com acentuação e vem assim no retorno também.

O Mais curioso que se olhar dentro da varável HttpClient.DataResp que é do tipo TMemoryStream o formato UTF-8 está correto.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde Alex,

Você notou que na unit ISSNet.Provider existe uma função chamada: TratarXmlRetornado?

function TACBrNFSeXWebserviceISSNet204.TratarXmlRetornado(
  const aXML: string): string;
begin
  Result := inherited TratarXmlRetornado(aXML);

  Result := ParseText(AnsiString(Result), True, {$IfDef FPC}True{$Else}False{$EndIf});
  Result := StringReplace(Result, '&', '&', [rfReplaceAll]);
  Result := RemoverIdentacao(Result);
  Result := RemoverCaracteresDesnecessarios(Result);
end;

Você tem fontes com alterações locais?
Verifica se não tem nenhuma unit do ACBr com uma bolinha vermelha em seu ícone, caso afirmativo delete a unit.
Atualize todos os fontes de todas as pastas.
Reinstale o ACBr com a opção de apagar arquivos antigos marcada.
Compile a aplicação com a opção Build.
 

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

A questão é a seguinte, o padrão do Delphi é ANSI, o arquivo está em UTF8.

 

Ao carregar o arquivo (anexado acima pelo @Alex Heinen) passando o parâmetro de encoding como UTF8 a leitura é feita corretamente:

  memo1.Lines.LoadFromFile(LFullFilePath, TEncoding.UTF8);

arquivo carregado em um memo:

image.png.6e379e40ec73438e71aef8648c3105e9.png

 

Agora a questão é como converter isso no HttpClient.DataResp (TACBrNFSeXWebservice.EnvioInterno) que carrega o retorno do provedor UTF8 em um MemoryStream (DataResp é um MemoryStream) em padrão ANSI.

 

  • Curtir 2

-=Ma®©oS=-

Link para o comentário
Compartilhar em outros sites

Complementando, acredito que a alteração deva ser feita aqui: procedure TACBrWinReqResp.Receive(Resp: TStream); que é onde o DataRest (parâmetro de entrada Resp nesta procedure) é alimentado com o retorno da prefeitura.

 

Porem é bem provável que isto cause problemas nos demais provedores (além de outros documentos que utilizam este mesmo processo), deveria existir algum tipo de parametrização para o Encoding, alteração complexa, e não sei este seria realmente o melhor caminho a se seguir.

 

P.S. Também estamos com problemas em Dourados

  • Curtir 3

-=Ma®©oS=-

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde Marcos,

No meu entendimento uma conversão deve ocorrer na função TratarXmlRetornado que se encontra na unit Provider do provedor, desta forma você consegue isolar o tratamento e não gera efeito colateral nos demais provedores e outros DF-e.

Mas esse tratamento tem que ser compatível com com o Delphi 7 em diante.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

Marcos,

Acredito que depende em que momento você faz essa conversão.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Consegui fazer da seguinte maneira, mas não sei se funciona no Delphi 7.

 

image.thumb.png.72de9d5cec0d8747806ab0f9639a39d5.png

 

Porém depois disso tive outro erro:

 

Input is not proper UTF-8, indicate encoding !
Bytes: 0xC3 0x4F 0x20 0x47
 

Acho que teria que indicar no xml o encoding.

Editado por Alex Heinen
Link para o comentário
Compartilhar em outros sites

  • Consultores

Alex,

Com a unit original (sem essa alteração) faça o seguinte:

1. Configure o componente para salvar os arquivos (soap) em disco. (Configuracoes.WebServices.Salvar := True)

2. Configure o componente para salvar os XML em disco. (Configuracoes.Arquivos.Salvar := True)

Faça um novo teste.

Verifica se ao carregar o XML da nota com o LoadFromFile para poder imprimir o DANFSE ele é carregado com sucesso.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Bom Dia Italo,

Realizei os testes conforme suas orientações e ao fazer o LoadFromFile ocorreu o seguinte erro

 

Extra content at the end of the document

 

Segue os arquivos em anexo.
 

NFSe-599-ULTRA INFORMATICA LT.xml 59913-rps.xml 14687-env-lot-sinc-soap.xml 59913-con-nfse-rps-soap.xml 59913-comp-nfse-soap.xml 599-nfse.xml

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia Alex,

Você alterou o arquivo ACBrNFSeXServicos.ini referente a cidade de Dourados/MS ?

Se sim, anexa aqui somente a alteração que você para a referida cidade.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

Alex,

Muito obrigado, ainda hoje vou enviar para o SVN.

Apenas removi a URL de homologação, pois esta ai é de Brasília/DF.

Me dia uma coisa, o XML (NFSe-599-ULTRA INFORMATICA LT.xml) foi salvo em disco após ler ele do banco de dados?

Se sim, ai que esta o problema.

Pois tente imprimir o DANFSE utilizando o 599-nfse.xml você vai ver que não ocorre esse erro e o DANFSE é apresentado na tela.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 416 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
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.