GARANTIR DESCONTO

Fórum Exportar dados do ClientDataSet para XML #338782

15/03/2007

0

Pessoal
Bom dia!

Estou tentando exportar os dados de um ClientDataSet para XML com o seguinte metodo:

CdsSql.Open;
CdsSql.SaveToFile( ´c:\texte2.xml´ );

Quando eu faço isso os dados do Banco de Dados trazidos pelo ClientDataSet nao estao sendo exportados para o arquivo XML e sim a instrucao SQL que eu usei no SqlDataSet.

O XML fica assim:


  <?xml version="1.0" standalone="yes" ?> 
- <DATAPACKET Version="2.0">
- <METADATA>
- <FIELDS>
  <FIELD attrname="SQL_EXPORTA" fieldtype="bin.hex" SUBTYPE="Text" WIDTH="1" /> 
  </FIELDS>
  <PARAMS LCID="0" /> 
  </METADATA>
- <ROWDATA>
  <ROW SQL_EXPORTA="select SQL_EXPORTA from SQL_BD where (ID_CLIENTE = :ID_CLIENTE) and (EXPORTADO = ´N´)" /> 
  <ROW SQL_EXPORTA="select SQL_EXPORTA from SQL_BD where (ID_CLIENTE = :ID_CLIENTE) and (EXPORTADO = ´N´)" /> 
  </ROWDATA>
  </DATAPACKET>



Alguem sabe como resolver isso, só para completar o tipo de informação que estou trazendo do banco de dados é um campo Blob (Text) texto puro.

Fico no aguardo


Mmoreira

Mmoreira

Responder

Posts

16/03/2007

Diegus

Amigo...

Vc pode usar o XMLDOM... da uma pesquisada na net ..

Tem esse site

http://www.devguru.com/technologies/XML_DOM/index.asp

Tem algumas instruções que fazem isso... se eu nao me engano o XMLToCDS e o CDSToXML...

Qq duvida pode perguntar ...


Responder

Gostei + 0

17/03/2007

Marco Salles

Independente da dica anterior .coloque a parte do arquivo DFD , para que possamos observar alguma variante que possa levar a este comportamento


Responder

Gostei + 0

18/03/2007

Mmoreira

Marcos,
Todo o conteudo do arquivo eu coloquei ai no post. Dei uma conferida e nao faltou nada.
Ainda nao consegui resolver o problema usando o ClientDataSet.

Alguam ideia?


Responder

Gostei + 0

19/03/2007

Marco Salles

O conteudo do arquivo que me refiro é do DFM do seu projeto e não o conteudo do Arquivo XML gerado pela Instrução

Cds.SvaeToFile(´c:\texte2.xml´ );


este eu topercebendo que esta gerando instrucao SQL que voce usou no SqlDataSet.

Porém , como eu disse é importante em algumas situaçoes a gente analisar o DFM , para tentar reproduzir este comportamento estranho nos nossos DeskTop

Além do mias existem algums macetes poucos explorados pelos livros.. Por exemplo , quando se quer gerar somemte o XML da Estrutura da Tabela use a Propriedade PackRecors igual a ZERO..

Pode ser que isto não resolva o seu caso e talves seria interresante olhar o Trecho de Código que descreve o Comportamento dos componentes


Responder

Gostei + 0

19/03/2007

Marco Salles

O conteudo do arquivo que me refiro é do DFM do seu projeto e não o conteudo do Arquivo XML gerado pela Instrução

Cds.SvaeToFile(´c:\texte2.xml´ );


este eu to percebendo que esta gerando instrucao SQL que voce usou no SqlDataSet.

Porém , como eu disse é importante em algumas situaçoes a gente analisar o DFM , para tentar reproduzir este comportamento estranho nos nossos DeskTop

Além do mias existem algums macetes poucos explorados pelos livros.. Por exemplo , quando se quer gerar somemte o XML da Estrutura da Tabela use a Propriedade PackRecors igual a ZERO..

Pode ser que isto não resolva o seu caso e talves seria interresante olhar o Trecho de Código que descreve o Comportamento dos componentes


Responder

Gostei + 0

20/03/2007

Diegus

Quando vc dá este comando CDS.SavetoFile.. se eu nao me engano ele grava a estrutura do componente e não os dados....

Dá uma pesquisada no uso do XMLDOM...

É simples.. eu nunk tinha trabalhado com XML estou conseguindo me virar um pouco...

Um exemplo para gravar os dados no XML:

procedure TFSF_ImprimirRecibo.GetPessoasFJ;
var
  PFisicas,
  PJuridicas : IXMLDOMDocument2;

  Dados_PFisicas,
  Dados_PJuridicas : IXMLDOMNodeList;
