2010-07-23 2 views
8

Ich habe ein Frontend und Backend einer Access-Datenbank. Die Front-End Referenzen verknüpften Tabellen und ich brauche einen relativen Link anstelle eines expliziten man tun das heißt "../database" statt "address/database"Wie kann ein relativer Pfad eine verknüpfte Tabelle in Access 2007 angeben?

verwiesen wird, ist es möglich, dies zu tun, oder muss ich den absoluten Pfad angeben?

+3

Wie lächerlich, dass Access nicht unterstützt relative Pfade aus der Box. Wie soll jemand einen Client eine geteilte Datenbank mit absoluten Pfaden darin versenden ?! –

+0

Die Einschränkung ist wahrscheinlich darauf zurückzuführen, dass Access multi-user ist - da mehrere Benutzer die gleiche Datei verwenden können und eine Dateisperrung erfolgt - ist ein vollständig qualifizierter Pfad erforderlich. Die einfache Lösung ist beim Start Ihres Frontends überprüft, ob das Backend verfügbar ist (und diese Überprüfung kann relativ sein). Wenn die Verknüpfung falsch ist, wird der Code beim Start einfach neu verknüpft. Dies bedeutet, dass Ihre Anwendung problemlos ausgeführt werden kann, wenn sie verschoben wird. –

Antwort

1

Soweit ich weiß, erfordert die Connect-Eigenschaft von TableDef einen absoluten Pfad. Wenn ich in diesem Punkt falsch liege, hoffe ich, dass jemand erzählen wird, wie man eine verknüpfte Tabelle mit einem relativen Pfad erstellt.

Werfen Sie einen Blick auf Armen Stein kostenloses Dienstprogramm Tisch Links zu verwalten: J Street Access Relinker

6

zu Dateien (wie mdb, mdb, dbf, etc.) verknüpft Tabellen erfordern absolute Pfade in ihrer Verbindungszeichenfolgen.

Es gibt jedoch eine Problemumgehung: Während des Datenbankstarts können Sie mithilfe von vba die Verknüpfungen neu definieren, damit sie dem Verzeichnis der aktuellen Datenbankinstanz entsprechen.

(Der Code ist unten nicht getestet/debuggt)

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

Der folgende Code ist in der Form Load-Ereignis des Formulars in "Display Form" Option aufgeführt getestet worden die Datenbank; Das ist das Formular, das beim Öffnen der Datenbank geladen wird.

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

Ich fand diesen Code lief ohne die Dim tblDef als TableDef Linie.Es verursachte einen Fehler "Benutzerdefinierter Typ nicht definiert", der nicht durch Voranstellen von "DAO" behoben werden konnte. zu "TableDef" – avianattackarmada

1

Hier ist eine einfache Routine, die für mich gearbeitet:

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

ich versucht habe, über einige der Antworten Dieser Code könnte auch aus dem Makro AutoExec für die Datenbank aufgerufen werden , insbesondere die Antwort von Martin Thompson, mit der ich einige Fehler bekommen habe, und so wie folgt modifiziert wurde:

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 

Nach fininshing dieses Springen Zugang Ribon> Erstellen> Makro aus der Dropdown-Option "RunCode", dann in den Funktionsnamen Typ "RelinkTables", die wir hier eingegeben haben. Dann speichern Sie das Makro mit dem Namen "AutoExec". Jedes Mal, wenn Sie die Datenbank öffnen, werden alle verknüpften Tabellen erneut mit dem ursprünglichen Pfad verknüpft. Dies ist sehr nützlich, wenn Sie Ihre Datenbanken auf einem tragbaren Datenträger speichern.