ms access - refrescar - Error intermitente al intentar controlar otra base de datos en VBA
on error resume next vb6 (3)
Tengo el siguiente código:
Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "/Working.mdb")
obj.Run "Routine"
obj.CloseCurrentDatabase
Set obj = Nothing
El problema que estoy experimentando es una ventana emergente que me dice que Access no puede establecer el foco en la otra base de datos. Como puede ver en el código, quiero ejecutar una subrutina en otro mdb. Cualquier otra forma de lograr esto será apreciada.
Estoy trabajando con MS Access 2003.
Este es un error intermitente. Como se trata de un código de producción que se ejecutará solo una vez al mes, es extremadamente difícil de reproducir, y no puedo darle el texto y el número exactos en este momento. Es el segundo mes que esto sucede.
Sospecho que esto puede ocurrir cuando alguien está trabajando con esta u otra base de datos.
El flujo de datos es actualizar todos los ''proyectos'' una vez al mes en una base de datos y luego hacer que esta información esté disponible en la otra base de datos.
Tal vez sea por la primera línea del código ''Rutinas'': Si vbNo = MsgBox ("¿Desea actualizar?", VbYesNo, "Actualizar") A continuación, Salir de la función End If If
Haré otra subrutina sin MsgBox.
He podido reproducir este comportamiento. Sucede cuando el foco tiene que cambiar a la base de datos llamada, pero el usuario establece el foco ([ALT] + [TAB]) en la primera base de datos. La ''solución'' fue educar al usuario.
Este es un error intermitente. Como se trata de un código de producción que se ejecutará solo una vez al mes, es extremadamente difícil de reproducir, y no puedo darle el texto y el número exactos en este momento. Es el segundo mes que esto sucede.
Sospecho que esto puede ocurrir cuando alguien está trabajando con esta u otra base de datos.
El flujo de datos es actualizar todos los ''proyectos'' una vez al mes en una base de datos y luego hacer que esta información esté disponible en la otra base de datos.
Tal vez sea por la primera línea del código ''Rutinas'': Si vbNo = MsgBox ("¿Desea actualizar?", VbYesNo, "Actualizar") A continuación, Salir de la función End If If
Haré otra subrutina sin MsgBox.
Lo intenté en nuestra base de datos de desarrollo y funciona. Esto no significa nada, ya que el otro código también funciona bien en el desarrollo.
Pude reproducir el error en ''desarrollo''.
"Esta acción no se puede completar porque la otra aplicación está ocupada. Elija ''Cambiar a'' para activar ..."
Realmente no puedo ver el resto del mensaje, ya que está parpadeando muy rápido. Supongo que este error se debe a ''cambiar'' entre las dos bases de datos. Espero que, al educar al usuario, esto se detenga.
Philippe, tu respuesta es, por supuesto, correcta. Hubiera elegido ese camino si no hubiera desarrollado la ''rutina'' de antemano.
"He podido reproducir este comportamiento. Sucede cuando el foco tiene que cambiar a la base de datos llamada, pero el usuario establece el foco ([ALT] + [TAB]) en la primera base de datos. La ''solución'' era educar al usuario ". Como es imposible evitar que el usuario cambie de aplicación en Windows, me gustaría cerrar el tema.
Si desea otra forma de ejecutar la función, intente lo siguiente:
Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "/Working.mdb")
obj.DoCmd.RunMacro "MyMacro"
obj.CloseCurrentDatabase
Set obj = Nothing
Donde '' MyMacro '' tiene una acción de '' RunCode '' con el nombre de función que preferiría ejecutar en Working.mdb
Supongo que este mensaje de error está vinculado al estado de una de sus bases de datos. Está utilizando aquí las conexiones Jet y los objetos Access, y es posible que no pueda, por varias razones (entorno multiusuario, imposibilidad de eliminar el archivo LDB Lock, etc.), cerrar adecuadamente su base de datos activa y abrir otra. Entonces, según yo, la solución es olvidar el motor de Jet y usar otra conexión para actualizar los datos en la "otra" base de datos.
Cuando diga "El flujo de datos es para actualizar todos los ''proyectos'' una vez al mes en una base de datos y luego poner esta información disponible en la otra base de datos", asumo que la función de su "Rutina" es actualizar algunos datos, ya sea a través de SQL instrucciones o actualizaciones equivalentes del conjunto de registros.
¿Por qué no intenta realizar las actualizaciones correspondientes abriendo una conexión a su otra base de datos y (1) enviando las instrucciones SQL correspondientes o (2) abriendo el conjunto de registros y realizando las actualizaciones solicitadas?
Una idea sería, por ejemplo:
Dim cn as ADODB.connexion,
qr as string,
rs as ADODB.recordset
''qr can be "Update Table_Blablabla Set ... Where ...
''rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo
set cn = New ADODB.connexion
cn.open
You can here send any SQL instruction (with command object and execute method)
or open and update any recordset linked to your other database, then
cn.close
Esto también se puede hacer a través de una conexión ODBC (y DAO.recordsets), para que pueda elegir sus objetos favoritos.