Ir para conteúdo
  • Cadastre-se

dev botao

Problema importação XML {$DEFINE USE_ACBr_XMLDOCUMENT}


Ver Solução Respondido por Italo Giurizzato Junior,

Recommended Posts

  • 1 mês depois ...
  • Membros Pro
5 minutos atrás, Italo Giurizzato Junior disse:

Boa tarde @luisclaudio_jr,

Chamei a Equipe ACBr para juntos tentarmos encontrar uma solução.

Sem problemas, porque creio que muitos aqui devem carregar por fora antes, pra fazer as validações que eu citei.. Principalmente saber se realmente é uma NFe por exemplo, não uma NFS.. cte.. e por ai vai, então creio que hora que descontinuar, irá ser um problema pra muitos.

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
6 minutes ago, luisclaudio_jr said:

Sem problemas, porque creio que muitos aqui devem carregar por fora antes, pra fazer as validações que eu citei.. Principalmente saber se realmente é uma NFe por exemplo, não uma NFS.. cte.. e por ai vai, então creio que hora que descontinuar, irá ser um problema pra muitos.

 

Boa tarde!

Um dos questionamentos que foram levantados é se ao testar esta string XML retirada do banco de dados no validador da Sefaz ele apresenta erro.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
2 minutos atrás, Diego Foliene disse:

Boa tarde!

Um dos questionamentos que foram levantados é se ao testar esta string XML retirada do banco de dados no validador da Sefaz ele apresenta erro.

Vou atualizar tudo meu acbr e refazer os testes, mas lembro que o problema era ao jogar em um xmlString e depois jogar pro componente, se eu colocasse direto sem passar pelo xmlstring dava certo.
Outro fator que eu levantei, que funciona 100% na rotina atual, é na nova que ocorre, então, o XML é valido.

Se voltarmos uns posts atrás, eu coloquei exatamente a minha rotina aqui: ( eu carrego antes pra validar N coisas, que antes haviamos mt problemas de usuarios indicarem xml incorreto etc..)

E lembro que no meu teste, se eu jogasse direto no loadFromFile sem passar pelo processo anterior, não ocorria o problema.

var

  aXml: XMLString;

  sl: TStringList;

 ADoc := TXMLDocument.Create(nil);

 try
    ADoc.Active := True;
    ADoc.Version := '1.0';
    ADoc.Encoding := 'utf-8';
    ADoc.Options := [doNodeAutoIndent];

    vTam := TamanhodoArquivo(arquivo); //aruivo em branco
    if (vTam < 100) then
    begin
      abort;

    end;
  
      ADoc.LoadFromFile(arquivo);
   

    aXml := ADoc.XML.Text;
  finally
    sl.Free;
  
  end;

  DM_NFE.ACBrNFe1.NotasFiscais.Clear;
  DM_NFE.ACBrNFe1.NotasFiscais.Add;

    DM_NFE.ACBrNFe1.NotasFiscais.LoadFromString(aXml)

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
49 minutos atrás, luisclaudio_jr disse:

E lembro que no meu teste, se eu jogasse direto no loadFromFile sem passar pelo processo anterior, não ocorria o problema.

Nesse caso, Não seria melhor carregar o arquivo diretamente pelo componente?

Com certeza há alguma diferença ao carregar nessa outra classe e jogar o valor em uma string. E isso possivelmente pode estar fazendo alguma modificação que está invalidando o xml.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Membros Pro
1 minuto atrás, EMBarbosa disse:

Nesse caso, Não seria melhor carregar o arquivo diretamente pelo componente?

Com certeza há alguma diferença ao carregar nessa outra classe e jogar o valor em uma string. E isso possivelmente pode estar fazendo alguma modificação que está invalidando o xml.

Então, antes faziamos isso, mas tinhas muitos problemas de por exemplo usuario importar xml de nfe ao invés de cte, ou uma NFS, ou até mesmo eventos (usuario é leigo, devemos sempre nos lembrar que não dá pra confiar)  antes de jogar pro componente validamos algumas coisas, se é por exemplo uma NF-e (pra não importar um cte, nfs..), pra ver se ela não é um Resumo, se tem as tags que devem ter e tudo mais,Outra coisa, que não sei se ja pegaram por ai, mas é o XML Serpro, (aquele que compram e gera, ele vem faltando umas coisas nas tags como versao,então nesse ponto a gente também valida pra poder deixar o XML apto pra uso.posso mandar uns pra vcs se quiserem)  e ai é necessario uma intervenção antes pra poder colocar o que falta e poder ler.

