Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Refrescar tabla o consulta en LAN (https://www.clubdelphi.com/foros/showthread.php?t=95302)

isracdc 22-07-2021 16:16:59

Refrescar tabla o consulta en LAN
 
Saludos a todos, soy yo de nuevo XD.
Verán, estaba haciendo algunas pruebas con MySQL y C++Builder uso 10.3.
Tengo una aplicación que corre perfectamente en PC1 por ejemplo, la misma la llevé a otra PC2, la BD está alojada en la PC1 y por ODBC desde ambas aplicaciones se conectan correctamente a la BD en PC1, están en la misma red local.
Mi duda es la sgte: al utilizar la app en PC1 y por ejemplo aumentar stock de un producto, el aumento no se ve reflejado en la PC2 (por ejemplo si estoy mostrando la info en un DBGrid) y tampoco viceversa, si modifico algo desde la PC2, no se refleja en la app de la PC1. Qué debería hacer para "refrescar" esa información, ya sea tabla o consulta en la otra aplicación que está utilizando la misma aplicación en otro ordenador? He utilizado los componentes ADO para todo. Gracias de antemano a sus respuestas que me están ayudando bastante.

Casimiro Notevi 22-07-2021 17:37:10

Si es un dbgrid, puedes poner el botón "refrescar", es lo más simple.
Si dejan abierto ese form con el dbgrid durante varias horas o días, por decir algo, lo normal sería refrescar para ver los datos actualizados.
Con algunas BD como firebird existen los eventos que puedes controlar para estos temas, pero desconozco si con mysql es posible.
También puedes añadir un timer que ejecute el refresh cada ¿una hora?
Aunque todo depende de la importancia que tenga el mostrar esos datos actualizados en un dbgrid dejado abierto.

Neftali [Germán.Estévez] 23-07-2021 10:19:15

Cita:

Empezado por Casimiro Notevi (Mensaje 542043)
Con algunas BD como firebird existen los eventos que puedes controlar para estos temas, pero desconozco si con mysql es posible.


Lo que comenta [Casimiro] son los "Query Notifications" que tienen algunas BBDD.
Para acceder a ellos tienes un componente de FireDAC llamado TFDEventAlerter (http://docwiki.embarcadero.com/RADSt...lerts_(FireDAC)).

Aunque en la documentación no aparece MySQL. O porque la BBDD no soporta las notificaciones o porque FireDAC no lo tiene implementado para MySQL.

isracdc 23-07-2021 15:09:44

Cita:

Empezado por Casimiro Notevi (Mensaje 542043)
Si es un dbgrid, puedes poner el botón "refrescar", es lo más simple.
Si dejan abierto ese form con el dbgrid durante varias horas o días, por decir algo, lo normal sería refrescar para ver los datos actualizados.
Aunque todo depende de la importancia que tenga el mostrar esos datos actualizados en un dbgrid dejado abierto.

La idea es para un inventario, me pusieron el caso de que una PC está en caja y la otra se encuentra en un depósito, al momento de aumentar productos en depósito, que ese aumento se vea reflejado (mucho mejor si es al instante) en la aplicación que también estaría abierta en la PC de caja. Lo del Timer puede ser una opción, pero en algunos casos consume recursos tenerlo abierto bastante tiempo, porque aparte de necesitar "refrescar" la información sería constante, tanto para aumentar inventario, como para hacer una venta(que reduce inventario).
Nunca he utilizado los componentes de FireDAC :(

Casimiro Notevi 23-07-2021 16:32:12

Por lo que me ha parecido entender, creo que es innecesario lo que pretendes hacer.

¿Acaso tienes en pantalla, al mismo tiempo, todos los artículos existentes, y hay alguien mirando esa pantalla para ver si aumentan o disminuyen las existencias?

mamcx 23-07-2021 17:26:34

Cita:

Empezado por isracdc (Mensaje 542041)
Mi duda es la sgte: al utilizar la app en PC1 y por ejemplo aumentar stock de un producto, el aumento no se ve reflejado en la PC2 (por ejemplo si estoy mostrando la info en un DBGrid) y tampoco viceversa, si modifico algo desde la PC2, no se refleja en la app de la PC1.

Apuesto es porque fundamentalmente no entiendes como usar un RDBMS de servidor. A diferencia de BD de archivos, NO se supone que mantengas "viva" la consultas/tablas desde que inicias la app hasta que terminas.

En CADA ocasión que vas a mostrar datos, DEBES re-consultar la BD. Es incluye si vas de un registro a otro en un flujo de edición. Asi que deberías tener un contante "Query.Open, Query.Close" cada vez que vas fluyendo.

Unicamente tiene algo de sentido mantener la CONEXION abierta, o usar un pool de conexiones y en cada query abrir de nuevo la conexión. Idealmente:

Código Delphi [-]
function query_xxx(...) -> TClientDataset
begin
     con := Db.open() //de un pool para que sea eficiente!
     query.execute(con)
     //Aqui ya no hay ni query ni con abierto
end

Un BD remota se supone que se acceda de esta forma. Recuerda que estas dentro de una BD transaccional y las transacciones deben ser CORTAS, de solo segundos de estar abiertas.

---

Y en caso de lo que dices, hacer polling no es algo que deberías preocuparte a menos que tengas CIENTOS de "escuchas" a la vez.


La franja horaria es GMT +2. Ahora son las 16:13:31.

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