PDA

Ver la Versión Completa : Refrescar tabla o consulta en LAN


isracdc
22-07-2021, 16:16:59
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
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/RADStudio/Rio/en/Database_Alerts_(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
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
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:


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.