Ir para conteúdo
  • Cadastre-se

dev botao

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


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

Recommended Posts

Postado

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

  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

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
  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

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.

  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

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=-

Postado

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=-

  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

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
  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Bom Dia,

Segue configurações utilizadas.

[5003702]
Nome=Dourados
UF=MS
Provedor=ISSNet
Versao=2.04
ProRecepcionar=https://nfse.issnetonline.com.br/abrasf204/dourados/nfse.asmx
HomoRecepcionar=https://www.issnetonline.com.br/apresentacao/df/webservicenfse204/nfse.asmx

 

  • Curtir 1
  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Atualmente para salvar o XML eu pego os valores da seguinte variável

FACBrNFSeX.NotasFiscais.Items[0].XmlNfse

E nela está vindo com os caracteres especiais bagunçado.

image.thumb.png.cbb137a223afcab80f403863daf5160d.png

 

De que lugar eu deveria buscar o XML?

  • Solution
Postado

Consegui Resolver o GravarXML do acbr faz isso corretamente dentro dele ele adiciona a TAG <?xml version="1.0" encoding="UTF-8"?> e depois manda salvar.

Segui a mesma regra.

Obrigado. Pode fechar a thread

  • Este tópico foi criado há 578 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.