Ir para conteúdo
  • Cadastre-se

dev botao

Extrair xml de campo blob


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

Recommended Posts

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;

 

Link para o comentário
Compartilhar em outros sites

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;

 

Link para o comentário
Compartilhar em outros sites

Em 25/03/2023 at 13: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;

 

 

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

Link para o comentário
Compartilhar em outros sites

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

Se eu utilizar 

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

O arquivo salva com um (Memo) dentro.

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.
Link para o comentário
Compartilhar em outros sites

Em 29/03/2023 at 16:06, EMBarbosa disse:

O que isso quer dizer?

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

 

10 horas atrás, Cleber Ferreira disse:

Bom dia,

eu utilizado dessa forma:

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

 

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?

Link para o comentário
Compartilhar em outros sites

  • Consultores
14 horas atrás, pfmoretto disse:

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

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 10:31, pfmoretto disse:

Quando o documento é NFe ele funciona normal.

Quando o documento é CFe ele não funciona.

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.
Link para o comentário
Compartilhar em outros sites

2 horas atrás, 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.

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

Link para o comentário
Compartilhar em outros sites

  • Consultores
2 horas atrás, pfmoretto disse:

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

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.
Link para o comentário
Compartilhar em outros sites

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