2010-07-23 11 views
8

Mam przedni i tylny koniec bazy danych programu Access. Odniesienia końcowych przednie połączone tabele i muszę zrobić względny odnośnik zamiast wyraźnego jednym tj "../database" odwołuje zamiast "address/database"W jaki sposób ścieżka względna może określać połączoną tabelę w programie Access 2007?

Czy to możliwe, aby to zrobić, czy muszę podać bezwzględną ścieżkę?

+3

Niedorzeczne, że program Access nie obsługuje względnych ścieżek po wyjęciu z pudełka. Jak ktoś ma wysłać klientowi podzieloną bazę danych z absolutnymi ścieżkami ?! –

+0

Ograniczenie prawdopodobnie wynika z tego, że Access jest użytkownikiem wielorazowym - ponieważ wielu użytkowników może korzystać z tego samego pliku i istnieje blokowanie pliku - wymagana jest pełna kwalifikowana ścieżka. Proste rozwiązanie polega na tym, że twój front sprawdza, czy back-end jest dostępny (i ta kontrola może być względna). Jeśli link jest nieprawidłowy, twój kod po prostu ponownie łączy się przy starcie. W efekcie oznacza to, że aplikacja będzie działać poprawnie, jeśli zostanie przeniesiona. –

Odpowiedz

1

O ile mi wiadomo, właściwość Connect w TableDef wymaga bezwzględnej ścieżki. Jeśli się mylę w tym punkcie, mam nadzieję, że ktoś powie, jak utworzyć połączoną tabelę przy użyciu względnej ścieżki.

Spójrz na wolnym użyteczności Armen Steina zarządzać linki tabeli: J Street Access Relinker

6

tabele związane z plików (takich jak MDB, DBF, ACCDB, etc.) wymaga bezwzględnej ścieżki w ich ciągi połączeń.

Istnieje jednak sposób obejścia problemu: podczas uruchamiania bazy danych można użyć vba, aby przedefiniować łącza, aby dopasować katalog do bieżącej instancji bazy danych.

(Poniższy kod nie został przetestowany/debugowany)

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

Poniższy kod został przetestowany w przypadku Form_Load postaci wymienionych w opcji „Display Form” dla baza danych; to jest forma, która ładuje się przy każdym otwarciu bazy danych. Kod ten może być również wywołana z makra Autoexec dla bazy danych:

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

Znalazłem ten kod działa dobrze bez linii Dim tblDef As TableDef .Powodowało to błąd "Definiowany typ użytkownika", którego nie można było naprawić, dodając przedrostek "DAO". do "TableDef" – avianattackarmada

1

Oto prosta rutyna, który pracował dla mnie:

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

Próbowałem niektóre z odpowiedzi powyżej , w szczególności odpowiedź z Martin Thompson, z którą mam pewne błędy, i dlatego zmodyfikowałem ją w następujący sposób:

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 

Po fininshing to, Goto Dostęp Ribon> Utwórz> Makro Z rozwijanego menu wybierz "RunCode", wówczas w rodzaju nazwy funkcja "reLinkTables", które mamy wpisane tutaj. Następnie zapisz makro o nazwie "AutoExec". Za każdym razem, gdy otworzysz bazę danych, wszystkie połączone tabele zostaną ponownie połączone z oryginalną ścieżką. Jest to bardzo przydatne, jeśli umieścisz swoje bazy danych na przenośnym nośniku.

Powiązane problemy