区分MS Access Form.AfterUpdate中的更新和插入

问题描述 投票:0回答:2

我在MS Access中有一个绑定的表单。我希望能够说出来:

  1. 插入新记录时
  2. 更新现有记录时

我认为事件Form.AfterUpdateForm.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
vba ms-access access-vba
2个回答
0
投票

如果您真的只需要知道这是新的还是现有的记录承诺,请使用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

0
投票

我想如果这对你很重要,那么你不应该使用AfterUpdateAfterInsert,而实际上是BeforeUpdate事件。您没有说明为什么您需要知道记录是插入还是更新,以及在任何一种情况下您打算做什么。即使这样,我也很难设想一个好的场景,你需要知道在After***事件中。

BeforeUpdate,您仍然可以检查NewRecord属性并根据此采取一些行动。更重要的是,您可以通过在Cancel事件中将BeforeUpdate参数设置为true来取消插入/更新的尝试。

另外,要提供一个不同的选项 - 如果您希望执行的操作是以数据为中心的,并且无论数据如何通过此特定表单输入,都应该是真的,您应该考虑使用数据宏,这样做可以区分插入和更新之间。请注意,如果数据宏操作不足以满足您的需要,您仍可以从数据宏中调用VBA代码。

AfterUpdateAfterInsert事件在事后做事很好,并且通常不关心记录是如何形成的。示例包括刷新相关表单,更改焦点,启用/禁用控件,这类内容等内容。请注意,我引用的示例都与UI相关。这就是它的用途,应该像这样使用。

© www.soinside.com 2019 - 2024. All rights reserved.