2010-07-23 71 views
8

Tengo un front-end y un back-end de una base de datos de Access. Las referencias de extremo frontal vinculados tablas y yo tenemos que hacer un vínculo relativo en lugar de una explícita decir "../database" se referencia en lugar de "address/database"¿Cómo puede una ruta relativa especificar una tabla vinculada en Access 2007?

¿Es posible hacer esto, o tengo que especificar la ruta absoluta?

+3

Qué ridículo que Access no admita las rutas relativas de la caja. ¿Cómo se supone que alguien debe enviar a un cliente una base de datos dividida con rutas absolutas? –

+0

Es probable que la limitación se deba a que Access es multiusuario, ya que varios usuarios pueden usar el mismo archivo y hay un bloqueo de archivos; luego se requiere una ruta completa. La solución simple es al inicio, su front-end comprueba si el back-end está disponible (y ese control puede ser relativo). Si el enlace es incorrecto, entonces su código simplemente se vuelve a vincular al inicio. En efecto, esto significa que su aplicación se ejecutará bien si se mueve. –

Respuesta

1

Por lo que yo sé, la propiedad Conectar de TableDef requiere una ruta absoluta. Si me equivoco en ese punto, espero que alguien diga cómo crear una tabla vinculada utilizando una ruta relativa.

Tome un vistazo a utilidad gratuita de Armen Stein para gestionar sus enlaces de mesa: J Street Access Relinker

6

tablas vinculadas a archivos (como MDB, accdb, DBF, etc.) requieren rutas absolutas en sus cadenas de conexión.

Sin embargo, hay una solución: durante el inicio de la base de datos puede usar vba para redefinir los enlaces para que coincidan con el directorio de la instancia de la base de datos actual.

(El código de abajo no se ha probado/depurado)

Private Sub RelinkTables() 
Dim oldConnection As String 
Dim newConnection As String 

Dim currentPath As String 
currentPath = CurrentProject.Path 

Dim tblDef As TableDef 

For Each tblDef In CurrentDb.TableDefs 
    oldConnection = tblDef.Connect 

    ' Depending on the type of linked table 
    ' some string manipulation which defines 
    ' newConnection = someFunction(oldConnection,currentPath) 

    tblDef.Connect = newConnection 
    tblDef.RefreshLink 
Next tblDef 

End Sub

1

El siguiente código ha sido probado en el evento Form_Load del formulario que aparece en la opción "forma de la pantalla" para la base de datos; esa es la forma que se carga cada vez que se abre la base de datos. Este código también podría ser llamado desde la macro AutoExec para la base de datos:

Private Sub Form_Load() 
Dim strOldConnect As String 
Dim strNewConnect As String 
Dim intSlashLoc As Integer 
Dim intEqualLoc As Integer 

Dim strConnect As String 
Dim strFile As String 
Dim strCurrentPath As String 

strCurrentPath = CurrentProject.path 

Dim tblDef As TableDef 
Dim tblPrp As Property 

For Each tblDef In CurrentDb.TableDefs 
    Debug.Print tblDef.Name 
    If tblDef.Connect & "." <> "." Then 

     strOldConnect = tblDef.Connect 
     intEqualLoc = InStr(1, strOldConnect, "=", vbTextCompare) 
     strConnect = Left(strOldConnect, intEqualLoc) 
     intSlashLoc = InStrRev(strOldConnect, "\", -1, vbTextCompare) 
     strFile = Right(strOldConnect, Len(strOldConnect) - intSlashLoc) 
     strNewConnect = strConnect & strCurrentPath & "\" & strFile 

     tblDef.Connect = strNewConnect 
     tblDef.RefreshLink 
    End If 

Next tblDef 
End Sub 
+0

Encontré que este código funcionaba bien sin la línea Dim tblDef As TableDef .Causaba un error de "Tipo definido por el usuario no definido", que no se pudo arreglar al ponerle un prefijo "DAO". a "TableDef" – avianattackarmada

1

Aquí es una rutina simple que funcionó para mí:

Public Function gbLinkTables() As Boolean 
On Error GoTo ErrorRoutine 
Dim sMyConnectString  As String 
Dim tdf      As TableDef 

    'We will link all linked tables to an accdb Access file located in the same folder as this file. 
    'Replace the DATA file name in the following statement with the name of your DATA file: 
    sMyConnectString = ";database=" & CurrentProject.Path & "\Loan-Tracking-Data.accdb" 
    For Each tdf In CurrentDb.TableDefs 
     If Len(tdf.Connect) > 0 Then 
      'It's a linked table, so re-link: 
      tdf.Connect = sMyConnectString 
      tdf.RefreshLink 
     End If 
    Next tdf 


ExitRoutine: 
    Exit Function 
ErrorRoutine: 
    MsgBox "Error in gbLinkTables: " & Err.Number & ": " & Err.Description 
    Resume ExitRoutine 
End Function 
2

He probado algunas de las respuestas anteriores , especialmente la respuesta de Martin Thompson con la que obtuve algunos errores, y así la modifiqué de la siguiente manera:

Public Function reLinkTables() As Boolean 
On Error GoTo ErrorRoutine 
Dim sMyConnectString  As String 
Dim tdf      As TableDef 
Dim db_name     As String 
    ' The Main Answer is by Martin Thompson 
    ' Modified by Dr. Mohammad Elnesr 
    'We will link all linked tables to an accdb Access file located in the same folder as this file. 
    'Replace the DATA file name in the following statement with the name of your DATA file: 
    sMyConnectString = ";DATABASE=" & CurrentProject.Path & "\" 
    For Each tdf In CurrentDb.TableDefs 
     If Len(tdf.Connect) > 0 Then 
      'It's a linked table, so re-link: 
      'First, get the database name 
      db_name = GetFileName(tdf.Connect) 
      ' Then link the table to the current path 
      tdf.Connect = sMyConnectString & db_name 
      tdf.RefreshLink 
     End If 
    Next tdf 


ExitRoutine: 
    MsgBox "All tables were relinked successfully" 
    Exit Function 
ErrorRoutine: 
    MsgBox "Error in gbLinkTables: " & Err.Number & ": " & Err.Description 
    Resume ExitRoutine 
End Function 

Function GetFileName(FullPath As String) As String 
    Dim splitList As Variant 
    splitList = VBA.Split(FullPath, "\") 
    GetFileName = splitList(UBound(splitList, 1)) 
End Function 

Después fininshing esto, Goto acceso Ribon> Crear> Macro En el menú desplegable, seleccione "EjecutarCódigo", a continuación, en el tipo de nombre de la función "RelinkTables" que hemos escrito aquí. A continuación, guarde la macro con el nombre "AutoExec". Cada vez que abra la base de datos, todas las tablas vinculadas se volverán a vincular a la ruta original. Esto es muy útil si coloca sus bases de datos en un medio portátil.

Cuestiones relacionadas