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)
-   -   Levantar los datos de TQuery en memoria (https://www.clubdelphi.com/foros/showthread.php?t=13846)

Oscar25 01-09-2004 16:09:52

Levantar los datos de TQuery en memoria
 
Hola a Todos.

Tengo una base de datos conectada por ODBC, y estoy utilizando un TQuery para leer todos los registros y armar un archivo de texto.
Mi problema es que es muy lenta la lectura y el acceso y quiero saber si alguien sabe como puedo levantar los datos en memoria o a nivel de cliente para tener un acceso más rapido puesto que como minimo traigo en el query unos 30.000 registros y para terminar de armar el archivo de texto lleva unas cuantas horas.
Gracias para los que pueda ayudarme

roman 01-09-2004 16:20:18

Puedes conectar el Query a un ClientDataSet via un DataSetProvider y armar el archivo a partir del ClientDataSet (los ClientDataSet cargan todo en memoria). Desde luego que esto no evitará el tiempo inicial para traer todos los datos desde la base al ClientDataSet.

// Saludos

Oscar25 01-09-2004 16:33:41

Roman como hago lo que me decis ??
tengo mi TQuery, esto lo conecto al DaSetProvider y el DataSetProvider al ClientDataSet ?? si es asi como hago la lectura y el recorrido, con el TQuery o con el ClientDataSet.
Me podrias dar más ayuda por favor

roman 01-09-2004 16:43:42

Cita:

Empezado por Oscar25
como hago la lectura y el recorrido, con el TQuery o con el ClientDataSet.

Con el ClientDataSet. El Query lo puedes cerrar una vez leídos los datos. Es más ni siquiera tienes que abrirlo; al abrir el ClientDataSet él mismo se encarga de abrir el Query y cerrarlo cuando termine.

// Saludos

__cadetill 01-09-2004 16:53:22

No obstante..... dudo mucho que lo que tarde sea la lectura de esos 30.000 registros (a no ser que la red sea lentísima). Más bien lo que tarda en ejecutarse o es la sentencia SQL (que entonces ya has de trabajar del lado del servidor añadiendo indices y tal para accelerarla) o el proceso en sí de creación del fichero (que, a no ser que sea muy complejo... crear un archivo de texto con esa cantidad de registros no ha de demorarse "horas")

Oscar25 01-09-2004 20:09:38

Gracias Roman, ya utilizo el clientdataset, ahora bien mi programa esta asi.

Código Delphi [-]
Clientdataset1.open
while not clientdataset1.eof do
begin
// en esta parte el query tiene filter
  Clientdataset1.open
  while not clientdataset2.eof do
  begin
    Clientdataset2.Next;
  end;
  clientdataset2.close;
  Clientdataset1.Next;
end;
clientdataset1.close;

Para abril el primer clientedataset no hay problema, pero el segundo debo abrir y cerrar tantas veces como haya el primero, hay alguna forma en que pueda evitar abrir y cerrar tantas veces para que mejore la velocidad.

roman 01-09-2004 20:24:54

Toma nota por favor de que edité tu mensaje para encajarlo en etiquetas [delphi] y hacer así más legible el código. Te ruego uses estas etiquetas en lo futuro. Si entras a editar tu mensaje podrás ver como es que se utilizan.

En cuanto al problema pues no puedo contestarte ya que no tengo ni la menor idea de qué hace el segundo ClientDataSet (ni el primero). Lo único que puedo decirte es que si lo que requieres es recorrer este ClientDataSet en cada ciclo del primero pues basta que uses ClientDataSet2.First para regresar al primer registro en lugar de cerrar el dataset y volver a abrirlo e cada paso.

Otra cosa será si en cada ciclo del primer ClientDataSet, el Query que alimente a ClientDataSet2 cambia su sentencia SQL de manera que- entonces sí -necesariamente tendrás que cerrar y reabrir el dataset.

// Saludos

Oscar25 01-09-2004 21:16:41

Gracias por la nota.
El primer clientedataset trae la cabecera con varios codigos de articulos y el segundo trae el detalle de cada codigo de articulo. Hay alguna forma en que el where por codigo de articulo del segundo query lo pueda realizar sin tener que abrir y cerrar todas las veces a fin de optimizar el programa, puesto que lo que hace el programa es armar un archivo de texto.

roman 01-09-2004 21:28:48

Cita:

Empezado por Oscar25
Gracias por la nota.
Hay alguna forma en que el where por codigo de articulo del segundo query lo pueda realizar sin tener que abrir y cerrar todas las veces

Imagino que sí ya que me parece recordar que los ClientDataSets admiten tablas anidadas de manera que los detalles de cada registro se pueden guardar como un campo (tabla anidada) del ClientDataSet maestro. Sin embargo desconozco cómo se hace.

Por otra parte yo te recomiendo atender a la opinión de cadetill. Aunque ODBC puede ser lento no debería tardar tanto en hacer las consultas.

Fijate además que los Query tiene la propiedad DataSource que te permite establecer la relación maestro-detalle similar a como se hace con los Table y su propiedad MasterSource.

Digamos que en el maestro pondrías:

Código SQL [-]
select * from maestro

y en el detalle:

Código SQL [-]
select * from detalle where maestro_id = :id

donde el parámetro 'id' debe llamarse igual que el campo correspondiente en la tabla maestra.

Al la propiedad DataSource del query detalle le asignas el DataSource enlazado al query maestro.

Al hacer esto, los parámetros del detalle se llenan automáticamente sin necesidad de cerrar y abrir. Claro está que dependiendo de la base que estés atacando es posible que aún así hay un proceso de cerrar-abrir detrás pero aún así será un poco más rápido.

Todo esto claro, junto con establecer correctamente los índices en tus tablas ya que muchas veces las consultas son lentas simple y sencillamente por falta de índices.

// Saludos

jachguate 01-09-2004 21:33:36

NO me imagino porque has usado este enfoque, pero me parece que lo que estas tratando de hacer es un join... y yo preferiria dejarle ese trabajo al servidor de bases de datos.

Hasta luego.

;)

roman 01-09-2004 21:38:54

Cita:

Empezado por jachguate
NO me imagino porque has usado este enfoque, pero me parece que lo que estas tratando de hacer es un join

Je, je :o Desde luego que esta es la mejor opción de entrada, dejar que sea el servidor quien haga la relación. En mi defensa diré que al principio del hilo sólo se mencionaba un query y no dos. :p

// Saludos


La franja horaria es GMT +2. Ahora son las 23:57:53.

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