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 |
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 |
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 |
Cita:
// Saludos |
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")
|
Gracias Roman, ya utilizo el clientdataset, ahora bien mi programa esta asi.
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. |
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 |
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. |
Cita:
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:
y en el detalle:
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 |
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. ;) |
Cita:
// Saludos |
La franja horaria es GMT +2. Ahora son las 01:56:15. |
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