Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Estou tentando extrair alguns "arquivos" XML que foram armazenados no BD em forma de texto em campos blob

BLOB SUB_TYPE 1 SEGMENT SIZE 100 CHARACTER SET WIN1252 COLLATE WIN1252

O BD é Fire Bird 2.5. (Não fui eu quem criei o banco).

Estou tentando extrair os arquivos XML de NFe e CFe. O código é o mesmo para ambos os documentos só troco o tipo na query.

Quando o documento é NFe ele funciona normal.

Quando o documento é CFe ele não funciona.

Se eu utilizar 

ArqXML.Text := qry2.Fields[0].AsString;

O arquivo salva em branco.

Se eu utilizar 

ArqXML.Text := qry2.Fields[0].Text;

O arquivo salva com um (Memo) dentro.

Estou tentando resolver isso a alguns dias mas não consegui já tentei basicamente de tudo. Alguém tem alguma luz?

try
      Conn1  :=  FConnectionManager.AcquireConn1('Conn1');
      Conn2  :=  FConnectionManager.AcquireConn2('Conn2');
      qry1   :=  TFDQuery.Create(nil);
      qry2   :=  TFDQuery.Create(nil);
      qry1.Connection  := Conn1;
      qry2.Connection  := Conn2;
      ArqXML  :=  TStringList.Create;
      { Encontra os XML que foram emitidos }
      try
        qry1.Close;
        qry1.SQL.Clear;
        qry1.SQL.Add('select'
                         + ' nf_numero,'
                         + ' nf_nfe_chave_identificacao'
                         + ' from nf'
                         + ' where NF_MODELO = ' + QuotedStr('SAT')
                         + ' and nf_cancelada = ' + QuotedStr('N')
                         + ' and nf_nfe_enviado = ' + QuotedStr('S')
                         + ' and NF_DTEMISSAO BETWEEN ' + QuotedStr(sDataInicial)  + ' AND ' + QuotedStr(sDataFinal));
        qry1.Open;
      except
        on E: Exception do begin
          ShowMessage('Erro: ' + E.Message );
          qry1.Close;
        end;
      end;
      { Caso encontre XML inicia exportação }
      if not qry1.IsEmpty then begin
        qry1.FetchAll;
        qry1.First;
        { Cria a pasta no desktop }
        if not DirectoryExists(uSysTools.DirDesktop + '\xml_sat') then begin
          ForceDirectories(uSysTools.DirDesktop + '\xml_sat');
        end;
        while not qry1.Eof do begin
          try
            qry2.Close;
            qry2.SQL.Clear;
            qry2.SQL.Add('select'
                                + ' NF_NFE_XML'
                                + ' from nf '
                                + ' where nf_nfe_chave_identificacao = ' + QuotedStr(qry1.Fields[1].Text)
                                + ' and nf_numero = ' + QuotedStr(qry1.Fields[0].Text)
                                + ' and nf_modelo = ' + QuotedStr('SAT'));
            qry2.Open;
          except
            on E: Exception do begin
              ShowMessage('Erro: ' + E.Message );
              qry2.Close;
            end;
          end;
          if not qry2.IsEmpty then begin
            ArqXML.Clear;
            ArqXML.Text := qry2.Fields[0].AsString;
            ArqXML.SaveToFile(uSysTools.DirDesktop + '\xml_sat' + qry1.Fields[1].Text + '.xml');
          end;
          qry1.Next;
        end;
      end;
    finally
      FreeAndNil(qry1);
      FreeAndNil(qry2);
      FreeAndNil(ArqXML);
      FConnectionManager.ReleaseConn1(Conn1);
      FConnectionManager.ReleaseConn2(Conn2);
    end;

 

Postado

boa tarde

tenta usar essa função

function IfExtraiXmlnf(sXML : string; sQuery :TDataSet): String;
var
  sl : TStringList;
begin
  if not DirectoryExists(ExtractFilePath(sXML)) then ForceDirectories(ExtractFilePath(sXML));
  if sQuery.fieldbyname('xml').AsString <> '' then
  begin
    {TBlobField(sQuery.FieldByName('xml')).SaveToFile(sXML);}
    try
      sl := TStringList.Create;
      sl.Add(sQuery.fieldbyname('xml').AsString);
      sl.SaveToFile(sXML, TEncoding.UTF8);
    finally
      sl.Free;
    end;
  end;
  Result := sXML;
end;

exemplo de uso

var
  sXML: string;
begin
  sXML := qrnota.fieldbyname('nfe_xml').AsString;

  try
    if FileExists(IfExtraiXmlnf(sXML,qrnota)) then
    begin
    end;

 

Postado
  Em 25/03/2023 at 16:39, Dfox disse:

boa tarde

tenta usar essa função

function IfExtraiXmlnf(sXML : string; sQuery :TDataSet): String;
var
  sl : TStringList;
