Pregunta

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.Se agradecerá cualquier otra forma de lograrlo.

Estoy trabajando con MS Access 2003.

Este es un error intermitente.Como este es 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 consiste en 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.

Quizás se deba a la primera línea del código 'Rutinas':Si vbno = msgbox ("¿Quieres actualizar?", Vbyesno, "actualizar") y luego salir de la función de salida si

Haré otra subrutina sin MsgBox.

He podido reproducir este comportamiento.Ocurre 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 este es 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 consiste en 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.

Quizás se deba a la primera línea del código 'Rutinas':Si vbno = msgbox ("¿Quieres actualizar?", Vbyesno, "actualizar") y luego salir de la función de salida si

Haré otra subrutina sin MsgBox.


Probé esto en nuestra base de datos de desarrollo y funciona.Esto no significa nada ya que el otro código también funciona bien en desarrollo.

¿Fue útil?

Solución 3

He podido 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 porque parpadea muy rápido.Supongo que este error se debe al "cambio" entre las dos bases de datos.Espero que, educando al usuario, esto pare.

Philippe, tu respuesta es, por supuesto, correcta.Habría elegido ese camino si no hubiera desarrollado la "rutina" de antemano.

"He podido reproducir este comportamiento.Ocurre 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." Como es imposible evitar que el usuario cambie de aplicación en Windows, me gustaría cerrar el tema.

Otros consejos

Supongo que este mensaje de error está vinculado al estado de una de sus bases de datos.Está utilizando aquí conexiones Jet y objetos de Access, y es posible que no pueda, por múltiples razones (entorno multiusuario, imposibilidad de eliminar el archivo LDB Lock, etc.), cerrar correctamente su base de datos activa y abrir otra.Entonces, según yo, la solución es olvidar el motor Jet y utilizar otra conexión para actualizar los datos en la "otra" base de datos.

Cuando dices "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", asumo que la función de tu "Rutina" es actualizar algunos datos, ya sea vía SQL instrucciones o actualizaciones de conjuntos de registros equivalentes.

¿Por qué no intenta realizar las actualizaciones correspondientes abriendo una conexión a su otra base de datos y (1) envía 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 puedas elegir tus objetos favoritos.

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

Dónde 'MiMacro'tiene una acción de'Ejecutar código' con el nombre de la función que preferirías ejecutar en Working.mdb

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top