Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa tarde

tenho uma nota fiscal que fica me retornando o erro 

NFe.ValidarNFe(C:\ACBrMonitorPLUS\Logs\1182771008033861-nfe.xml)
ERRO: Falha na validação dos dados da nota: 118277

Erro: unable to parse

já usei o comando validarregras de negocio nao deu nenhum erro
pegei o conteudo do xml e validei no portal da nfe da sefaz-rs e tambem deu tudo OK
é somente essa nota que esta dando isso
já emiti umas 50 notas apos e nenhum deu erro 

Alguma dica ?

Alberto Leal

www.tecwebcg.com

 

Postado

Achei o erro
na razao social continha um  &  ae quando gerou o xml atraves do ini ficou &
assim deu erro de parse
eu tenho que trocar todas as razoes sociais ?

ou isso pode ser corrigido no parser de xml eu estou usando o monitor 3.03.0

Alberto Leal

www.tecwebcg.com

 

  • Moderadores
Postado

Concordo contigo,

Tenho a mesma situação aqui, meu caso acontece na tag <xNome></xNome>.

Vou faz um debug para verificar onde ocorre o problema com mais clareza.

 

Só para constar não estou usando o  ACBrMonitorPLU uso o componente diretamente.

  • Moderadores
Postado (editado)

Régys,

 Ainda estou verificando, mas já sei que é aqui:

procedure NotaFiscal.Validar;
var
  Erro, AXML: String;
  NotaEhValida, ok: Boolean;
  ALayout: TLayOut;
  VerServ: Real;
  Modelo: TpcnModeloDF;
  cUF: Integer;
begin
  AXML := XMLAssinado;

  with TACBrNFe(TNotasFiscais(Collection).ACBrNFe) do
  begin
    VerServ := FNFe.infNFe.Versao;
    Modelo  := StrToModeloDF(ok, IntToStr(FNFe.Ide.modelo));
    cUF     := FNFe.Ide.cUF;

    if EhAutorizacao( DblToVersaoDF(ok, VerServ), Modelo, cUF) then
      ALayout := LayNfeAutorizacao
    else
      ALayout := LayNfeRecepcao;

    // Extraindo apenas os dados da NFe (sem nfeProc)
    AXML := '<NFe xmlns' + RetornarConteudoEntre(AXML, '<NFe xmlns', '</NFe>') + '</NFe>';

    NotaEhValida := SSL.Validar(AXML, GerarNomeArqSchema(ALayout, VerServ), Erro);  //aqui ele não valida a nota.

    if not NotaEhValida then
    begin
      FErroValidacao := ACBrStr('Falha na validação dos dados da nota: ') +
        IntToStr(NFe.Ide.nNF) + sLineBreak + FAlertas ;
      FErroValidacaoCompleto := FErroValidacao + sLineBreak + Erro;

      raise EACBrNFeException.CreateDef(
        IfThen(Configuracoes.Geral.ExibirErroSchema, ErroValidacaoCompleto,
        ErroValidacao));
    end;
  end;
end;

Para chegar ai gera um XML com o & no nome e tenta consulta a nota.

Apresenta a mensagem de erro.

Ainda estou no debug e assim que ter uma resposta mais definitiva posto aqui.

 

Acho que entendi!

function TDFeOpenSSL.Validar(const ConteudoXML, ArqSchema: String;
  out MsgErro: String): Boolean;
var
  doc, schema_doc: xmlDocPtr;
  parser_ctxt: xmlSchemaParserCtxtPtr;
  schema: xmlSchemaPtr;
  valid_ctxt: xmlSchemaValidCtxtPtr;
  schemError: xmlErrorPtr;
  AXml: AnsiString;
begin
  InitXmlSec;

  Result := False;
  doc := Nil;
  schema_doc := Nil;
  parser_ctxt := Nil;
  schema := Nil;
  valid_ctxt := Nil;

  try
    AXml := NativeStringToUTF8(ConteudoXML);  //aqui entra &amp; e sai &.
    doc := xmlParseDoc(PAnsiChar(AXml)); //aqui ele retorna nil em doc.
    if ((doc = nil) or (xmlDocGetRootElement(doc) = nil)) then
    begin
      MsgErro := 'Erro: unable to parse'; //
      exit;
    end;

 

Editado por Waldir Paim
  • Moderadores
Postado

Régys,

Consegui achar o problema.

Voltei essa alteração na unit ACBrNFeNotasFiscais

De:

function TNotasFiscais.LoadFromFile(CaminhoArquivo: String;
  AGerarNFe: Boolean = True): Boolean;
var
  XMLStr: String;
  XMLUTF8: AnsiString;
  i, l: integer;
  MS: TMemoryStream;
begin
  Result := False;

  MS := TMemoryStream.Create;
  try
    MS.LoadFromFile(CaminhoArquivo);
    XMLUTF8 := ReadStrFromStream(MS, MS.Size);
  finally
    MS.Free;
  end;

  l := Self.Count; // Indice da última nota já existente

  { Chamando ParseTXT, para converter de UTF8 para a String nativa e Decodificar
    caracteres HTML Entity }
  XMLStr := ParseText(XMLUTF8, True);
  LoadFromString(XMLStr, AGerarNFe);

  // Atribui Nome do arquivo a novas notas inseridas //
  for i := l to Self.Count - 1 do
    Self.Items[i].NomeArq := CaminhoArquivo;

  Result := True;
end;

Para:

function TNotasFiscais.LoadFromFile(CaminhoArquivo: String;
  AGerarNFe: Boolean = True): Boolean;
var
  XMLStr: String;
  XMLUTF8: AnsiString;
  i, l: integer;
  MS: TMemoryStream;
begin
  Result := False;

  MS := TMemoryStream.Create;
  try
    MS.LoadFromFile(CaminhoArquivo);
    XMLUTF8 := ReadStrFromStream(MS, MS.Size);
  finally
    MS.Free;
  end;

  l := Self.Count; // Indice da última nota já existente

  // Converte de UTF8 para a String nativa da IDE //
  XMLStr := DecodeToString(XMLUTF8, True);
  LoadFromString(XMLStr, AGerarNFe);

  // Atribui Nome do arquivo a novas notas inseridas //
  for i := l to Self.Count - 1 do
    Self.Items[i].NomeArq := CaminhoArquivo;

  Result := True;
end;

E voltou a funcionar normalmente.

 

Na verdade a alteração foi aqui:

De:

Citar

 { Chamando ParseTXT, para converter de UTF8 para a String nativa e Decodificar
    caracteres HTML Entity }
  XMLStr := ParseText(XMLUTF8, True);

Para:

Citar

  // Converte de UTF8 para a String nativa da IDE //
  XMLStr := DecodeToString(XMLUTF8, True);

Essa alteração foi feita no ultimo commit dessa unit.

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