Imprimir página | Cerrar ventana

Automatización de Objetos con Runtime de Access

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84677
Fecha de impresión: 26/Marzo/2026 a las 22:36


Tema: Automatización de Objetos con Runtime de Access
Publicado por: Soraya
Asunto: Automatización de Objetos con Runtime de Access
Fecha de publicación: 29/Agosto/2019 a las 08:52
Buenos días a tod@s.

Estoy trabajando en un programa que se compone de un Access, que utilizo como programa principal, y que llama a un segundo Access que contiene un Mapa al que se puede acceder desde distintas pantallas del programa principal. Además, el programa principal es el genérico para todos mis clientes y el Mapa es particular para cada cliente, por eso lo tengo separado en dos mdb's.

El caso es que en los equipos que tienen instalada la Runtime de Access 2007 no funciona la llamada al segundo Access (el que contiene el mapa). Sin embargo, en los equipos con Access instalado, funciona sin problemas.

Por lo que he podido leer por Internet, y si no lo he entendido mal, Las Runtimes de Access no permiten la automatización de otro Objeto Access. ¿Sabéis si esto es así?

Hasta el momento sólo he conseguido abrir el Access del mapa, sin que de problemas con la Runtime, usando ShellExecute(), pero necesito crearme un objeto Access.Application al hacer la llamada al mapa para pasarle el usuario validado en el programa principal y su categoría y la pantalla desde la que se hace la llamada al mapa para abrirlo de una manera u otra.

Os paso el código que estoy usando por si se os ocurre algo:

Dim AplicAccess As Access.Application
Dim RutaMapa As String

'Prueba 1: No funciona con Runtime
'Set AplicAccess = GetObject(RutaMapa)
'*********************************
'Prueba 2: No funciona con Runtime
'Set AplicAccess = CreateObject(RutaMapa)
'*********************************
'Prueba 3: No funciona con Runtime
'Set AplicAccess = New Access.Application
'AplicAccess.OpenCurrentDatabase RutaMapa
'*********************************

AplicAccess.Run "PonValoresUsuario", glUsuario, glCategoria
AplicAccess.DoCmd.OpenForm "Form_Mapa"

If EstaCargado("Form_Listado") = True Then
    AplicAccess.Run "Marcar_Seleccion_Mapa", "Form_Listado", True
Else
    AplicAccess.Run "Marcar_Seleccion_Mapa", "Form_Ficha", False
End If



¿Sabéis si hay otra forma de cargar un objeto Access.Application?


Por cierto, el código que sí me abre el Access el mapa con la Runtime es:

Call ShellExecute(hWndAccessApp, vbNullString, RutaMapa, vbNullString, vbNullString, 1)


Muchas gracias por vuestro tiempo.

Saludos, 

Soraya


-------------
Saludos



Respuestas:
Publicado por: Mihura
Fecha de publicación: 29/Agosto/2019 a las 10:28
Hola Soraya,

Veo lógico que no te deje abrir un Access por automatización, ya que NO tiene Access instalado. 

A falta de que algún genio nos desvele un camino desconocido Big smile  ... te propongo varias maneras de pasar los datos de la aplicación principal a la secundaria:

- te creas un fichero de texto desde el principal en el que incluyes los datos que necesitas, este fichero lo lee el secundario automáticamente al abrirse (doy por supuesto que tienes un Autoexec o un formulario que se abra automáticamente)

- pasas los valores necesarios del principal al secundario escribiéndolos en una tabla parámetros del secundario usando la cláusula IN (ésta es la que yo suelo usar)

- pasas los parámetros que necesitas en el comando ShellExecute:

Retval = Shell(Obtener_Path_Office("Access.Application") & " """ & ProgramaDestino & """ /cmd  ""Produccion""", 1)

    "Produccion" -> es el valor del parámetro pasado y desde dentro de Access lo recuperas con Command    https://support.office.com/es-es/article/command-funci%C3%B3n-fec67826-7fd7-48ed-a7aa-479c020ffaa4" rel="nofollow - Función Command





-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Soraya
Fecha de publicación: 29/Agosto/2019 a las 10:41
Gracias Jesús,

Mi plan B es el de pasar los valores que necesito en el Access del mapa a través de una tabla.

Sólo esperaba que hubiera un genio por ahí que supiera la manera de hacerlo de otra manera...

Saludos,

Soraya


Publicado por: Soraya
Fecha de publicación: 30/Agosto/2019 a las 11:18
Hola,

Al final lo he solucionado abriendo el mapa con ShellExecute y guardando los valores en una tabla que se encuentra en la BDD del mapa.

Para controlar si está abierto el mapa cuando salen de la aplicación principal, y cerrarlo en caso de estar abierto, me he guardado en esa tabla el valor de la variable hWndAccessApp, que se actualiza en la tabla cada vez que se abre el mapa.

Os pongo el código que he usado por si le viene bien a alguien:

He usado esta API:

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_CLOSE = &H10

Y al cerrar la aplicación principal hago la llamada a la API:

If Not IsNull(DLookup("hWndAccessApp", "Consulta_Variables_Apertura_Mapa")) Then
     Call PostMessage(DLookup("hWndAccessApp", "Consulta_Variables_Apertura_Mapa"), WM_CLOSE, 0, 0)  'Cierra el mapa
End If

Por mi parte se puede cerrar el hilo.

Saludos y gracias,

Soraya



Imprimir página | Cerrar ventana