PDA

Ver la Versión Completa : ¿ Que Método usar para refrescar los Combobox ?


Carmelo Cash
25-08-2008, 15:00:38
Hola Foro:

Estoy Utilizando Delhi 6 y SQL Server 2005, para conectarme uso DBexpress.

El problema que tengo es que al abrir los formularios, los combobox están actualizados, pero si en alguna terminal agregan un registro (por ejemplo) a al tabla de "Provincias", este registro no se vé en los combobox de los formularios que están abiertos.
Por ahora deben cerrar y volver a abrir el formulario pero no es una solución muy elegante que digamos.

los combobox que uso son los "DBLookupCombobox" conectados a un
TDataSourse>>TClientDataSet>>TDatasetProvider>>TSQLQuery>>TSQLConection ...(uff!...)

Los puedo refrescar haciendo

ClientDataSet.Active:=False;
ClientDataSet.Active:=True;

Pero el tema es ¿Cuando y cómo?.

1- No vale hacerlo en el evento "on Click", ya que genera un gran tráfico de red y los datos del combobox se modifican muy de vez en cuando.

2- Puede ser una variable que diga "Si Hay que refrescar" y Preguntar en el evento on Click por esa variable. mmmm... no sé.

3- Puede ser colocar en el formulario un Botón que diga "Refrescar"... (no me gusta, pero...)

4- Colocar un Timer que refresque cada tanto ( generaría un tráfico de red inútil ).

Lo ideal sería que los combobox se atualicen unicamente al ser modificada al tabla.

Hace un tiempo atrás dejé planteado este tema pero con otra Base de Datos y no quedó aclarado, tal vez con SQL Server se pueda solucionar.

Desde ya muchas gracias por su atención.
:cool:

felipe88
25-08-2008, 16:58:12
Si solo deberia cambiar cuando se hace alguna actualizacion en la Bd, creo que es el momento en el que deberia actualizar el combo, o simplemente la pasas el valor que va a ser agregado en la tabla al combo... es una idea :)

Carmelo Cash
25-08-2008, 17:08:53
Gracias Felipe:
Efectivamente "deberia cambiar cuando se hace alguna actualizacion en la Bd, creo que es el momento en el que deberia actualizar el combo", pero el tema es cómo me entero que se actualizó la BD sin estar preguntado constantemente?.
Estoy buscando algún componente que me dispare el proceso, pero todavía no encuentro ninguno.

felipe88
25-08-2008, 17:22:29
pero el tema es cómo me entero que se actualizó la BD sin estar preguntado constantemente?.
¿Pero como no lo vas a saber?, obviamente tu creas el post, entonces usa el after insert por ejemplo.

Carmelo Cash
25-08-2008, 17:57:12
Gracias Felipe.

Es que en primer lugar nunca uso un post, ya que las tablas las actualizo todas con consultas SQL

DateBase.StarTransaction;
Q_Insert.ExecSQL;
DateBase.Commit;

En segundo lugar es que si en esta terminal modifico o agrego en una tabla, el tema es que dispare el proceso de actualización en las otras terminales.

felipe88
25-08-2008, 18:06:32
Gracias Felipe.

Es que en primer lugar nunca uso un post, ya que las tablas las actualizo todas con consultas SQL

DateBase.StarTransaction;
Q_Insert.ExecSQL;
DateBase.Commit;

En segundo lugar es que si en esta terminal modifico o agrego en una tabla, el tema es que dispare el proceso de actualización en las otras terminales.
Bueno ya te entiendo, pero si me gustaria saber algo ¿Como le pasas las terminales a los combo? :confused:... porque si lo traes de una consulta...:rolleyes:

RolphyReyes
25-08-2008, 18:50:16
Saludos.

En Interbase/Firebird tenemos los Eventos de la BD y con este mecanismo nos podemos dar cuenta de cualquier cosa acción.

En SQL Server desconozco si existe algo parecido pero es una idea de por donde empezar a buscar.

Carmelo Cash
26-08-2008, 00:18:07
Hola:
Gracias a ambos por responder:
Le digo a Felipe que los combobox que uso son los "DBLookupCombobox" conectados a un
TDataSourse>>TClientDataSet>>TDatasetProvider>>TSQLQuery>>TSQLConection ...(uff!...)

Con respecto a la propuesta hecha por Rolphi Reyes es la que me gustaría hacer, pero desconozco cómo capturar eventos en SQL Server 2005.

Tal vez el título de este hilo debería haber sido ese.

¿Cómo capturar eventos en SQL Server 2005?.

felipe88
26-08-2008, 14:30:56
Hola, para este caso, encontré estos articulos que espero te puedan ser de ayuda:

http://technet.microsoft.com/es-es/library/ms190176.aspx

http://technet.microsoft.com/es-es/library/ms190378.aspx

http://technet.microsoft.com/es-es/library/ms187875.aspx

Carmelo Cash
26-08-2008, 16:48:35
Esto se complica cada vez más, así que lo solucioné de la siguiente manera.

Voy a romper una de las premisas, (pero sólo una parte).

Recuerdan que para actualizar el combobox había que hacer

ClientDataSet.Active:=False;
ClientDataSet.Active:=True;
Pero...

1- No vale hacerlo en el evento "on Click", ya que genera un gran tráfico de red y los datos del combobox se modifican muy de vez en cuando.

Lo que hice fué crear una tabla con dos campos
el nombre de cada tabla y la fecha de última modificación de ésa tabla, que es un campo tipo DateTime llamado "Ultima_modificacion".

Entonces al abrir los formularios "Cargo" los "Combobox" y guardo la "Ultima_modificacion", Select Ultima_modificacion From Control where Tabla='Provincias' en una variable DateTime.

Luego en el evento on ClicK y del Combobox Ejecuto nuevamente la consulta Select Ultima_modificacion From Control where Tabla='Provincias' y la comparo con la variable que guardé anteriormente.
Si es distinta actualizo los combobox.

Este método tiene tres ventajas:

1.- Genera muy poco tráfico de red, ya que sólo viaja la fecha de la última modificación.

2- La opción de guardar la fecha de última modificación en una tabla externa hace que lo que tiene que procesar el servidor sea mucho menor.

3.- Al gefe le gustó.:D

Gracias a todos los que participaron y espero que esto le sirva a alguien.

felipe88
26-08-2008, 18:05:33
Que bueno que lo solucionaste... era lo que yo me imaginaba como lo mas corto para este caso, depronto no me supe explicar :rolleyes:, pero me alegro de que funcione :)

Carmelo Cash
30-08-2008, 02:38:14
Que pasa CHE!!!!

Se pudrió todo !!!

Se vienen los chinos a ofrecer chinas???

Avisen al administrador que hay un colado!!!

egostar
30-08-2008, 02:50:43
Que pasa CHE!!!!

Se pudrió todo !!!

Se vienen los chinos a ofrecer chinas???

Avisen al administrador que hay un colado!!!

Avisados están :)

Salud OS