表单保存操作
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 更改时的方式:
- 创建一个具有public 功能的普通模块(还没有尝试过class 模块):
模块名称:EventHandlers
Public Function InsertEvent(ByVal id As Integer)
MsgBox "inserted: " + CStr(id)
End Function
打开 table,修改后应该 运行 VBA 并转到功能区中的 "Table"。
点击"After Insert"
在 "Add New Action"-select 框中,选择 SetLocalVar
(或 select 从操作目录中选择)。
在名称字段中,插入模块的名称(在本例中为我们之前创建的 EventHandlers)
在表达式字段中,写下函数的名称:InsertEvent([id])
(其中 [id] 是您要添加数据的 table 中的实际列宏)
保存并关闭
每当向 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
我们有一个 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 更改时的方式:
- 创建一个具有public 功能的普通模块(还没有尝试过class 模块):
模块名称:EventHandlers
Public Function InsertEvent(ByVal id As Integer)
MsgBox "inserted: " + CStr(id)
End Function
打开 table,修改后应该 运行 VBA 并转到功能区中的 "Table"。
点击"After Insert"
在 "Add New Action"-select 框中,选择
SetLocalVar
(或 select 从操作目录中选择)。在名称字段中,插入模块的名称(在本例中为我们之前创建的 EventHandlers)
在表达式字段中,写下函数的名称:
InsertEvent([id])
(其中 [id] 是您要添加数据的 table 中的实际列宏)保存并关闭
每当向 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