Ir para conteúdo
  • Cadastre-se

dev botao

Salvar XML da NF-e


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

Recommended Posts

Olá pessoal, como vocês estão guardando o XML em banco, isso para quem guarda em banco, hoje eu apenas guardo o XML em arquivo e também guardo os dados da NF-e em banco, mas eu queria guardar o XML em si no banco de dados.

Eu tentei guardar o XML como TXT mas da erro na hora do delphi persistir em banco, esse erro ocorre por causa dos caracteres que existe no xml, pois, o delphi entende como parâmetros e da erro na hora de dar o Update.

Eu utilizo ADOQuery, com ODBC e persisto tudo via SQL.

Exemplo de persistencia:

try

  _inserir.Active := false;

  _inserir.SQL.Clear;

  _inserir.SQL.Add('update notafiscal_e.bloco_a set');

  _inserir.SQL.Add('id    = ' + QuotedStr(ACBrNFe1.NotasFiscais.Items[0].NFe.infNFe.ID) + ', ');

  if(ACBrNFe1.WebServices.Retorno.cStat <> null)then

  begin

    _inserir.SQL.Add('cstatus    = ' + IntToStr(ACBrNFe1.WebServices.Retorno.cStat) + ', ');

    _inserir.SQL.Add('xstatus    = ' + QuotedStr(ACBrNFe1.WebServices.Retorno.xMotivo) + ', ');

    if ACBrNFe1.WebServices.Retorno.cStat = 100 then

      _inserir.SQL.Add('status   = ' + QuotedStr('2') + ', ');

  end;

  _inserir.SQL.Add('xml_nfe = ' + QuotedStr(ACBrNFe1.NotasFiscais.Items[0].XML));

  _inserir.SQL.Add('where infnfe = ' + _tnota_fiscal_saida.fieldbyname('infnfe').AsString);

  _inserir.SQL.Add(';commit;');

  _inserir.ExecSQL;

except

  UServico.verifica_erro(1, _inserir.SQL.Text, true);

  abort;

end;

Att.

Carlos Fitl.

Link para o comentário
Compartilhar em outros sites

Caro Carlos Alberto, primeiramente, qual banco você usa. No meu caso eu uso o Firebird 2.1 e persisto o XML da NFe no banco por dois motivos. Se o seu sistema funcionar em rede, os xml's ficaram fragmentados pela empresa e em caso de formatação das máquinas ou demais danos os mesmos podem ser perdidos.

Neu caso eu uso um campo blob e logo apos o envio da nota set XML para um MEMO e a minha função que gera SQL persiste esta informação.

O fato de gravar o XML adiantou a minha vida por que o usuário poderá utilizá-lo de qualquer estação em que estiver logado e simplesmente o carrego para imprimir danfe, cancelar, exportar, etc.

Isto é o que eu faço, mas como eu faço pode não ser útil para você por que talves os componentes que você usa para persistir em banco pode ser diferentes dos meus, a geração do sql etc. Espero ter dado uma luz.

  • Curtir 1

Pedro Antônio de Oliveira Peixoto

Analista de Sistemas

Professor do IFMG SJE

http://www.eagletecnologia.com

Link para o comentário
Compartilhar em outros sites

  • Moderadores

(respondendo novamente) vc pode salvar o XML diretamente no banco lendo a propriedade:

ACBrNFe1.NotasFiscais.Items[0].XML

Após o envio da NFe.

Dae vc le essa propriedade do componente e associa ao seu campo:

Query.FieldByName('XML'):AsString := ACBrNFe1.NotasFiscais.Items[0].XML

Para salvar informando esse campo como parametro vc deverá configurar corretamente o parametro de entrada. Informando o tipo, tamanho, método de entrada, etc.

Explorem o componente, mantenham o CTRL pressionado e clique em cima da propriedade do componente enquanto estiver escrevendo o código.

Isso te levará ao código do componente onde lista todos os metodos e sub-propriedades que vc clicou. Com isso vc tem uma visao geral do componente e muitas das duvidas de como usar o componente serão sanadas.

Sem mais.

João Henrique de Souza

 

Manual de como configurar o TortoiseSVN para não ficar mostrando a senha repetidas vezes (somente para commiters):

https://sourceforge.net/p/forge/community-docs/TortoiseSVN/

 

 

Link para o comentário
Compartilhar em outros sites

Olá juaumkiko, eu já faço assim para gravar o XML, o problema é quando eu faço o update no banco, o banco entendi que o XML possui vários parametros e da erro no update, então eu gostaria de saber se o pessoal esta gravando em TXT ou BLOB, em BLOB eu sei como faz, mas quem esta gravando como TXT como estão fazendo.

