Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Crear DataSet en tiempo de ejecución. (https://www.clubdelphi.com/foros/showthread.php?t=30614)

Drahcir 11-04-2006 17:18:33

Crear DataSet en tiempo de ejecución.
 
Hola a todos,

mi pregunta es la siguiente. Es posible crear un DataSet en tiempo de ejecución para después destruírlo??
Mi problema viene a raiz de exportar los datos de una query a un fichero .csv. Tengo una sola query (y tiene que ser así) pero he de exportar los datos a 4 ficheros distintos dependiendo del valor de un campo. Exportarlos a un fichero de texo es muy fácil ya que utilizo un StringList y voy insertando linea a línea según recorro el DataSet......el problema es a la hora de exportarlo a Excel, ya que exporto el DataSet completo.

Había pensado que quizás sería posible crear 4 DataSouces en tiempo de ejecución para poder así ir insertando en cada uno sus datos correspondientes para luego exportarlos por separado al fichero .csv y destruírlos. No se si eso es viable o se puede hacer.

Agradecería cualquier ayuda.

Un saludo.

Kosmo 11-04-2006 17:30:11

claro que se puede.

Código Delphi [-]
var
  Tabla: TTable;
  DataSource: TDataSource;
begin
  Tabla:=TTable.Create(nil);
  DataSource:=TDataSource.Create(nil);
//usamos los componentes
  DataSource.Free;
  Tabla.Free;
end;

Puedes crear en tiempo de ejecucion tablas, datasources, querys y lo que sea.

Drahcir 11-04-2006 17:33:51

Muchas gracias. Probaré a hacerlo de esta manera.

Un saludo.

AzidRain 11-04-2006 22:13:44

El codigo es el correcto pero falta colocar el "salvadidas" de las excepciones:

Código:

var  Tabla: TTable;  DataSource: TDataSource;begin  Tabla:=TTable.Create(nil);  DataSource:=TDataSource.Create(nil);  Try  //usamos los componentes
  Finally
    DataSource.Free;    Tabla.Free;
  end;end;

De esta forma si algo sale mal mientras manipulas las tablas, te aseguras de que se destruyan y no te dejen memoria colgando. Esta es la forma "canónica" para crear objetos en tiempo de ejecución. La plantilla es la misma para cualquier otro objeto que quieras crear, solo sustituyes por el tipo correcto (en este caso es TDataset y TDataSource). En este ejemplo, TDAtasource solo es necesario si vas a ocupar controles DBAware como un TDBEdit o algo asi, pero si solo vas a manipular la tabla para calcular algo o copiar, no es necesario.

Drahcir 12-04-2006 08:40:20

Estoy completamente de acuerdo con lo de la excepción y lo pondré en práctica. Me he puesto con ello pero me ha asaltado una duda, una vez creaod el DataSet y extraídos los campos (registro por registro) de la query, como inserto en el nuevo DataSet??. Tengo algo parecido a esto:

while not qQuery.Eof do begin
Campo1 := qQuery.FieldByName('CAMPO1').AsString;
Campo2 := qQuery.FieldByName('CAMPO2').AsString;
Campo3 := qQuery.FieldByName('CAMPO3').AsString;
if (Campo1 = 'codigo') then begin
AsignaValores; // Toma los valores de los campos en otro procedure
Listado1.Add(Linea); // Antiguamente añadía una línea a un TStringList
end
else
if (Campo1 = 'codigo 2') then begin
AsignaValores;
Listado2.Add(Linea)
end ......

El caso es que en lugar de añadir líneas a un TStringList para crear un fichero .txt necesito añadir los registros a un TDataSet creado en tiempo de ejecución para poder transformarlo en un fichero .csv.......como podría hacerlo??

Gracias por vuestras respuestas.

Un saludo.

AzidRain 13-04-2006 03:06:12

1 Archivos Adjunto(s)
Aqui dejo este código para tí y mis amigos del Club
Archivo Adjunto 281
que hace precisamente lo que quieres: Convertir un dbf a CSV. Te aclaro que este es parte de un programa mas grande que convíerte de DBF a tablas MySQL. Por si solo no funciona, pero el código y las rutinas te servirán para estudiar como hace la conversión...Me hubiera gustado hacer un componente y ponerlo aqui, pero como dicen en los libros: "ese tema sale del ámbito de este post" :D Espero te sirva...

lpmlpm 13-04-2006 03:16:45

solo apuntar que puedes hacer algunas cositas para hacer más rápido tu proceso, por ejemplo un Dataset.DisableControls antes de entrar al ciclo de tu traspaso y un Dataset.EnableControls al terminar, y otra mas es que si solo vas a usar el dataset para recorrerlo en un solo sentido de principio a fin puedes activar la propiedad Unidirectional, eso tambien va a celerar mucho el trabajo.


La franja horaria es GMT +2. Ahora son las 04:10:24.

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