begin
  //Get Dados de Pessoas Físicas;
  PFisicas := CoDOMDocument40.Create;

  //Verifica se o arquivo existe na raiz do Exe
  if not FileExists(LocalExe + ´PESSOASFISICAS.xml´) then
  begin
    ShowErrMsg(´<PESSOASFISICAS.xml> não encontrado.´, emAdvtOk);
    Abort;
  end;
  //Carregar os dados do XML
  PFisicas.load(LocalExe + ´PESSOASFISICAS.xml´);
  //SelectNodes faz o filtro no XML de acordo com os campos definidos no CDS (OBS. Casesensitive)
  Dados_PFisicas := PFisicas.selectNodes(´/PESSOASFISICAS/PessoaFisica/Pessoa´);
  //Atribuir ao Cds os dados filtrados
  XmlToCds(Dados_PFisicas,cds_PessoasFisicas,false);

  /////Dados de Pessoas Jurídicas

  //Get Dados de Pessoas Jurídicas;
  PJuridicas := CoDOMDocument40.Create;

  //Verifica se o arquivo existe na raiz do Exe
  if not FileExists(LocalExe + ´PESSOASJURIDICAS.xml´) then
  begin
    ShowErrMsg(´<PESSOASJURIDICAS.xml> não encontrado.´, emAdvtOk);
    Abort;
  end;
  //Carregar os dados do XML
  PJuridicas.load(LocalExe + ´PESSOASJURIDICAS.xml´);
  //SelectNodes faz o filtro no XML de acordo com os campos definidos no CDS (OBS. Casesensitive)
  Dados_PJuridicas := PJuridicas.selectNodes(´/PESSOASJURIDICAS/PessoaJuridica/Pessoa´);
  //Atribuir ao Cds os dados filtrados
  XmlToCds(Dados_PJuridicas,cds_PessoasJuridicas,false);

  ////////////////////////////////////////
  // Pegar os dados dos dois CDS (PJ e PF) e atribuir ao CDS_PESSOAS
  ////////////////////////////////////////

  //Percorer o Pessoas Fisicas
  cds_Pessoas.Close;
  cds_Pessoas.CreateDataSet;

  while not cds_PessoasFisicas.EOF do
  begin
    cds_Pessoas.Append;
    cds_PessoasCODG_PESSOA.asString         := cds_PessoasFisicasCODG_PESSOA.asString;
    cds_PessoasNUME_CPFCNPJ.asString        := cds_PessoasFisicasNUME_CPF.asString;
    cds_PessoasNOME.asString                := cds_PessoasFisicasNOME.asString;
    cds_PessoasINDI_TIPOPESSOA.asString     := ´F´;
    cds_PessoasFiltro.asString              := cds_PessoasFisicasCODG_PESSOA.asString + ´F´; //Concatenado para ser filtrado
    cds_PessoasINDI_FICHA_COMPLETA.AsString := cds_PessoasFisicasINDI_FICHA_COMPLETA.asString;
    cds_Pessoas.Post;
    cds_PessoasFisicas.Next;
  end;

  //Percorrer Pessoas Juridicas
  while not cds_PessoasJuridicas.EOF do
  begin
    cds_Pessoas.Append;
    cds_PessoasCODG_PESSOA.asString         := cds_PessoasJuridicasCODG_PESSOA.asString;
    cds_PessoasNUME_CPFCNPJ.asString        := cds_PessoasJuridicasNUME_CNPJ.asString;
    cds_PessoasNOME.asString                := cds_PessoasJuridicasNOME.asString;
    cds_PessoasINDI_TIPOPESSOA.asString     := ´J´;
    cds_PessoasFiltro.asString              := cds_PessoasJuridicasCODG_PESSOA.asString + ´J´;
    cds_PessoasINDI_FICHA_COMPLETA.AsString := cds_PessoasJuridicasINDI_FICHA_COMPLETA.asString;
    cds_Pessoas.Post;
    cds_PessoasJuridicas.Next;
  end;
end;


Acima um exemplo para carregar os dados de um XML para um CDS...

Abaixo um exemplo para gravar

function TFSF_DMPessoaJuridica.GerarXML_PessoasJuridicas(table:TClientDataSet):Integer;
var
  i   : Integer;
  xml : String;
  ls_Registro : String;
  item : IXMLDOMAttribute;
begin
  try
    xml  := ´PESSOASJURIDICAS´;
    doc  := CreateOleObject(´Microsoft.XMLDOM´) as IXMLDomDocument;

    root := doc.createElement(xml);
    doc.appendchild(root);

    //////////////////gravar os dados da pessoa jurídica//////////////////
    child := doc.createElement(´PessoaJuridica´);
    root.appendchild( child );

    table.First;
    while not table.eof do
    begin
      ls_Registro := ´´;
      ls_Registro := ´Pessoa´;
      child1 := doc.createElement( ls_Registro  );
      for i := 0 to ( table.FieldCount - 1 ) do
      begin
        item := doc.createAttribute( table.Fields[i].FieldName );
        item.value := VarToStr( table.Fields[i].Value );
        child1.setAttributeNode( item );
      end;
      child.appendchild( child1 );
      table.Next;
    end; //while
    Result:=1;
  except
    on e:Exception do
      Result:=-1;
  end;



Responder

Gostei + 0

20/03/2007

Marco Salles

Quando vc dá este comando CDS.SavetoFile.. se eu nao me engano ele grava a estrutura do componente e não os dados....


Somente se packRecord for igual a Zero


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar