2010-07-23 4 views
8

Tôi có giao diện người dùng và mặt sau của cơ sở dữ liệu Access. Giao diện người dùng tham chiếu đến các bảng được liên kết và tôi cần phải thực hiện liên kết tương đối thay vì liên kết rõ ràng, tức là "../database" được tham chiếu thay vì "address/database"Làm thế nào một đường dẫn tương đối có thể chỉ định một bảng được nối kết trong Access 2007?

Có thể thực hiện việc này hay không.

+3

Thật lố bịch khi Access không hỗ trợ đường dẫn tương đối ra khỏi hộp. Làm thế nào là một người nào đó phải gửi một khách hàng một cơ sở dữ liệu tách với đường dẫn tuyệt đối trong nó ?! –

+0

Giới hạn có thể do Access là đa người dùng - bởi vì nhiều người dùng có thể sử dụng cùng một tệp và có khóa tệp - sau đó là đường dẫn đủ điều kiện là bắt buộc. Giải pháp đơn giản là khởi động kiểm tra giao diện người dùng của bạn nếu đầu cuối có sẵn (và kiểm tra đó có thể là tương đối). Nếu liên kết sai, thì mã của bạn chỉ cần liên kết lại khi khởi động. Điều này có nghĩa là ứng dụng của bạn sẽ chạy tốt nếu nó được di chuyển. –

Trả lời

1

Theo như tôi biết, thuộc tính Kết nối Bảng của bạn yêu cầu đường dẫn tuyệt đối. Nếu tôi sai vào thời điểm đó, tôi hy vọng một người nào đó sẽ nói làm thế nào để tạo ra một bảng được liên kết bằng cách sử dụng một đường dẫn tương đối.

Hãy nhìn vào tiện ích miễn phí Armen Stein để quản lý liên kết bảng của bạn: J Street Access Relinker

6

Bàn liên kết đến tập tin (ví dụ như mdb, accdb, dbf, vv) yêu cầu đường dẫn tuyệt đối trong chuỗi kết nối của họ.

Tuy nhiên có một giải pháp thay thế: trong khi khởi động cơ sở dữ liệu, bạn có thể sử dụng vba để xác định lại các liên kết để khớp với thư mục của cá thể cơ sở dữ liệu hiện tại.

(Đoạn code dưới đây chưa được thử nghiệm/sửa lỗi)

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

Các mã sau đây đã được thử nghiệm trong sự kiện Form_Load của mẫu được liệt kê trong các tùy chọn "Display Form" cho kho dữ liệu; đó là biểu mẫu tải bất cứ khi nào cơ sở dữ liệu được mở. Mã này cũng có thể được gọi từ vĩ mô AutoExec cho cơ sở dữ liệu:

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

Tôi thấy mã này chạy tốt mà không có đường dây Dim tblDef Như BảngDef .Nó đã gây ra lỗi "Loại do người dùng xác định không xác định", lỗi này không thể sửa được bằng cách đặt trước "DAO". tới "TableDef" – avianattackarmada

1

Dưới đây là một thói quen đơn giản mà làm việc cho tôi:

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

Tôi đã thử một số các câu trả lời trên , đặc biệt là câu trả lời của Martin Thompson mà tôi có một số lỗi với, và do đó sửa đổi nó như sau:

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 

Sau fininshing này, Chuyển Tiếp cận Ribon> Create> Macro Từ menu thả xuống chọn "RunCode", sau đó trong các loại tên hàm "reLinkTables" mà chúng tôi đã gõ ở đây. Sau đó lưu macro với tên "AutoExec". Mỗi khi bạn mở cơ sở dữ liệu, tất cả các bảng được nối kết sẽ được liên kết lại với đường dẫn ban đầu. Điều này rất hữu ích nếu bạn đặt cơ sở dữ liệu của bạn trong một phương tiện di động.