我在MS Access中有一个绑定的表单。我希望能够说出来:
我认为事件Form.AfterUpdate
和Form.AfterInsert
将是完美的,但我只是测试Form.AfterUpdate
,发现它更新和插入后触发。
有没有办法在Form_AfterUpdate()
中区分更新和插入之间的区别?或者是否有另一种方法来检测Access中我应该考虑的这些事件?
Private Sub Form_AfterInsert()
Debug.Print "after insert"
End Sub
Private Sub Form_AfterUpdate()
Debug.Print "after update"
End Sub
当我插入新记录时,会打印出来:
after update
after insert
当我更新现有记录时,会打印出来:
after update
如果您真的只需要知道这是新的还是现有的记录承诺,请使用BeforeUpdate
事件来设置模块级变量,然后可以在AfterUpdate
事件中读取该变量。
Option Compare Database
Option Explicit
Dim booNew As Boolean
Private Sub Form_BeforeUpdate(Cancel As Integer)
booNew = Me.NewRecord
End Sub
Private Sub Form_AfterUpdate()
Debug.Print IIf(booNew, "New", "Existing")
End Sub
我想如果这对你很重要,那么你不应该使用AfterUpdate
或AfterInsert
,而实际上是BeforeUpdate
事件。您没有说明为什么您需要知道记录是插入还是更新,以及在任何一种情况下您打算做什么。即使这样,我也很难设想一个好的场景,你需要知道在After***
事件中。
在BeforeUpdate
,您仍然可以检查NewRecord
属性并根据此采取一些行动。更重要的是,您可以通过在Cancel
事件中将BeforeUpdate
参数设置为true来取消插入/更新的尝试。
另外,要提供一个不同的选项 - 如果您希望执行的操作是以数据为中心的,并且无论数据如何通过此特定表单输入,都应该是真的,您应该考虑使用数据宏,这样做可以区分插入和更新之间。请注意,如果数据宏操作不足以满足您的需要,您仍可以从数据宏中调用VBA代码。
AfterUpdate
和AfterInsert
事件在事后做事很好,并且通常不关心记录是如何形成的。示例包括刷新相关表单,更改焦点,启用/禁用控件,这类内容等内容。请注意,我引用的示例都与UI相关。这就是它的用途,应该像这样使用。