由于要求不在客户端之间共享数据,我有一个MS Access 2010数据库,我用它从我们的SQL Server中提取数据到一个小的.accdb然后我们发送到客户端,他们修改,然后我加载数据返回服务器。
在我的“Master”Access数据库中( EDIT2:我使用Access作为SQL Server的前端),我有一个按钮,可以创建一个特定于客户端的.accdb( EDIT2: 这有一个本地表,其中包含客户端的特定数据,供他们进行模糊处理)。此代码只是复制模板.accdb与表单,代码等&为客户端恰当地命名。
不幸的是,在创建此副本时,属性框中的所有事件过程连接都将丢失。但是代码仍然存在于模块中。这是一个相当着名的问题,在Google上有详细记录。一般的解决方案是通过每个表格和重置每个表单的属性&需要事件的控件,然后Access将重新连接现有代码。没关系,一次。我会有数十次或数百次这样的复制/丢失问题。
我在2004年3月的 ~2003 中找到了一个引用来动态识别属性中缺少的代码( EDIT2: [Event Procedure]引用盒子)&将属性设置为[事件过程]以解决此问题。但是,在尝试识别对象是否应该具有事件处理程序时,代码依赖于此语句
DLookup("EventProcedureSuffix", "EventProcedures", "EventName = '" & prpCurr.Name & "'")
并生成错误3078,说它无法找到名为'EventProcedures'的表或查询( EDIT2:,这似乎是代码所基于的旧版Access中的系统表上)。有谁知道Access 2010中的'EventProcedures'表发生了什么?它是否已重命名,是否已无法访问,是否有替代品?
这也引出了如何首先触发此代码的问题。我在打开数据库时打开的主窗体的OnOpen事件上有它,但如果事件处理程序断开连接,则不会触发...
编辑:找到我正在使用的代码来源的链接:http://www.accessmvp.com/djsteele/Access/AA200403.zip
答案 0 :(得分:2)
您可能会尝试找到一种以保留事件过程链接的方式创建新用户数据库的方法,而不是尝试重新附加事件过程。
以下Access 2010代码似乎对我有用。它创建一个Access 2003格式的.mdb文件,然后导出一个表和一个表单。表单后面有一个带代码的按钮,当我在.mdb文件中打开表单时,按钮工作正常。
Option Compare Database
Option Explicit
Public Function CreateUserDatabase()
Dim fd As Object ' Office.FileDialog
Dim db As DAO.Database
Dim newDbPath As String
Set fd = Application.FileDialog(2) ' msoFileDialogSaveAs
fd.Title = "Save User Database As..."
fd.InitialFileName = "UserDB.mdb"
fd.Show
If fd.SelectedItems.Count <> 0 Then
newDbPath = fd.SelectedItems(1)
If UCase(Right(newDbPath, 4)) <> ".MDB" Then
newDbPath = newDbPath & ".mdb"
End If
On Error Resume Next
Kill newDbPath
On Error GoTo 0
Set db = DBEngine(0).CreateDatabase(newDbPath, dbLangGeneral, dbVersion40)
db.Close
Set db = Nothing
DoCmd.TransferDatabase acExport, "Microsoft Access", newDbPath, acTable, "UserData", "UserData", False
DoCmd.TransferDatabase acExport, "Microsoft Access", newDbPath, acForm, "UserForm", "UserForm", False
MsgBox "The user database has been created.", vbInformation
End If
Set fd = Nothing
End Function