PDA

Ver la Versión Completa : Paginación en segundo plano (¿"background paging"?)


Al González
22-04-2007, 01:44:58
¡Hola a todos!

El motivo de este mensaje es plantearles cierta idea que tengo con un par de proyectos y pedirles su consejo acerca de cómo resultaría mejor implementar dicha idea.

Simplifiquemos el escenario:

Base de datos Firebird 1.5, de tres a 10 clientes conectados a ella.
Considérese una tabla ARTICULOS con 150 mil registros.
Delphi 7, tres capas (por ahora "2.5") usando la siguiente asociación de elementos:

Procedimiento almacenado --> TSQLConnection --> TSQLQuery --> TDataSetProvider --> TClientDataSet --> TDataSource --> TcxGrid (poderosa QuantumGrid de Developer Express).

Tradicionalmente, si utilizara el típico componente TDBGrid para mostrar los datos, éste se encargaría de ir solicitando registros al conjunto de datos conforme el usuario navegara hacia abajo, de tal manera que no tendría que cargar todo el cursor en un sólo acto, sino sólo segmentos del mismo según fueran necesitándose, economizando tiempos y recursos. Incluso creo (no estoy muy seguro) que para ello se utiliza la propiedad TClientDataSet.PacketRecords.

Pues bien, resulta que mi deseo es cargar todos los registros de la tabla en memoria para que el usuario aproveche al máximo las capacidades de la rejilla TcxGrid. Con ésta, el usuario puede ordenar la información por diferentes columnas, establecer filtros, agrupar, realizar búsquedas especiales, exportar a Excel, etc. Una gran variedad de tareas que difícilmente se lograrían mediante puras sentencias SQL.

Aclaro que no me interesa discutir el asunto del consumo de recursos, las reglas de los cánones y todo lo que dice la literatura tradicional. He evaluado el costo-beneficio de cargar toda la tabla en memoria, y, para los propósitos específicos de la aplicación, veo que vale la pena (aún si tuviese el doble de registros).

Sólo que hay un problema: Demora alrededor de cuatro minutos en cargar la tabla. Y quiero atenuar ese costo.

Para ello he considerado implementar un mecanismo por el cual el usuario pueda trabajar con la interfaz, mientras que, en segundo plano (con un segundo hilo —thread—) la tabla se carga por completo. Pondría en alguna esquina de la ventana una barra de progreso indicando el porcentaje de avance de la carga, pero me gustaría que el usuario pudiera "jugar con" (manejar) la información que hasta el momento se haya cargado.

Estoy conciente de que esto no solucionaría del todo el problema de la disponibilidad inmediata de la información (y habrá otras cosas que tendré que implementar para compensar), pero cuando menos no bloquearía la interfaz de usuario durante los procesos de carga. El usuario, en ciertas interfaces, será conciente de que la carga puede demorar algunos minutos (como bien ya sucede con grandes archivos de Excel que muchos usuarios esperan pacientemente a que se carguen para, ya estando la información en memoria, realizar una gran variedad de tareas con dicha información).

Algo me dice que el método TClientDataSet.CloneCursor podría estar involucrado en el mecanismo a implementar para esta idea. Pero no quisiera adelantarme más a las recomendaciones que ustedes pudieran hacerme.

De antemano gracias por sus valiosos comentarios. Estaré atento a sus respuestas.

Un abrazo rápido.

Al González. :)

Al González
03-05-2007, 08:10:11
¡Hola a todos!

Espero haberme explicado bien. ¿Alguien ya le entró a esto de la paginación en segundo plano (cargar un largo cursor de la base de datos mientras el usuario trabaja con la interfaz)?

Un abrazo todo ojos. :eek:

Al González. :)

Al González
13-05-2007, 21:31:08
¡Hola de nuevo!

Esta semana comenzaré a investigar sobre las ideas que tengo al respecto y haré algunas pruebas. Los mantendré informados.

De todas maneras les agradezco que me ayuden a generar retroalimentación en este solitario hilo. ;)

En verdad, muchas gracias por todo lo que puedan aportar a la causa. :cool:

Un abrazo saliendo de Durango (hoy conoceré las famosas vistas del Espinazo del Diablo).

Al González. :)

andiget
19-06-2007, 16:42:46
Cordial Saludo,

Resulta que yo tambien estoy interesado en este tema, por favor si has encontrado algo ya por favor podrias informarlo en este hilo.
Mi aplicacion debe estar consultando cada segundo en una BD Oracle y trayendo el ultimo dato insertado, y quiero que yo no me de cuenta de esta consulta y que mientras se realiza me deje libre la aplicacion para trabajar con la interfaz, ya que con hilos algunas veces se pone muy lento y no me deja trabajar en la interfaz bien.

maro
30-06-2007, 12:29:02
Hola,

No se si habrás solucionado ya tu problema.

Existe una método muy simple mediante el cual puedes ir consultando "bloques de registros" en la base de datos e ir añadiendolos
a un mismo tClientDataset final.
No se como respondería este proceso al ejecutarlo en un segundo hilo (no suelo trabajar con hilos) ya que tanto este procedimiento como el usuario podrían estar manipulando el mismo tClientdataset al mismo tiempo (aunque esto si podrías solventarlo clonando el tClientDataset :) )


Un Saludo.