Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2004
Oscar25 Oscar25 is offline
Registrado
 
Registrado: sep 2004
Posts: 5
Poder: 0
Oscar25 Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 01-09-2004
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
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
Responder Con Cita
  #3  
Antiguo 01-09-2004
Oscar25 Oscar25 is offline
Registrado
 
Registrado: sep 2004
Posts: 5
Poder: 0
Oscar25 Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 01-09-2004
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
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
Responder Con Cita
  #5  
Antiguo 01-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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")
Responder Con Cita
  #6  
Antiguo 01-09-2004
Oscar25 Oscar25 is offline
Registrado
 
Registrado: sep 2004
Posts: 5
Poder: 0
Oscar25 Va por buen camino
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.

Última edición por roman fecha: 01-09-2004 a las 20:17:34. Razón: Formato de código
Responder Con Cita
  #7  
Antiguo 01-09-2004
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
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
Responder Con Cita
  #8  
Antiguo 01-09-2004
Oscar25 Oscar25 is offline
Registrado
 
Registrado: sep 2004
Posts: 5
Poder: 0
Oscar25 Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 01-09-2004
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
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
Responder Con Cita
  #10  
Antiguo 01-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 01-09-2004
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
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 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.

// 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


La franja horaria es GMT +2. Ahora son las 02:33:14.


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