none
Forzar refresco de tabla tras ser actualizada externamente RRS feed

  • Pregunta

  • Buenos días

    Estoy teniendo problemas en la actualización de uns tablas tras ser modificadas externamente.

    Mi proceso es:

    1.- Lanzo una aplicacion externa a travésd e un shell, en particular un objeto WshShell que me permite que Access se quede a la espera (waitOnReturn)

    2.- Desde la aplicación inserto un registro en una tabla de mi base de datos (es una aplicacion en c#, y ejecuto un comando ExecuteNonQuery)

    3.- Al finalizar el shell, intento leer los datos recién insertados... y me da error!. Pero si abro las tablas manualmente, los nuevos registros están ahí. Es mas, tras aparecer el error, entro 'pausa' en modo depuración. En ese momento abro manualmente las tablas (desde el interfaz), veo que los datos están ahí, cierro las tablas, y le doy a 'continuar', y el código continua sin error (ahora SI encuentra los registrios)

    Este es mi código:

    Dim wsh As Object
    Dim waitOnReturn As Boolean
    Dim errorCode As Integer

    Set wsh = CreateObject("WScript.Shell")

    waitOnReturn = True
    errorCode = wsh.Run("InsertRecordsInMyTable.exe", vbMaximizedFocus, waitOnReturn)

    If errorCode <> 0 Then GoTo Error:

    Dim dbf As DAO.Database
    Dim UpdatedTable As DAO.Recordset

    Set dbf = CurrentDb
    Set UpdatedTable = dbf.OpenRecordset("MyTable", dbOpenTable)
    UpdatedTable.MoveFirst    'ERROR! NO RECORDS!


    Hay alguna manera de forzar la actualizacion de la tabla antes de abrirla y llamar a 'movefirst'? He intentado incluso abrir y cerrar la tabla antes de intentar leer, sin éxito

    Muchas gracias :)

    lunes, 7 de marzo de 2016 15:17

Respuestas


  • Finalmente, en StackOverflow han respondido a mi cuestión (cito la fuente porque no he sido yo el que encontró la respuesta)  :)

    http://stackoverflow.com/questions/35845349/ms-access-table-not-refreshing-correctly-after-inserting-with-c-sharp-executenon

    El problema estriba en que la sesión de Access no es consciente de la inserción de los nuevos registros por parte de la conexión externa. Lo que se abre con OpenRecordset es la tabla de la 'cache' de su propia conexión, que puede tardar un poco en actualizarse. Así que la solución es FORZAR el refresco de la conexión ¿Como? A través de una instancia un objeto JRO.JetEngine.

    https://msdn.microsoft.com/en-us/library/bb213241(v=office.12).aspx

    Este objeto permite realizar varias acciones, como compactar la base de datos o REFRESCAR LA CACHE

    https://msdn.microsoft.com/en-us/library/bb237216(v=office.12).aspx

    Así que, simplemente, después de finalizar el shell, y antes de abrir la tabla, añadimos la linea:

    CreateObject("JRO.JetEngine").RefreshCache CurrentProject.Connection

    Ahora SI aparecen los registros insertados por la aplicación lanzada desde el shell :)

    Gracias por vuestros rápidos comentarios. Siento haberos molestado. Al menos, espero haber aportado algo con esta pregunta.

    Un saludo :)






    • Marcado como respuesta FJ Gomez martes, 8 de marzo de 2016 11:11
    • Editado FJ Gomez martes, 8 de marzo de 2016 11:20
    martes, 8 de marzo de 2016 10:13

Todas las respuestas

  • Hola!

    no me parece coherente tu pregunta: "Hay alguna manera de forzar la actualizacion de la tabla antes de abrirla" si la tabla está cerrada, al abrirla ya estará actualizada, por tanto no entiendo que pretendes o no te has explicado bien.


    Saludos a todos desde Huelva Emilio http://www.mvp-access.es/emilio/

    lunes, 7 de marzo de 2016 19:19
  • Hola

    Para evitar errores al intentar moverte por un recordset que no tiene registros, debes comprobar las propiedades BOF y EOF del mismo. Sí ambas son true, el recorset no tiene registros.

    Y si, no tiene sentido eso de forzar la actualización antes de abrir. Tiene sentido forzarlo DESPUÉS de abrirla.

    Salu2,


    José Mª Fueyo


    martes, 8 de marzo de 2016 7:32

  • Finalmente, en StackOverflow han respondido a mi cuestión (cito la fuente porque no he sido yo el que encontró la respuesta)  :)

    http://stackoverflow.com/questions/35845349/ms-access-table-not-refreshing-correctly-after-inserting-with-c-sharp-executenon

    El problema estriba en que la sesión de Access no es consciente de la inserción de los nuevos registros por parte de la conexión externa. Lo que se abre con OpenRecordset es la tabla de la 'cache' de su propia conexión, que puede tardar un poco en actualizarse. Así que la solución es FORZAR el refresco de la conexión ¿Como? A través de una instancia un objeto JRO.JetEngine.

    https://msdn.microsoft.com/en-us/library/bb213241(v=office.12).aspx

    Este objeto permite realizar varias acciones, como compactar la base de datos o REFRESCAR LA CACHE

    https://msdn.microsoft.com/en-us/library/bb237216(v=office.12).aspx

    Así que, simplemente, después de finalizar el shell, y antes de abrir la tabla, añadimos la linea:

    CreateObject("JRO.JetEngine").RefreshCache CurrentProject.Connection

    Ahora SI aparecen los registros insertados por la aplicación lanzada desde el shell :)

    Gracias por vuestros rápidos comentarios. Siento haberos molestado. Al menos, espero haber aportado algo con esta pregunta.

    Un saludo :)






    • Marcado como respuesta FJ Gomez martes, 8 de marzo de 2016 11:11
    • Editado FJ Gomez martes, 8 de marzo de 2016 11:20
    martes, 8 de marzo de 2016 10:13
  • Gracias por compartirlo

    Saludos,


    José Mª Fueyo

    martes, 8 de marzo de 2016 12:54