在Access中重新连接[事件过程]

时间:2014-02-05 17:36:02

标签: vba access-vba ms-access-2010

由于要求不在客户端之间共享数据,我有一个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

1 个答案:

答案 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