【发布时间】:2020-07-17 04:47:08
【问题描述】:
我在我的 MS Access VBA 代码中使用事务。我更新了我的一个字段,即 Inventory 表中的 Incoming_Pieces 字段。然后,在提交事务之前,我在更新的字段上使用DLookup。 DLookup 函数将返回事务前的值,而不是提交前事务期间更新的值。
这是故意的吗?没有错误消息或任何警告表明我正在检索的数据与事务中正在更新的数据不同步。
是生成SELECT 语句而不是DLookup 的唯一解决方法吗?
这是我的测试代码来证明这一点。
Public Function testTransaction()
Dim pieces As Variant
pieces = DLookup("Incoming_Pieces", "Inventory", "Code='MT-1-1000x1x1'")
Debug.Print (pieces) ' <------------ prints 0
DAO.DBEngine.BeginTrans
Dim sql As String
sql = "UPDATE Inventory SET Incoming_Pieces = 10 WHERE Code='MT-1-1000x1x1'"
CurrentDb.Execute (sql)
pieces = DLookup("Incoming_Pieces", "Inventory", "Code='MT-1-1000x1x1'")
Debug.Print (pieces) ' <------------ prints 0
DAO.DBEngine.CommitTrans
pieces = DLookup("Incoming_Pieces", "Inventory", "Code='MT-1-1000x1x1'")
Debug.Print (pieces) ' <------------ prints 10
End Function
【问题讨论】:
-
显然这是设计使然。您是否验证 SELECT 返回更新的值?为什么你甚至需要 UPDATE 动作?你为什么不只是做交易记录的数据输入?
-
是的
SELECT确实返回了更新后的值。这只是示例代码。在我真正的解决方案中。我有几个需要在事务中运行的 SQL 语句。事务中的第 5 个查询取决于第一个查询更新的值。 VBA 中的逻辑要多得多,因此无法通过一个查询全部完成。
标签: vba ms-access transactions dlookup