Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 3 Días
Yps Yps is offline
Registrado
 
Registrado: sep 2019
Posts: 9
Poder: 0
Yps Va por buen camino
Notificación de cambios en MSaccess

Hola a todos. espero que alguien me pueda ayudar con mi problema, que es el siguiente: accedo a una DB MSAccess desde dos programas hechos en Delphi. ¿Cómo puedo actualizar el dbgrid del programa 2, cuando inserto un registro desde el programa 1 ya que MSAccess no dispone de triggers y otras caracteristicas?
Responder Con Cita
  #2  
Antiguo Hace 2 Días
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.430
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Yps Ver Mensaje
Hola a todos. espero que alguien me pueda ayudar con mi problema, que es el siguiente: accedo a una DB MSAccess desde dos programas hechos en Delphi. ¿Cómo puedo actualizar el dbgrid del programa 2, cuando inserto un registro desde el programa 1 ya que MSAccess no dispone de triggers y otras caracteristicas?
Access no posee "Database Alerts" o "Eventos de notificación" como se conocen y que soporta FireDAC (por ejemplo):
https://docwiki.embarcadero.com/RADS...lerts_(FireDAC)

Son eventos que sirven para comunicar desde la Base de Datos a tu aplicación (mediante los componentes de conexión) que ha habido cambios en alguna tabla:
https://neftali.clubdelphi.com/event...notifications/

Access, como bien dices, tampoco soporta triggers, aunque eso no te ayudaría a que la aplicación conociera si ha habido cambios.

La única forma que se me ocurre desde la aplicación es hacer un "pooling" periódico, o lo que es lo mismo, ir preguntando de forma periódica si ha habido cambios en la tabla para refrescar un Grid. Si esa query (por eficiencia) no quieres hacerla sobre la tabla de datos que estás mostrando, lo que se suele hacer es una pequeña tabla con un Timestamp (marca de tiempo), que te marca cuando ha sido la última modificación de la "tabla A" (y de otras tablas), de forma que desde tu aplicación debe ir haciendo el "pooling" a esta tabla (mucho más rápido, ya que es una tabla pequeña y con pocos campos y registros).

Si tienes una modificación pendiente, entonces actualizas el Grid (y eliminas el registro en la tabla de pooling); De esa forma te evitas ese refresco constante con muchos datos, que suele ser más costoso.
Para crear un registro es esa tabla de "pooling", sí que te ayudaría tener triggers (ya que podrías hacerlo de forma automática), pero en el caso de MSAccess deberás realizarlo tú de forma manual.

No se si me he explicado bien, espero que si.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo Hace 2 Días
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.177
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo más simple es un Timer que haga un refresh de la tabla cada cierto tiempo.
Otra opción puede ser crear un ficherito en un directorio compartido entre ambos equipos y un componente que recibe una notificación del sistema cuando hay algún fichero nuevo en ese directorio. En ese momento haces el refresh.
Responder Con Cita
  #4  
Antiguo Hace 2 Días
Yps Yps is offline
Registrado
 
Registrado: sep 2019
Posts: 9
Poder: 0
Yps Va por buen camino
Gracias por interesarte en mi problema!! La verdad es que había pensado en la solución con el timer. No la he implementado ya que tenía la esperanza de encontrar una solución mejor pero parece que tendré que recurrir al timer. Una vez más gracias por el interés.
Responder Con Cita
  #5  
Antiguo Hace 2 Días
Yps Yps is offline
Registrado
 
Registrado: sep 2019
Posts: 9
Poder: 0
Yps Va por buen camino
En cuanto a lo del "pooling" la explicación a sido buena, aunque no sé cómo hacerlo, si no es mucho pedir podrías enviarme algún enlace donde se explique como implementarlo. Realmente me interesa!!
Responder Con Cita
  #6  
Antiguo Hace 1 Día
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.430
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Yps Ver Mensaje
En cuanto a lo del "pooling" la explicación a sido buena, aunque no sé cómo hacerlo, si no es mucho pedir podrías enviarme algún enlace donde se explique como implementarlo. Realmente me interesa!!

El "pooling" no es más que lo que ha comentado [Casimiro]. Ir preguntando periódicamente por el estado de algo para saber si ha sufrido cambios (en este caso los cambios en la tabla).
La implementación con un Timer o con un thread separado.

Lo que si considero importante es, que si la tabla de la que quieres refrescar el Grid es muy grande, no pregunte directamente a la tabla (refrescando el grid), sino que lo hagas con una tabla secundaria (pequeña y de acceso rápido). Por ejemplo, si tienes una tabla de OPERACIONES que visualizas en un grid y quieres mantenerla actualizada, pero es grande, te creas una segunda tabla pequeña con esta estructura:

HAY_CAMBIOS_OPERACIONES
-------------------------------------

ID; Autonumerico;NOT NULL
ULTIMOCAMBIO; FechaHora; NOT NULL

1) Cuando hay un cambio en la tabla de operaciones, haces un INSERT en la tabla HAY_CAMBIOS_OPERACIONES
2) El pooling o el Timer hace la consulta sobre la tabla HAY_CAMBIOS_OPERACIONES, en lugar de sobre la tabla de OPERACIONES
(esto sale a cuenta si la tabla de OPERACIONES es pesada/grande y las consultas costosas)
a) Si la tabla HAY_CAMBIOS_OPERACIONES tiene registro, actualizas el GRID y borras ese registro
b) Si la tabla HAY_CAMBIOS_OPERACIONES NO tiene registros es que no habido cambios y no hay que hacer nada más.

Lo dicho, esta tabla HAY_CAMBIOS_OPERACIONES sale a cuenta mantenerla si la tabla OPERACIONES es grande y no quieres estar continuamente generando esas consultas costosas. Si la taba original (OPERACIONES) es pequeña o la consulta se hace con filtros y no es costosa, esta técnica de usar una segunda tabla no es necesaria.

Esta es la idea simple, hay variantes, como que la tabla HAY_CAMBIOS_OPERACIONES, sea más genérica y te pueda servir para más tablas. En este caso el TimeStamp no haría falta estrictamente, sólo que exista registro, etc, etc, etc,... (el ejemplo es simple y rápido para explicar la idea, no es una implementación final).

Espero que la idea se haya entendido.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo Hace 12 Horas
Yps Yps is offline
Registrado
 
Registrado: sep 2019
Posts: 9
Poder: 0
Yps Va por buen camino
muchas gracias por sus respuestas, gracias a ustedes por ayudarme en mi problema. también queria comentarles que había pensado en solucionar el problema usando sendmessage para enviar un mensaje desde el programa 1 al programa 2, pero no pude ya que el programa 1 es un servicio de windows y no me funciona findWindow para poder saber cual es el handle del programa 2
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
MSACCESS WHERE con LIKE y Delphi7 con ADO saldanaluis Conexión con bases de datos 2 11-11-2010 05:58:55
Notificación de Cambios marcial Firebird e Interbase 8 18-11-2008 20:58:02
Tumbar msaccess Luis F. Orjuela Conexión con bases de datos 1 05-04-2007 11:05:19
MSAccess o SQL Server Cabanyaler Conexión con bases de datos 3 17-08-2005 14:55:04
objeto ole MSACCESS veronica Gráficos 1 19-11-2004 16:07:22


La franja horaria es GMT +2. Ahora son las 07:15:46.


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