begin
  if not DirectoryExists(ExtractFilePath(sXML)) then ForceDirectories(ExtractFilePath(sXML));
  if sQuery.fieldbyname('xml').AsString <> '' then
  begin
    {TBlobField(sQuery.FieldByName('xml')).SaveToFile(sXML);}
    try
      sl := TStringList.Create;
      sl.Add(sQuery.fieldbyname('xml').AsString);
      sl.SaveToFile(sXML, TEncoding.UTF8);
    finally
      sl.Free;
    end;
  end;
  Result := sXML;
end;

exemplo de uso

var
  sXML: string;
begin
  sXML := qrnota.fieldbyname('nfe_xml').AsString;

  try
    if FileExists(IfExtraiXmlnf(sXML,qrnota)) then
    begin
    end;

 

Expandir  

 

Muito obrigado mas Infelizmente o resultado é o mesmo que eu estava tendo antes.

  • Consultores
Postado
  Em 25/03/2023 at 13:31, pfmoretto disse:

Se eu utilizar 

ArqXML.Text := qry2.Fields[0].Text;

O arquivo salva com um (Memo) dentro.

Expandir  

O que isso quer dizer?

[]'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.
  • Moderadores
Postado

Bom dia,

eu utilizado dessa forma:

(FDQuery1.FieldByName('XML') as TBlobField).SaveToFile(PCHar(pathXMLOrig));

 

Cleber C. Ferreira
Analista de Sistemas e Consultor
Email e
Skype: contato@cleberferreira.eti.br
Formiga-MG

Postado
  Em 29/03/2023 at 19:06, EMBarbosa disse:

O que isso quer dizer?

Expandir  

Quando eu abro o XML dentro está escrito assim "(Memo)". Não faço ideia o porque. 

 

  Em 30/03/2023 at 12:49, Cleber Ferreira disse:

Bom dia,

eu utilizado dessa forma:

(FDQuery1.FieldByName('XML') as TBlobField).SaveToFile(PCHar(pathXMLOrig));

 

Expandir  

Infelizmente acontece a mesma coisa. O arquivo sai em branco.

 

Eu acredito que exista alguma diferença na forma como os arquivos são salvos. Acho que no que eu consigo exportar o XML ele salva o texto e nos outros talvez o arquivo mesmo? Como que faria pa extrair?

  • Consultores
Postado
  Em 30/03/2023 at 23:46, pfmoretto disse:

Eu acredito que exista alguma diferença na forma como os arquivos são salvos.

Expandir  

Me parece que não... Quando eu li pela primeira vez, acho que não atentei a essa frase direito:

  Em 25/03/2023 at 13:31, pfmoretto disse:

Quando o documento é NFe ele funciona normal.

Quando o documento é CFe ele não funciona.

Expandir  

Tecnicamente, os dois são um arquivo XML. Isso indica que há um problema nos dados e não na maneira que você usa para extrair os dados.

Os dois documentos podem ser armazenados da mesma maneira. Mas será que estão sendo?

É possível que os CFe não estejam sendo salvos da mesma maneira que os NFe. Verifique se os CF-e estão realmente no Banco de dados igual aos arquivos NFe.

[]'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.
Postado
  Em 31/03/2023 at 13:58, EMBarbosa disse:

Me parece que não... Quando eu li pela primeira vez, acho que não atentei a essa frase direito:

Tecnicamente, os dois são um arquivo XML. Isso indica que há um problema nos dados e não na maneira que você usa para extrair os dados.

Os dois documentos podem ser armazenados da mesma maneira. Mas será que estão sendo?

É possível que os CFe não estejam sendo salvos da mesma maneira que os NFe. Verifique se os CF-e estão realmente no Banco de dados igual aos arquivos NFe.

Expandir  

Então tecnicamente os dois são um XML, mas será que um ele grava em forma de texto e outro ele salva o arquivo mesmo (o binario)? Pois os campos são o mesmo domain, são identicos só consigo pensar que o insert está sendo feito de formas diferentes. Segue foto em anexo.

Sem título.png

Postado
  Em 31/03/2023 at 16:53, Dfox disse:

Então deve ser problema no modo que você salvou esse XML no banco de dados 

Expandir  

Não fui eu quem criou o banco e salvou as informações. Estou conectado em um banco de terceiro... Estou tentando adivinhar o que fizeram.

  • Consultores
Postado
  Em 31/03/2023 at 16:11, pfmoretto disse:

mas será que um ele grava em forma de texto e outro ele salva o arquivo mesmo (o binario)?

Expandir  

Você consegue visualizar o conteúdo dos dois de alguma maneira? Por exemplo usando o IBExpert? Se conseguir, você pode comparar.

[]'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.
  • Moderadores
Postado

Boa tarde,

pego o xml dessa forma:

ParamByName('XML').AsWideString := ACBrNFe1.NotasFiscais.Items[0].XML;

No meu banco (FB) está assim: 

image.png

Cleber C. Ferreira
Analista de Sistemas e Consultor
Email e
Skype: contato@cleberferreira.eti.br
Formiga-MG

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

The popup will be closed in 10 segundos...