表单保存操作

Action on Form Save

我们有一个 Access 2010 数据库作为 MS SQL 数据库的前端。当我们在表单中编辑数据时,有一个过程需要 运行 才能将某些数据正确保存回 SQL.

我们的数据库程序员添加了 "Save Button" 来执行此操作。但这会导致另一个问题 - Access 中有多种保存表单的方法 -

有什么方法可以将程序附加到实际保存 操作 以便无论一个人如何移动到下一个表格,程序都会得到 运行?

[更新]

这是幕后代码:第一个子程序附加到 "Save" 按钮。当然,第二个附在表格BeforeUpdate.

Private Sub SaveRecord_Click()
'From NAME form
Form_BeforeUpdate False
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
'used by NAME form
    [Last_Update] = Now
    '*********************
    Save_Record
    '*********************
    MName_ID = Me.Name_ID
    Me.Undo
    Cancel = True
    If Not IsNull(MName_ID) Then
        Jump_to_Name_ID MName_ID, True
    Else
    End If
End Sub

我想我只是不明白这个按钮是干什么用的。

所以我安装了 MS Access 2010 试用版,终于找到了解决您问题的方法。它包括数据宏和 hidden gem,我花了很长时间才找到它。

这是 运行 VBA 当 table 更改时的方式:

  1. 创建一个具有public 功能的普通模块(还没有尝试过class 模块):

模块名称:EventHandlers

Public Function InsertEvent(ByVal id As Integer)
    MsgBox "inserted: " + CStr(id)
End Function
  1. 打开 table,修改后应该 运行 VBA 并转到功能区中的 "Table"。

  2. 点击"After Insert"

  3. 在 "Add New Action"-select 框中,选择 SetLocalVar(或 select 从操作目录中选择)。

  4. 在名称字段中,插入模块的名称(在本例中为我们之前创建的 EventHandlers)

  5. 在表达式字段中,写下函数的名称:InsertEvent([id])(其中 [id] 是您要添加数据的 table 中的实际列宏)

  6. 保存并关闭

每当向 table 中插入内容时,都会显示一个带有 ID 的消息框。

您可以对更新事件执行相同的操作。该函数可能是这样的:

Public Function UpdateEvent(ByVal oldValue As String, ByVal newValue As String)
    MsgBox oldValue + " changed to: " + newValue
End Function

数据宏为

操作:SetLocalVar

姓名:EventHandlers

表达式:UpdateEvent([Old].[your_column_name];[your_column_name])

注意:执行 DoCmd.RunSQL 更新、插入或删除将执行数据宏,然后询问用户他或她是否真的想要 update/insert/delete该行。如果用户点击取消,什么都没有改变,但你的数据宏仍然被执行。如果您还没有这样做,您可能应该在实施数据宏之前禁用此检查。

嗯,我无法使用 Sommer 先生的解决方案,因为无法将事件处理程序添加到链接 table,因为它们是只读的。但是,我确实制定了一个似乎运行良好的简单程序。

所以,我实际上已经在使用 BeforeUpdate 事件,所以我在这里捕捉到正确的事件 - 这是捕获保存的事件,无论是导航更改还是保存 -左侧的记录栏。但是,在 Me.Undo 发生时,使用 Application.Echo False 阻止 Access 将旧数据回发到控件会导致一些问题。

所以我们使用 cancel=true 来阻止 BeforeUpdate 事件进行正常处理,我们使用 Me.Undo 来阻止 Access 尝试将数据保存到链接 tables.

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = True

    [Last_Update] = Now
    '*********************
    Save_Record '-->This will save the data back to SQL
    '*********************
    MName_ID = Me.Name_ID
    Application.Echo False  'don't show the undo in the controls
    Me.Undo

    If Not IsNull(MName_ID) Then    'used for the navigation buttons
        Jump_to_Name_ID MName_ID, True
    Else
    End If

    Application.Echo True   'turn the control refresh back on
    Me.Repaint
End Sub