Ir para conteúdo
  • Cadastre-se

dev botao

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

  • Consultores
Postado
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.
Postado
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?

  • Consultores
Postado
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.
Postado
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

Postado
28 minutos atrás, Dfox disse:

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

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