O ponto que to trazendo, é que sempre funcionou com o método antigo, foi mudar a lib que começou a dar os problemas nos testes.

Em ultimos casos, eu posso revalidar a forma aqui e "chamar" duas vezes o arquivo, validar em uma e se tudo certo chamar novamente, mas pensando agora na comunidade, quando for obrigatório (e a rotina ficou sensacional, muito rapida, eu estava com uma lentidão enorme ctes com 1800 chaves), com certeza vai dar muita dor de cabeça pra todos.

Link para o comentário
Compartilhar em outros sites

  • Consultores
40 minutos atrás, luisclaudio_jr disse:

Então, antes faziamos isso, mas tinhas muitos problemas de por exemplo usuario importar xml de nfe ao invés de cte, ou uma NFS, ou até mesmo eventos (usuario é leigo, devemos sempre nos lembrar que não dá pra confiar)  antes de jogar pro componente validamos algumas coisas, se é por exemplo uma NF-e (pra não importar um cte, nfs..), pra ver se ela não é um Resumo, se tem as tags que devem ter e tudo mais,

Entendi essa parte. Acho legal vocês terem uma inteligência para blindar o sistema e o usuário... mas uma coisa é validar o xml, outra é alterar/modificar.

Se alterássemos o xml isso poderia ser considerado uma adulteração do documento. Esse é um cuidado que estamos tendo cada vez mais com nossas rotinas e incentivamos a todos a terem também.

41 minutos atrás, luisclaudio_jr disse:

Outra coisa, que não sei se ja pegaram por ai, mas é o XML Serpro, (aquele que compram e gera, ele vem faltando umas coisas nas tags como versao,então nesse ponto a gente também valida pra poder deixar o XML apto pra uso.posso mandar uns pra vcs se quiserem)  e ai é necessario uma intervenção antes pra poder colocar o que falta e poder ler.

Não tenho certeza do que se trata. Mas se é um XML de um DF-e, ele tem que ser válido. Você não precisa e nem deveria (minha opinião pessoal) modificar um xml para que seu sistema aceite... pode ser muito perigoso.

Por outro lado, se ele foi aceito pelo webservice e não aceito pelo componente, então realmente precisamos validar. Nesse caso, é mais interessante criar um novo tópico para podermos tratar isso de forma específica e não misturar o assunto com esse tópico aqui.

Por favor, se for o caso crie um novo tópico e anexe o XML para que possamos validar.

48 minutos atrás, luisclaudio_jr disse:

O ponto que to trazendo, é que sempre funcionou com o método antigo, foi mudar a lib que começou a dar os problemas nos testes.

Sim. E estamos interessadíssimos em entender o que está acontecendo. É como você disse no final, preocupamos com a comunidade e não queremos nenhuma dor de cabeça pra ninguém.

Mas mantenha a mente aberta... pode ser que o método anterior estava aceitando um XML que ele deveria na verdade recusar. E agora está recusando.

50 minutos atrás, luisclaudio_jr disse:

Em ultimos casos, eu posso revalidar a forma aqui e "chamar" duas vezes o arquivo

O que eu pensei, seria apenas alterar essa linha:

1 hora atrás, luisclaudio_jr disse:

DM_NFE.ACBrNFe1.NotasFiscais.LoadFromString(aXml)

para algo assim:

DM_NFE.ACBrNFe1.NotasFiscais.LoadFromString(arquivo);

Mas foi só uma ideia para resolver seu problema enquanto validamos a situação. Acho que não conseguimos reproduzir o problema ainda...

Então, voltando ao que você postou antes...

1 hora atrás, luisclaudio_jr disse:

Vou atualizar tudo meu acbr e refazer os testes, mas lembro que o problema era ao jogar em um xmlString e depois jogar pro componente, se eu colocasse direto sem passar pelo xmlstring dava certo.

