Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Providers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Paginación en segundo plano (¿"background paging"?)

¡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.
Responder Con Cita
  #2  
Antiguo 03-05-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.

Al González.
Responder Con Cita
  #3  
Antiguo 13-05-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.

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

Al González.
Responder Con Cita
  #4  
Antiguo 19-06-2007
Avatar de andiget
andiget andiget is offline
Miembro
 
Registrado: mar 2007
Ubicación: Medellin, Colombia
Posts: 12
Poder: 0
andiget Va por buen camino
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.
__________________
Código PHP:
echo ("Yo soy la clase de personas con las que mi padre no quiere que me junte"); 
Responder Con Cita
  #5  
Antiguo 30-06-2007
maro maro is offline
Miembro
 
Registrado: sep 2003
Ubicación: Sevilla
Posts: 104
Poder: 21
maro Va por buen camino
Talking

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.
__________________
Maro. OutSourcing de programación con Delphi.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
Ventana MDI, "Siempre visible" y "Pantalla completa" ixMike API de Windows 7 11-04-2007 18:36:55
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
"background process" y Aplicacion MDI ANG4L Varios 5 27-09-2006 16:05:42
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16


La franja horaria es GMT +2. Ahora son las 23:46:41.


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