Cómo actualizar vínculos en una aplicación en tiempo de ejecución de Microsoft Access


Resumen


En una aplicación de tiempo de ejecución, las bases de datos front-end y back-end deben almacenarse en la misma carpeta. Aunque se puede cambiar la ruta de instalación predeterminada de la base de datos back-end, por ejemplo, $AppPath\Folder1, no existe forma de Access actualizar los vínculos en el front-end para que coincida con la nueva ubicación de la instalación.

Es una forma de evitar este comportamiento actualizar mediante programación los vínculos mediante el uso de objetos de extensibilidad de ActiveX (ADOX) después de instalar la aplicación en tiempo de ejecución. La siguiente es una ilustración de cómo implementar esta técnica. Tenga en cuenta que este artículo se supone que las bases de datos de back-end se almacenan en subcarpetas de la base de datos front-end.

Más información


  1. Asegúrese de que tiene la versión más reciente de los componentes de acceso de datos de Microsoft (MDAC) instalado en el equipo. MDAC puede encontrarse en el siguiente sitio Web de Microsoft:
  2. Establecer una referencia a Microsoft ADO Ext 2.5 (o posterior) para DDL y seguridad.
  3. Crear una nueva base de datos y asígnele el nombre FrontEnd.mdb.
  4. Importar los formularios clientes y empleados de la base de datos de ejemplo Neptuno.mdb FrontEnd.mdb.
  5. Crear una nueva base de datos y una subcarpeta en la carpeta donde el archivo FrontEnd.mdb se encuentra, por ejemplo, Folder1\Backend1.mdb.
  6. Importar la tabla Customer de Neptuno.mdb en Backend1.mdb.
  7. Crear una nueva base de datos y una subcarpeta en la carpeta donde el archivo FrontEnd.mdb se encuentra, por ejemplo, Folder2\Backend2.mdb.
  8. Importar la tabla empleados de Neptuno.mdb en Backend2.mdb.
  9. Abra la base de datos de FrontEnd.mdb y cree un nuevo módulo. En el módulo, pegue el código siguiente:
    Option Compare DatabaseOption Explicit

    Private Declare Function apiSearchTreeForFile Lib "ImageHlp.dll" Alias _
    "SearchTreeForFile" (ByVal lpRoot As String, ByVal lpInPath _
    As String, ByVal lpOutPath As String) As Long


    Function RefreshLinks()
    On Error GoTo ErrorHandler


    Dim objCat As New ADOX.Catalog 'Define the ADOX Catalog Object
    Dim objTbl As ADOX.Table 'Define the ADOX Table Object

    Dim strSearchFolder As String 'Folder to Search in.
    Dim strFilename As String 'Db Name of the Linked Table
    Dim strFullName As String 'Path & DB Name of the Linked Table.
    Dim strSearchFile As String 'The new path of the database.

    Dim blnTablesNotLinked As Boolean 'Determines if links are valid

    'Open the catalog
    objCat.ActiveConnection = CurrentProject.Connection

    'Loop through the table collection and refresh the linked tables.
    For Each objTbl In objCat.Tables

    ' Check to make sure the table is a linked table.
    If objTbl.Type = "LINK" Then
    strFullName = objTbl.Properties("Jet OLEDB:Link Datasource")
    strFilename = Mid(strFullName, InStrRev(strFullName, "\", _
    Len(strFullName)) + 1, Len(strFullName))
    strSearchFolder = CurrentProject.Path
    'The following line of code attempts to refresh the link.
    'If the source cannot be found an error is generated.
    'Please note that this code only checks one table to determine
    'whether or not the links are valid.
    objTbl.Properties("Jet OLEDB:Link Datasource") = strFullName

    If blnTablesNotLinked = False Then
    Exit Function
    Else
    'Set the search path to the path of the current project.
    'The assumption is that the linked tables are located in subfolders.
    strSearchFile = SearchFile(strFilename, strSearchFolder)
    objTbl.Properties("Jet OLEDB:Link Datasource") = strSearchFile
    End If
    End If
    Next

    MsgBox "The links were successfully refreshed!!! "

    ExitHandler:
    Exit Function

    ErrorHandler:
    Select Case Err.Number
    Case -2147467259
    blnTablesNotLinked = True
    Resume Next
    Case Else
    MsgBox Err.Description & " " & Err.Number
    Resume ExitHandler
    End Select
    End Function

    Function SearchFile(ByVal strFilename As String, _
    ByVal strSearchPath As String) As String
    'Search the folder for first occurrence of the source databases.
    Dim strBuffer As String
    Dim lngResult As Long
    SearchFile = ""
    strBuffer = String$(1024, 0)
    lngResult = apiSearchTreeForFile(strSearchPath, strFilename, strBuffer)
    If lngResult <> 0 Then
    If InStr(strBuffer, vbNullChar) > 0 Then
    SearchFile = Left$(strBuffer, InStr(strBuffer, vbNullChar) - 1)
    End If
    End If
    End Function

    Esta función comprueba la primera tabla vinculada en la base de datos para determinar si los vínculos son válidos. Si los vínculos no son válidos, la función busca en la base de datos y actualiza los vínculos.
  10. Cree una nueva macro con las siguientes propiedades y asígnele el nombre AutoExec:
       Action: RunCode
    Function Name: RefreshLinks()

    Action: OpenForm
    Form Name: Customers

    Action: OpenForm
    Form Name: Employees

    Tenga en cuenta que también puede llamar a esta función en el evento Open de un formulario de inicio oculto.
  11. Crear el paquete de la aplicación de tiempo de ejecución. No olvide agregar "Carpeta1" y "Carpeta2" a las ubicaciones de instalación respectivos.

    Para Access 2007 y Access 2003, agregue los archivos de fondo en la sección "Archivos adicionales" y, a continuación, proporcionar los nombres de carpeta respectiva "Carpeta1" y "Carpeta2" en la columna Instalar subcarpeta .

    Para Access 2002 y Access 2000, agregar "$(AppPath) \Folder1\" y "$(AppPath) \Folder2\" a las ubicaciones de instalación respectivos en la página ubicación de instalación.

  12. Implementar la aplicación en tiempo de ejecución.
Cuando se inicia la aplicación, un reloj de arena indica que se actualizan los vínculos. A continuación, se abrirán los formularios clientes y empleados con datos válidos.

Referencias


Para obtener más información acerca de cómo actualizar las tablas vinculadas, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

209862 cómo volver a vincular tablas de back-end con el control del diálogo común en Access 2000