Assim que você atualizar e refazer os testes, nos avise por favor. Se tiver alguma outra informação que julgar importante, fique a vontade de compartilhar.

Muito obrigado até o momento.

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Membros Pro
46 minutos atrás, EMBarbosa disse:

Entendi essa parte. Acho legal vocês terem uma inteligência para blindar o sistema e o usuário... mas uma coisa é validar o xml, outra é alterar/modificar.

Se alterássemos o xml isso poderia ser considerado uma adulteração do documento. Esse é um cuidado que estamos tendo cada vez mais com nossas rotinas e incentivamos a todos a terem também.

Não tenho certeza do que se trata. Mas se é um XML de um DF-e, ele tem que ser válido. Você não precisa e nem deveria (minha opinião pessoal) modificar um xml para que seu sistema aceite... pode ser muito perigoso.

Por outro lado, se ele foi aceito pelo webservice e não aceito pelo componente, então realmente precisamos validar. Nesse caso, é mais interessante criar um novo tópico para podermos tratar isso de forma específica e não misturar o assunto com esse tópico aqui.

Por favor, se for o caso crie um novo tópico e anexe o XML para que possamos validar.

Sim. E estamos interessadíssimos em entender o que está acontecendo. É como você disse no final, preocupamos com a comunidade e não queremos nenhuma dor de cabeça pra ninguém.

Mas mantenha a mente aberta... pode ser que o método anterior estava aceitando um XML que ele deveria na verdade recusar. E agora está recusando.

O que eu pensei, seria apenas alterar essa linha:

para algo assim:

DM_NFE.ACBrNFe1.NotasFiscais.LoadFromString(arquivo);

Mas foi só uma ideia para resolver seu problema enquanto validamos a situação. Acho que não conseguimos reproduzir o problema ainda...

Então, voltando ao que você postou antes...

Assim que você atualizar e refazer os testes, nos avise por favor. Se tiver alguma outra informação que julgar importante, fique a vontade de compartilhar.

Muito obrigado até o momento.

 

Entendo perfeitamente, alguma sugestão pra validarmos se o XML pertence a um evento, cte, nfe.. talvez até mesmo quem sabe uma função do ACBR onde ele devolvesse algo nesse sentido? Nisso, ja Eliminariamos algumas validações nesse sentido antes da chamada.
Referente a Serpro, eles tem acesso ao servidor do governo onde ficam os XMLS, mas não sei pq cargas, eles não liberam o XML original e meio que remontam e pra resolver temos que indicar umas tags que faltam na mão e concordo sobre o XML, mas em muitos casos que usamos aqui é pra facilitar dados, nada fiscalmente que seja obrigatório a assinatura fiscal correta, ou algo nesse sentido. Posso estar liberando uns xmls que consegui aqui pra vocês, mas fiz um teste e o validador da sefaz ja acusa erro.
Sobre o metodo, sim, vou modificar aqui pra fazer por hora tanto a leitura pra validar caso dê certo eu subo direto, sem passar pelo xmlstring e após testes relato por aqui

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia @luisclaudio_jr,

Vou lhe mostrar um fragmento de código de uma aplicação que fiz a uns quase 20 anos.

Muito mal feita por sinal.

A diferença é que o XML é lido do disco e não do banco de dados.

procedure TfrmEmissorDFE.CarregaArquivo;
var
 ArquivoXML: TStringList;
 Tamanho: Integer;
 PathEvento: String;
begin
 ArquivoXML := TStringList.Create;
 ArquivoXML.LoadFromFile(edtArquivo.Text);

 TipoDFE := 0;
 if pos('<infNFe', ArquivoXML.Text) > 0
  then TipoDFE := 1;
 if pos('<infCte', ArquivoXML.Text) > 0
  then TipoDFE := 2;
 if pos('InfNfse', ArquivoXML.Text) > 0
  then TipoDFE := 3;
 if pos('infMDFe', ArquivoXML.Text) > 0
  then TipoDFE := 4;
 if pos('procEventoNFe', ArquivoXML.Text) > 0
  then TipoDFE := 5;
 if pos('procEventoCTe', ArquivoXML.Text) > 0
  then TipoDFE := 6;
 if pos('procEventoMDFe', ArquivoXML.Text) > 0
  then TipoDFE := 7;

 ArquivoXML.Free;

 // ****************************************************************************
 // Nota Fiscal Eletrônica
 // ****************************************************************************
 if TipoDFE = 1
  then begin
   // Carrega no Componente o NFe salvo em Arquivo XML
   NFe.NotasFiscais.Clear;
   NFe.NotasFiscais.LoadFromFile(edtArquivo.Text, False);

