PDA

Ver la Versión Completa : ProgressBar y Select


brandolin
24-11-2003, 16:33:31
Hola a todos, lo que quiero hacer es que se muestre el progreso de una consulta select en un progressbar.

Es decir. Antes de lanzar la consulta que el progress bar esta vacio pero que se complete a medida que se complete la consulta. No se si hay algo con lo que pueda averiguar el tamaño de la consulta en forma anticipada o bien algo que pueda hacer algo parecido...

He visto hecho esto en otros sistemas ya implementados pero no se como lo han hecho, ¿alguna sugerencia?

Gracias, desde ya....

haron
26-11-2003, 14:50:11
puedes separar la consulta en partes, por ejemplo:

insert into tabla(...)
values(...)

se transforma en:

insert into tabla(...)
values(...)
where campo between (:param1 and :param2)

y vas ejecutando cada parte de manera que juntas completan el todo. 'campo' puede ser un campo fecha, etc...

puedes hacer tambien un procedimiento almacenado y lanzar una señal cada cierto tiempo desde el procedimiento a tu aplicacion. nunca lo he hecho, pero se que en la paleta de interbase (por poner un ejemplo) hay un componente que captura señales enviadas por la base de datos para que el programa actualice registros, etc...

jachguate
26-11-2003, 14:51:41
La verdad, no conozco una sola base de datos que tenga un mecanismo para preguntarle como va una consulta SQL... asi que sinceramente no creo que podas hacer algo como lo que queres...

:(

delphi.com.ar
26-11-2003, 15:01:59
Extraído del Help de las RxLibs:
TDBProgress component

TDBProgress is a wrapper for a Borland Database Engine (BDE) generic progress callback and (in 32-bit version only) trace callback functions. Generic progress callback is issued by BDE to inform applications about the progress made during large batch operations, such as DbiBatchMove. The Generic Progress Report callback allows the client to obtain progress reports during an operation, and to cancel the operation, if desired. This callback is generated when working with Paradox driver and with some other BDE drivers. The query execution generates some text messages and BatchMove execution generates text and percent notifications. You can specify the MessageControl property and Gauge property to display BDE messages and percentage.

For some operations, a percentage completed is passed back to the callback function, for most others a string containing progress information is passed back; for simple database operations no progress information is returned at all. It has been our experience that percentages are mainly passed back in operations where the BDE must physically sort a local database file, such as in indexing DBase files. It is of course possible to interpret the messages passed back and calculate your own percentage completed.

32-bit trace callback is a system-level callback that can be used to retrieve trace information.

TraceFlags specifies the database operations to track with the OnTrace event at run time while Trace property is True.

Saludos!

jachguate
26-11-2003, 16:03:06
delphi.com.ar comentó:
for simple database operations no progress information is returned at all

Desde mi punto de vista (y puedo estar equivocado) esto significa que un select no genera información de CallBack.

Claro que un select puede ser una operación muy compleja y tardada, pero desde el punto de vista del BDE es una operación simple, pues solamente una instrucción se envia a la base de datos, y se espera por su respuesta (un cursor).

Quizas genere alguna información de callback cuando comience a recibir registros, excatamente al hacer fetch de cada registro, que si es una operación explicita del BDE.

Pero, una consulta puede tardar 1 hora en procesarse, y devolver los registros que genere en solo unos segundos... asi que ese avance no será confiable. Además, no creo que el BDE tenga forma de calcular un porcentaje de avance ni en este momento, porque no conoce de antemano cuantos registros generará la consulta.

En fin... habia que probar el componente, si es que usas el BDE para conectarte y que a pesar de tener años con las rusas, no me era conocido.

Hasta luego.

;)

delphi.com.ar
26-11-2003, 16:29:42
Pues me han mareado... no me había fijado que hablaba de una consulta de selección.

¿Qué es lo que quieres hacer realmente?... ¿Dónde cargas la consulta? ¿En un DBGrid?... ¿Ordenas los datos?

roman
26-11-2003, 16:39:21
Además de lo dicho por jachguate tengo entendido que con el BDE ni si quiera es posible cancelar una consulta.

Lo que menciona haron podría funcionar pero la consulta total será irremediablemente más larga y quizá no sea conveniente tan sólo para mostrar una barra de progreso.

A veces no queda más remedio que simplemente presentar un mensaje:

"Espere por favor..."

// Saludos

ElDioni
10-11-2005, 17:04:17
hola tengo un programa en el que solo se realizan filtros en una tabla dbf por medio de un query, la tabla en cuestion tiene ya muchos registros por lo que cada vez que hacia una consulta tardaba mucho en mostrarme los resultados, como no tenia ni idea de delphi (y ahora tampoco es que sea un master) cogi una barra de progreso que empieza en 0 y termina en 100 y en los eventos del query before close, after close, before open y after open incrementaba en 25 el progreso de la barra con lo que consegui una simulacion de carga de la consulta, no se si estoy diciendo una burrada por la forma de hacerlo, pero era por darle una solucion sencilla al problema de la barra de progresos.