Fórum Exportar dados do ClientDataSet para XML #338782
15/03/2007
0
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
Curtir tópico
+ 0Posts
16/03/2007
Diegus
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 ...
Gostei + 0
17/03/2007
Marco Salles
Gostei + 0
18/03/2007
Mmoreira
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?
Gostei + 0
19/03/2007
Marco Salles
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
Gostei + 0
19/03/2007
Marco Salles
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
Gostei + 0
20/03/2007
Diegus
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;
Gostei + 0
20/03/2007
Marco Salles
Somente se packRecord for igual a Zero
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)