Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Providers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-07-2008
DANY DANY is offline
Miembro
 
Registrado: nov 2003
Posts: 145
Poder: 21
DANY Va por buen camino
Exportar Tabla a XML por medio de TclientDataSet

Necesito exportar tablas de una BD en uno o mas archivos y luego importarlas en otra BD de similar estructura (tablas con parametro de configuracion y otras yerbas). Expongo el asunto de manera simplificada. En la generacion del archivo, Genero un ClientDataSet lo conecto a un providers y luego a un Query. Luego hago:
Código Delphi [-]
  ADOQuery1.Open ;

  ClientDataSet1.Open ;
  ClientDataSet1.SaveToFile('C:\Sistema\GruposComprobantes.xml',dfXML  );
  ClientDataSet1.Close ;

El asunto es que me genera solo el encabezado del archivo sin las filas con los datos. Es que tengo que recorrer todo el query e ir insertando de manera manual en el clientdataset antes de grabar el archivo?. Me parece engorroso y tiene que haber una solucion mas elegente.
Despues me queda el tema de la importacion que ya lo vere mas adelante.
Estoy encarando el tema de manera correcta??.
Gracias por su tiempo.
Responder Con Cita
  #2  
Antiguo 19-07-2008
Avatar de white_zombie
[white_zombie] white_zombie is offline
Miembro Premium
 
Registrado: nov 2005
Ubicación: Zaragoza - España
Posts: 187
Poder: 19
white_zombie Va por buen camino
Hola, yo para exportar a xml desde un clientdataset uso el componente XMLTransformProvider que esta en la paleta data access como el clientdataset.
Responder Con Cita
  #3  
Antiguo 19-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola,
clientdataset1 ya tiene datos antes de llamar a savetofile? suponiendo que es un query

Código Delphi [-]
  ClientDataSet1.Active := false;
  ClientDataSet1.SQL.Text := ' select ...';
  ClientDataSet1.Active := true;
  ClientDataSet1.SaveToFile('C:\Sistema\GruposComprobantes.xml',dfXML);
  ClientDataSet1.Close ;
Responder Con Cita
  #4  
Antiguo 20-07-2008
DANY DANY is offline
Miembro
 
Registrado: nov 2003
Posts: 145
Poder: 21
DANY Va por buen camino
No comprendo, el componente clientdataset no tiene propiedad SQL ni de conexion a BD, por eso el enlace a los demas componentes de BD. Algo es seguro, el clientdataset al momento de hacer savetofile no tiene registros.
Pero es que para exportarlos hay que recorrer todo un query? En esa solucion estoy trabajando en base a la gran ayuda de polirrubro y cuando termine subire las funciones genericas que lo hacen. Pero no me termina de cerrar el asunto, deberia cargarse como un dataset comun al abrir el query, por algo el enlace.
Saludos.
Responder Con Cita
  #5  
Antiguo 20-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si, un TDataset es tal como dices. Me referia a un cojunto de datos, un dataset, indistintamente, que puede ser una query o una tabla. El TAdoDataset no tiene la propiedad SQL pero si la propiedad CommandText, que es mas o menos lo mismo. Un TAdoDataset, por lo que veo en la ayuda, no es mas que un query que no permite deletes, insert into, etc. De todas maneras, creo que lo envias al savetofile vacio, prueba de hacer en vez de SQL.Text = '...' , .commandtext := 'select * ...' antes del savetofile. saludos

EDITO : tiene, igual que el query, las propiedades connection, connectionstring. No entiendo alla que dices "por algo el enlace", por lo que veo, el TAdoDataSet no tiene enlace a ningun otro dataset.

Última edición por coso fecha: 20-07-2008 a las 10:02:07.
Responder Con Cita
  #6  
Antiguo 06-08-2008
DANY DANY is offline
Miembro
 