(...)

Note que no LoadFromFile estou informando o segundo parâmetro com o valor False, pois se não informar o XML vai ser gerado novamente.

Devemos tomar cuidado também com o LoadFromString e LoadFromStream, eles também tem esse segundo parâmetro.

  • Curtir 2
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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
3 horas atrás, Italo Giurizzato Junior disse:

Bom dia @luisclaudio_jr,

Vou lhe mostrar um fragmento de código de uma aplicação que fiz a uns quase 20 anos.

Muito mal feita por sinal.

A diferença é que o XML é lido do disco e não do banco de dados.

procedure TfrmEmissorDFE.CarregaArquivo;
var
 ArquivoXML: TStringList;
 Tamanho: Integer;
 PathEvento: String;
begin
 ArquivoXML := TStringList.Create;
 ArquivoXML.LoadFromFile(edtArquivo.Text);

 TipoDFE := 0;
 if pos('<infNFe', ArquivoXML.Text) > 0
  then TipoDFE := 1;
 if pos('<infCte', ArquivoXML.Text) > 0
  then TipoDFE := 2;
 if pos('InfNfse', ArquivoXML.Text) > 0
  then TipoDFE := 3;
 if pos('infMDFe', ArquivoXML.Text) > 0
  then TipoDFE := 4;
 if pos('procEventoNFe', ArquivoXML.Text) > 0
  then TipoDFE := 5;
 if pos('procEventoCTe', ArquivoXML.Text) > 0
  then TipoDFE := 6;
 if pos('procEventoMDFe', ArquivoXML.Text) > 0
  then TipoDFE := 7;

 ArquivoXML.Free;

 // ****************************************************************************
 // Nota Fiscal Eletrônica
 // ****************************************************************************
 if TipoDFE = 1
  then begin
   // Carrega no Componente o NFe salvo em Arquivo XML
   NFe.NotasFiscais.Clear;
   NFe.NotasFiscais.LoadFromFile(edtArquivo.Text, False);

(...)

Note que no LoadFromFile estou informando o segundo parâmetro com o valor False, pois se não informar o XML vai ser gerado novamente.

Devemos tomar cuidado também com o LoadFromString e LoadFromStream, eles também tem esse segundo parâmetro.

Interessante, assim que der um respiro aqui vamos fazer testes, valeu meu caro.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Membros Pro

Boa noite pessoal
fui testar a rotina, atualizei todo o acbr porém quando descomentei >{.$DEFINE USE_ACBr_XMLDOCUMENT}  ao instalar o componente deu o erro abaixo:

C:\ACBR\Fontes\ACBrDFe\ACBrNFe\PCNNFe\ACBrNFeXmlWriter.pas(174) Error: E2170 Cannot override a non-virtual method
C:\ACBR\Fontes\ACBrDFe\ACBrNFe\Base\Servicos\ACBrNFe.Inut.pas(2484) Fatal: F2063 Could not compile used unit 'ACBrNFe.RetInut.pas'
Compilation failure
Erro ao compilar o pacote "ACBr_NFe.dpk".

 

Só ocorre quando descomenta, se deixar comentado instala sem problemas.

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa noite @luisclaudio_jr,

Abra a unit ACBrNFeXmlWrite, vá até a linha 174 e altere ela deixando da seguinte forma:

function ObterNomeArquivo: string; overload;

Ou seja troque o override por overload.

Salve a alteração e tente instalar novamente.

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
20 minutos atrás, Italo Giurizzato Junior disse:

Boa noite @luisclaudio_jr,

Abra a unit ACBrNFeXmlWrite, vá até a linha 174 e altere ela deixando da seguinte forma:

function ObterNomeArquivo: string; overload;

Ou seja troque o override por overload.

Salve a alteração e tente instalar novamente.

Valeu!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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