我们有一个Access 2010数据库,它充当MS SQL数据库的前端。当我们编辑表单中的数据时,需要运行一个过程,以便将某些数据正确地保存回SQL。
我们的DB程序员添加了一个“保存按钮”来执行此操作。但这会导致另一个问题 - 在Access中有多种方法可以保存表单 -
有没有办法将程序附加到实际的保存操作,这样无论一个人如何移动到下一个表单,程序就会运行?
[更新]
这是幕后的代码:第一个子附加到“保存”按钮。当然,第二个附加到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
我想我只是不明白按钮的用途。
答案 0 :(得分:3)
所以我安装了MS Access 2010试用版,最终找到了解决问题的方法。它包括数据宏和hidden gem,它花了我很长时间才找到。
以下是表格更改时运行VBA的方式:
模块名称: EventHandlers
Public Function InsertEvent(ByVal id As Integer)
MsgBox "inserted: " + CStr(id)
End Function
打开表格,修改后应运行VBA并转到"表格"在功能区中。
点击"插入"
在"添加新操作" - 选择框中,选择SetLocalVar
(或从操作目录中选择)。
在名称字段中,插入模块的名称(在本例中为EventHandlers,如前所述)
在表达式字段中,写下函数的名称:InsertEvent([id])
(其中[id]是您要为其添加数据宏的表中的实际列)
保存并关闭
每当向表中插入某些内容时,都会显示一个带有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将执行数据宏,然后询问用户他或她是否实际更新/插入/删除该行。如果用户单击取消,则不会更改任何内容,但仍会执行数据宏。如果您还没有,则应该在实现数据宏之前禁用此检查。
答案 1 :(得分:0)
好吧,我无法使用Sommer先生的解决方案,因为由于它们是只读的,因此无法将事件处理程序添加到链接表中。但是,我确实制定了一个似乎运作良好的简单程序。
所以,我实际上已经在使用BeforeUpdate
事件了,所以我在这里捕捉正确的事件 - 这是捕获保存的事件,无论是更改导航还是保存 - 左边的记录栏。但是,在Application.Echo False
发生时,使用Me.Undo
阻止Access将旧数据发回控件后,会出现一些问题。
因此我们使用cancel=true
来阻止BeforeUpdate
事件进行正常处理,我们使用Me.Undo
来阻止Access尝试将数据保存到链接表。
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