Eu estou utilizando ADOQuery, ODBC e Postgres, e estou gravando desta forma:

try

  _inserir.Active := false;

  _inserir.SQL.Clear;

  _inserir.SQL.Add('update notafiscal_e.bloco_a set');

  _inserir.SQL.Add('id    = ' + QuotedStr(ACBrNFe1.NotasFiscais.Items[0].NFe.infNFe.ID) + ', ');

  if(ACBrNFe1.WebServices.Retorno.cStat <> null)then

  begin

    _inserir.SQL.Add('cstatus    = ' + IntToStr(ACBrNFe1.WebServices.Retorno.cStat) + ', ');

    _inserir.SQL.Add('xstatus    = ' + QuotedStr(ACBrNFe1.WebServices.Retorno.xMotivo) + ', ');

    if ACBrNFe1.WebServices.Retorno.cStat = 100 then

      _inserir.SQL.Add('status   = ' + QuotedStr('2') + ', ');

  end;

  _inserir.SQL.Add('xml_nfe = ' + QuotedStr(ACBrNFe1.NotasFiscais.Items[0].XML));

  _inserir.SQL.Add('where infnfe = ' + _tnota_fiscal_saida.fieldbyname('infnfe').AsString);

  _inserir.SQL.Add(';commit;');

  _inserir.ExecSQL;

except

  UServico.verifica_erro(1, _inserir.SQL.Text, true);

  abort;

end;

Att.

Carlos Fitl.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Pelo oq entendi vc tem um campo tipo STRING (VARCHAR), e nao um campo BLOB.

Entao acho que o problema esta aqui:

_inserir.SQL.Add('xml_nfe = ' + QuotedStr(ACBrNFe1.NotasFiscais.Items[0].XML));

Tenta fazer assim:

_inserir.SQL.Add('xml_nfe = :PAR_XML' );

_inserir.ParamByName('PAR_XML').DataType := ftString;

_inserir.ParamByName('PAR_XML').ParamType := ptInput;

_inserir.ParamByName('PAR_XML').Size := ;

_inserir.ParamByName('PAR_XML').AsString := ACBrNFe1.NotasFiscais.Items[0].XML;

João Henrique de Souza

 

Manual de como configurar o TortoiseSVN para não ficar mostrando a senha repetidas vezes (somente para commiters):

https://sourceforge.net/p/forge/community-docs/TortoiseSVN/

 

 

Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...
  • 2 anos depois...
  • Moderadores
9 minutos atrás, LuisMaracaja disse:

No

No componente de ACBrMDFe1 estou usando a rotina.

  ACBrMDFe1  DM.CDS_MDNFeXML.AsString := UTF8Encode(Fprincipal.ACBrMDFe1.Manifestos[0].XML );

funciona normal, gostaria de saber qual o procedimento para alimentar o componente .ACBrMDFe1   com o xml gerado na base de dados.

 

Primeiro acho que este tópico é lá de 2013 ..se vai ai 3 anos..

você já está tratando de algo em outro lugar né não?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  Julio consegui resolver aqui, obrigado pela ajuda meu amigo.

  A rotina ficou com esta modificação 

 

  if  UTF8Encode(DM.CDS_MDNFe.FieldByName('XML').Value)  <> '' then
  Begin
   XMLstream := TStringStream.Create( UTF8Encode(DM.CDS_MDNFe.FieldByName('XML').Value) );
   XMLstream.Position := 0;
   ACBrMDFe1.Manifestos.LoadFromStream(XMLstream);
  End
  else
    ACBrMDFe1.Manifestos.LoadFromFile(dm._diretorioNFe(DM.CDS_MDNFeDATAHORA_EMISSAO.value )+ DM.CDS_MDNFeCHAVE.value + '-mdfe.xml' );

  ACBrMDFe1.Consultar;

Funcionou !!!!!!

 

 

para ler o arquivo do acbr xml e gravando em um campo blob 

  //PEGA XML
  DM.CDS_MDNFeXML.AsString := UTF8Encode(Fprincipal.ACBrMDFe1.Manifestos[0].XML );
  //PEGA CHAVE
  DM.CDS_MDNFechave.VALUE := Copy(Fprincipal.ACBrMDFe1.Manifestos.Items[0].MDFe.infMDFe.ID, 5, 44);

 

 

 

Link para o comentário
Compartilhar em outros sites

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