Как относительный путь может указать связанную таблицу в Access 2007? - PullRequest
13 голосов
/ 23 июля 2010

У меня есть внешний и внутренний конец базы данных Access.Внешний интерфейс ссылается на связанные таблицы, и мне нужно сделать относительную ссылку вместо явной, т. Е. Вместо "address/database"

указывается ссылка "../database" Возможно ли это сделать, или я должен указать абсолютный путь

Ответы [ 5 ]

8 голосов
/ 07 июня 2012

Для таблиц, связанных с файлами (например, mdb, accdb, dbf и т. Д.), Требуются абсолютные пути в строках соединения.

Однако существует обходной путь: во время запуска базы данных вы можете использовать vba, чтобы переопределить ссылки в соответствии с каталогом текущего экземпляра базы данных.

(код ниже не был проверен / отлажен)

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
6 голосов
/ 22 января 2017

Я попробовал некоторые из ответов выше, особенно ответ Мартина Томпсона , с которым у меня возникли некоторые ошибки, и таким образом изменил его следующим образом:

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

После завершения этого, Перейти к Access Ribon> Создать> Макрос В раскрывающемся списке выберите « RunCode », затем в имени функции введите « reLinkTables », который мы ввели здесь.Затем сохраните макрос с именем « AutoExec ».Каждый раз, когда вы открываете базу данных, все связанные таблицы будут связаны с исходным путем.Это очень полезно, если вы размещаете свои базы данных на переносном носителе.

2 голосов
/ 23 июля 2010

Насколько я знаю, для вашего свойства Connect в TableDef требуется абсолютный путь.Если я ошибаюсь в этом вопросе, я надеюсь, что кто-нибудь расскажет, как создать связанную таблицу, используя относительный путь.

Посмотрите на бесплатную утилиту Армена Стейна для управления ссылками на таблицу: J StreetAccess Relinker

1 голос
/ 22 декабря 2015

Вот простая процедура, которая сработала для меня:

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
1 голос
/ 30 марта 2015

Следующий код был протестирован в событии Form_Load формы, указанной в опции «Показать форму» для базы данных;это форма, которая загружается при каждом открытии базы данных.Этот код также может быть вызван из макроса AutoExec для базы данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...