Ver Mensaje Individual
  #6  
Antiguo 06-08-2008
DANY DANY is offline
Miembro
 
Registrado: nov 2003
Posts: 145
Reputación: 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