Registrado: nov 2003
Posts: 145
Poder: 21
DANY Va por buen camino
Al final lo resolvi recorriendo la tabla e insertando registro por registro en el ClientDataSet, al principio dude del rendimiento, pero logre un metodo generico que las recorre y funciona rapido y bien.
Para entender el codigo deberia explicar una serie de cosas, como ser que tengo una clase por tabla y cada campo de la BD relacionado con un campo property de la clase asociada y que todas heredan de la clase en la que expongo el metodo. Pero cualquier cosa que necesiten , les respondere.
Expongo mi codigo:
Código Delphi [-]
procedure TClaseTablas.ExportarArchivoXML;
var ClientDataSet : TClientDataSet ;
  I, CantidadProp, Count : Integer;
  PropList: PPropList ;
  ValoresCampos:  array of variant ;
  Campos, Parametros: TStrings ;
  SQL: String ;
  q: TDataSet ;
begin
  try
    CantidadProp := GetPropList(Self, PropList);
    Count := 0;
    Campos := TStringList.Create ;
    Parametros := TStringList.Create ;

   //Genero los campos en el client data set.
    ClientDataSet := TClientDataSet.Create(nil);

    for I := 0 to CantidadProp  -1 do
    begin
      if (PropList[i].PropType^.Kind = tkClass) then
        Continue;

        if (PropList[i].Name='Estado') or (PropList[i].Name='NombreTabla') or
        (PropList[i].Name='NombreTabla') or (PropList[i].Name='NombreCampoClave')
        or (PropList[i].Name='ClavePrimaria') or (PropList[i].Name='Titulo')then
        Continue ; //AJJJJ Como distingo la clase base de la hija????
        //y titulo de donde sale?
        ClientDataSet.FieldDefs.Add(PropList[i].Name,ftString ,250,false);


    End;
    ClientDataSet.CreateDataSet ;
    q := fDatos.AbrirQuery('Select * From '+NombreTabla ,[]);

    while not q.Eof  do
    Begin
      ClientDataSet.Append ;

      for I := 0 to CantidadProp  -1 do
      begin
        if (PropList[i].PropType^.Kind = tkClass) then
          Continue;

        if (PropList[i].Name='Estado') or (PropList[i].Name='NombreTabla') or
        (PropList[i].Name='NombreTabla') or (PropList[i].Name='NombreCampoClave')
        or (PropList[i].Name='ClavePrimaria') or (PropList[i].Name='Titulo')then
        Continue ; //AJJJJ Como distingo la clase base de la hija????
        //y titulo de donde sale?
        ClientDataSet.FieldByName(PropList[i].Name).Value := q.FieldByName (PropList[i].Name).AsString ;

      End;
      q.Next ;
      ClientDataSet.Post ;
    End;

    ClientDataSet.SaveToFile('C:\Sistema\'+NombreTabla+'.xml',dfXML );

  Finally
    FreeAndNil ( ClientDataSet ) ;FreeAndNil ( Campos) ; FreeAndNil ( Parametros);

  End;

end;

muchas gracias al amigo poliburro quien se contacto personalmente por MSN y me ayudo a entender el asunto.
Perdon si el codigo esta confuso por que no se entiende el contexto y gracias por su tiempo.
Responder Con Cita
  #7  
Antiguo 06-08-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo no entiendo. Me da la impresión de que se complica de más el asunto. Al menos viendo tu pregunta original, el caso es que si el ClientDataSet realmente está conectado al ADOQuery mediante un DataSetProvider, el método SaveToFile guarda todo, el encabezado y los registros.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Contar campos de una tabla por medio de un parametro!! Zakio14 Firebird e Interbase 9 22-02-2008 18:31:43
Una bacía medio vacía o medio llena. marcoszorrilla La Taberna 4 06-07-2007 17:57:21
Exportar una Tabla de SQL a un archivo TXT sanfer1ec SQL 5 11-04-2007 18:05:35
Exportar desde Tabla BDE a Excel tamara Conexión con bases de datos 1 03-10-2003 18:20:03
Exportar tabla a Excel jfloro API de Windows 1 08-09-2003 16:15:23


La franja horaria es GMT +2. Ahora son las 11:56:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi