Microsoft provides programming examples for illustration only, without warranty either expressed or implied. This includes, but is not limited to, the implied warranties of merchantability or fitness for a particular purpose. This article assumes that you are familiar with the programming language that is being demonstrated and with the tools that are used to create and to debug procedures. Microsoft support engineers can help explain the functionality of a particular procedure, but they will not modify these examples to provide added functionality or construct procedures to meet your specific requirements. A program that uses split database design has its
tables in one database in a shared network location (the back-end database),
and all of its queries, forms, reports, macros, and modules in another database
on each client computer (the front-end database). The front-end database links
all of its tables to the back-end database. If the back-end database is moved,
errors occur in your program. You can enable your program to detect that the
back-end database file is missing from its expected location and then prompt
the user for the new location.
The following example shows you how
to relink table data in your program. This method uses a form that a user can
open to relink the back-end tables, and another optional form that can
automatically verify the back-end link when the database is opened.
This article assumes that you have the Microsoft
Common Dialog control, which is available with Microsoft Office 2000 Developer
Edition Tools. If you do not have this control, skip the
Browse() function in the example.
NOTE: If you use the
Common Dialog control and you plan to distribute your database program, you
must use the Package and Deployment Wizard to include the Common Dialog Control
file, Comdlg32.ocx, and its supporting DLLs with your setup files. For more
information about using the Package and Deployment Wizard, see the articles
listed in the "References" section of this article.
Method to Relink Back-End Database Tables
CAUTION: If you follow the steps in this example, you modify the sample
database Northwind.mdb. You may want to back up the Northwind.mdb file and
follow these steps on a copy of the database.
- Create a new blank Access database file and name it
FrontEnd.mdb.
- On the File menu, point to Get External Data, and then click Link Tables.
- Browse to select the sample database Northwind.mdb, and
then click Link. In the Link Tables dialog box, click Select All, and then click OK.
- Create the following new form not based on any table or
query in Design view:
Form: frmNewDataFile Text box:
Name: txtFileName
Width: 3"
Common Dialog control:
Name: xDialog
Command button:
Name: cmdBrowse
Caption: Browse...
On Click: =Browse()
Command button:
Name: cmdLinkNew
Caption: Refresh Links
On Click: =Processtables()
Command button:
Name: cmdCancel
Caption: Cancel
OnClick: [Event Procedure]
Cancel: Yes
- On the View menu, click Code.
- Type or paste the following procedure:
Private Sub cmdCancel_Click()
On Error GoTo Err_cmdCancel_Click
MsgBox "Link to new back-end cancelled", vbExclamation, "Cancel Refresh Link"
DoCmd.Close acForm, Me.Name
Exit_cmdCancel_Click:
Exit Sub
Err_cmdCancel_Click:
MsgBox Err.Description
Resume Exit_cmdCancel_Click
End Sub
- On the Debug menu, click Compile FrontEnd.
- Save the frmNewDataFile form and close it.
- In the Database window, click Modules, and then click New.
- On the Tools menu, click References, select Microsoft DAO 3.6 Object Library if it
is not already selected, and then click OK.
- Type or paste the following code:
Dim UnProcessed As New Collection
Public Function Browse()
' Prompts user for back-end database file name.
On Error GoTo Err_Browse
Dim strFilename As String
Dim oDialog As Object
Set oDialog = [Forms]![frmNewDatafile]!xDialog.Object
With oDialog ' Ask for new file location.
.DialogTitle = "Please Select New Data File"
.Filter = "Access Database(*.mdb;*.mda;*.mde;*.mdw)|" & _
"*.mdb; *.mda; *.mde; *.mdw|All(*.*)|*.*"
.FilterIndex = 1
.ShowOpen
If Len(.FileName) > 0 Then ' user responded, put selection into text box on form.
[Forms]![frmNewDatafile]![txtFileName] = .FileName
End If
End With
Exit_Browse:
Exit Function
Err_Browse:
MsgBox Err.Description
Resume Exit_Browse
End Function
Public Sub AppendTables()
Dim db As DAO.Database, x As Variant
Dim strTest As String
' Add names of all table with invalid links to the Unprocessed Collection.
Set db = CurrentDb
ClearAll
For Each x In db.TableDefs
If Len(x.Connect) > 1 And Len(Dir(Mid(x.Connect, 11))) = 0 Then
' connect string exists, but file does not
UnProcessed.Add Item:=x.Name, Key:=x.Name
End If
Next
End Sub
Public Function ProcessTables()
Dim strTest As String
On Error GoTo Err_BeginLink
' Call procedure to add all tables with broken links into a collection.
AppendTables
' Test for existence of file name\directory selected in Common Dialog Control.
strTest = Dir([Forms]![frmNewDatafile]![txtFileName])
On Error GoTo Err_BeginLink
If Len(strTest) = 0 Then ' File not found.
MsgBox "File not found. Please try again.", vbExclamation, "Link to new data file"
Exit Function
End If
' Begin relinking tables.
Relinktables (strTest)
' Check to see if all tables have been relinked.
CheckifComplete
DoCmd.Echo True, "Done"
If UnProcessed.Count < 1 Then
MsgBox "Linking to new back-end data file was successful."
Else
MsgBox "Not All back-end tables were successfully relinked."
End If
DoCmd.Close acForm, [Forms]![frmNewDatafile].Name
Exit_BeginLink:
DoCmd.Echo True
Exit Function
Err_BeginLink:
Debug.Print Err.Number
If Err.Number = 457 Then
ClearAll
Resume Next
End If
MsgBox Err.Number & ": " & Err.Description
Resume Exit_BeginLink
End Function
Public Sub ClearAll()
Dim x
' Clear any and all names from the Unprocessed Collection.
For Each x In UnProcessed
UnProcessed.Remove (x)
Next
End Sub
Public Function Relinktables(strFilename As String)
Dim dbbackend As DAO.Database, dblocal As DAO.Database, ws As Workspace, x, y
Dim tdlocal As DAO.TableDef
On Error GoTo Err_Relink
Set dbbackend = DBEngine(0).OpenDatabase(strFilename)
Set dblocal = CurrentDb
' If the local linked table name is found in the back-end database
' we're looking at, Recreate & Refresh its connect string, and then
' remove its name from the Unprocessed collection.
For Each x In UnProcessed
If Len(dblocal.TableDefs(x).Connect) > 0 Then
For Each y In dbbackend.TableDefs
If y.Name = x Then
Set tdlocal = dblocal.TableDefs(x)
tdlocal.Connect = ";DATABASE=" & _
Trim([Forms]![frmNewDatafile]![txtFileName])
tdlocal.RefreshLink
UnProcessed.Remove (x)
End If
Next
End If
Next
Exit_Relink:
Exit Function
Err_Relink:
MsgBox Err.Number & ": " & Err.Description
Resume Exit_Relink
End Function
Public Sub CheckifComplete()
Dim strTest As String, y As String, notfound As String, x
On Error GoTo Err_BeginLink
' If there are any names left in the unprocessed collection,
' then continue.
If UnProcessed.Count > 0 Then
For Each x In UnProcessed
notfound = notfound & x & Chr(13)
Next
' List the tables that have not yet been relinked.
y = MsgBox("The following tables were not found in " & _
Chr(13) & Chr(13) & [Forms]![frmNewDatafile]!txtFileName _
& ":" & Chr(13) & Chr(13) & notfound & Chr(13) & _
"Select another database that contains the additional tables?", _
vbQuestion + vbYesNo, "Tables not found")
If y = vbNo Then
Exit Sub
End If
' Bring the Common Dialog Control back up.
Browse
strTest = Dir([Forms]![frmNewDatafile]![txtFileName])
If Len(strTest) = 0 Then ' File not found.
MsgBox "File not found. Please try again.", vbExclamation, _
"Link to new data file"
Exit Sub
End If
Debug.Print "Break"
Relinktables (strTest)
Else
Exit Sub
End If
CheckifComplete
Exit_BeginLink:
DoCmd.Echo True ' Just in case of error jump.
DoCmd.Hourglass False
Exit Sub
Err_BeginLink:
Debug.Print Err.Number
If Err.Number = 457 Then
ClearAll
Resume Next
End If
MsgBox Err.Number & ": " & Err.Description
Resume Exit_BeginLink
End Sub
- On the Debug menu, click Compile FrontEnd.
- Save the module as RelinkCode, and
then close it.
- Rename the Northwind.mdb sample database or move it to
another folder on your hard disk so that the linked tables in FrontEnd.mdb will
need to be refreshed.
- Open the frmNewDataFile form, and then click the Browse button.
- In the Please Select New Data File dialog
box, locate Northwind.mdb in its new folder, and then click Open.
Note that the path and file name of the database
appears in the text box on your form. - Click the Refresh Links button on the form.
Note that you receive the
following message when the procedure is finished:
Linking to new back-end data file was successful.
Creating a Startup Form to Check Linked Tables
To verify the links to back-end tables automatically each time
that you open the FrontEnd.mdb database, you can create a hidden form for that
purpose by following these steps:
- Create a new form not based on any table or query in Design
view.
- On the View menu, click Code.
- Type the following procedure to run when the form opens:
Private Sub Form_Open(Cancel As Integer)
' Tests a linked table for valid back-end.
On Error GoTo Err_Form_Open
Dim strTest As String, db As DAO.Database
Dim td As DAO.TableDef
Set db = CurrentDb
For Each td In db.TableDefs
If Len(td.Connect) > 0 Then ' Is a linked table.
On Error Resume Next ' Turn off error trap.
strTest = Dir(Mid(td.Connect, 11)) ' Check file name.
On Error GoTo Err_Form_Open ' Turn on error trap.
If Len(strTest) = 0 Then ' No matching file.
If MsgBox("Couldn't find the back-end file " & _
Mid(td.Connect, 11) & ". Please choose new data file.", _
vbExclamation + vbOKCancel + vbDefaultButton1, _
"Can't find backend data file.") = vbOK Then
DoCmd.OpenForm "frmNewDataFile" ' Open prompt form.
DoCmd.Close acForm, Me.Name
Exit Sub ' to refresh links
Else
MsgBox "The linked tables can't find their source. " & _
"Please log onto network and restart the application."
End If
End If
End If
Next ' Loop to next tabledef.
DoCmd.Close acForm, Me.Name
Exit_Form_Open:
Exit Sub
Err_Form_Open:
MsgBox Err.Number & ": " & Error.Description
Resume Exit_Form_Open
End Sub
- On the Debug menu, click Compile FrontEnd.
- Save the form as frmCheckLink, and then close it.
- To set frmCheckLink as the startup form, on the Tools menu click Startup, select frmCheckLink in the Display Form/Page list, and then click OK.
- To make frmCheckLink a hidden form, right-click frmCheckLink in the Database window, click Properties on the shortcut menu, click to select the Hidden check box in the frmCheckLink Properties dialog box, and then click OK.
- Move the Northwind.mdb sample database to another folder on
your hard disk so that the linked tables in FrontEnd.mdb will need to be
refreshed.
- Close and then reopen FrontEnd.mdb.
Notice that
you receive the following error message Can't find the
back-end file database file. Please choose new data
file.
where database file is the path and
file name of your back-end database.
If you click OK, the frmNewDataFile form opens for you to select a new back-end
database, and then refreshes your table links. If you click Cancel, you receive the following error message:
The linked tables can't find their source. Please log onto network and restart
the program.