用于计算新记录中字段的事件驱动数据宏 - MS Access
Event Driven Data Macro to Calculate Field in New Record - MS Access
在 MS Access 2013 中,我有一个名为 [Serials] 的 table,它仅包含 3 列:[ID]、[哈希 ID] 和 [产品描述]。
[ID] 是一个增量整数自动编号,也是主键。 [Hashed ID] 保存应用于 [ID] 的哈希函数的结果。最后,[Product Description] 保存用户输入(哈希函数作为 Public 函数存储在 VBA 模块中)。
我想做的是在 [Serials] 上插入一行后自动计算字段 [Hashed ID] table。
我想诀窍在于为此 table 正确使用事件驱动数据宏,但我只是设法在已经存在的行上使用 "Before Change" 事件来完成这项工作已插入(因此,在其 [ID] 字段上保存了值?)。我迷路了!!!
好吧,我设法找到了一个可以接受的解决方案!
首先,在 MS Access 中,当对表使用事件驱动数据宏时,不可能 到 DIRECTLY 引用自动编号字段的值,直到它完全插入并保存在数据库中(其他字段类型不是这种情况)。当作为参数传递时,它总是 return 一个 NULL VALUE.
也就是说,我们仍然可以在自定义 VBA 函数的帮助下为任何自动编号字段引用 当前种子编号(感谢 HansUp for This Post):
Public Function NEXTAUTONUM(ByVal pTable As String, ByVal pColumn as String) As Long
Dim CAT As Object
Set CAT = CreateObject("ADOX.Catalog")
Set CAT.ActiveConnection = CurrentProject.Connection
NEXTAUTONUM = CAT.Tables(pTable).Columns(pColumn).Properties("Seed")
Set CAT = Nothing
End Function
如果插入新行,NEXTAUTONUM 将 return Access 将在 [ID] 字段中设置的自动编号值,这是 HASH FUNCTION 需要作为输入参数的值。现在我们可以在 Before Change 事件中创建我们的数据宏,它应该如下所示:
If [IsInsert] = True Then
Set Field
Name Hashed ID
Value = HASHFUNCTION ( NEXTAUTONUM ( "Serials","ID" ) - 1 )
End If
此外,我们从 NEXTAUTONUM 函数 return 编辑的值中减去 1,因为我们需要当前正在处理的行的 [ID] Autonumber 值,而不是将要创建的行接下来。
希望这对某人有所帮助!
这是在 Access 2016 上测试的。我发现了在读取 BeforeChange 数据宏中的字段时得到 NULL 值的情况。如果该字段是 PRIMARY KEY,就会发生这种情况。它不是自动编号。所以当你有这个组合时问题就出现了:
- BeforeChange 事件
- INSERT 操作(仅限)
- 主键字段
简单的解决方案是将 PRIMARY KEY 更改为 UNIQUE。
在 MS Access 2013 中,我有一个名为 [Serials] 的 table,它仅包含 3 列:[ID]、[哈希 ID] 和 [产品描述]。
[ID] 是一个增量整数自动编号,也是主键。 [Hashed ID] 保存应用于 [ID] 的哈希函数的结果。最后,[Product Description] 保存用户输入(哈希函数作为 Public 函数存储在 VBA 模块中)。
我想做的是在 [Serials] 上插入一行后自动计算字段 [Hashed ID] table。
我想诀窍在于为此 table 正确使用事件驱动数据宏,但我只是设法在已经存在的行上使用 "Before Change" 事件来完成这项工作已插入(因此,在其 [ID] 字段上保存了值?)。我迷路了!!!
好吧,我设法找到了一个可以接受的解决方案!
首先,在 MS Access 中,当对表使用事件驱动数据宏时,不可能 到 DIRECTLY 引用自动编号字段的值,直到它完全插入并保存在数据库中(其他字段类型不是这种情况)。当作为参数传递时,它总是 return 一个 NULL VALUE.
也就是说,我们仍然可以在自定义 VBA 函数的帮助下为任何自动编号字段引用 当前种子编号(感谢 HansUp for This Post):
Public Function NEXTAUTONUM(ByVal pTable As String, ByVal pColumn as String) As Long
Dim CAT As Object
Set CAT = CreateObject("ADOX.Catalog")
Set CAT.ActiveConnection = CurrentProject.Connection
NEXTAUTONUM = CAT.Tables(pTable).Columns(pColumn).Properties("Seed")
Set CAT = Nothing
End Function
如果插入新行,NEXTAUTONUM 将 return Access 将在 [ID] 字段中设置的自动编号值,这是 HASH FUNCTION 需要作为输入参数的值。现在我们可以在 Before Change 事件中创建我们的数据宏,它应该如下所示:
If [IsInsert] = True Then
Set Field
Name Hashed ID
Value = HASHFUNCTION ( NEXTAUTONUM ( "Serials","ID" ) - 1 )
End If
此外,我们从 NEXTAUTONUM 函数 return 编辑的值中减去 1,因为我们需要当前正在处理的行的 [ID] Autonumber 值,而不是将要创建的行接下来。
希望这对某人有所帮助!
这是在 Access 2016 上测试的。我发现了在读取 BeforeChange 数据宏中的字段时得到 NULL 值的情况。如果该字段是 PRIMARY KEY,就会发生这种情况。它不是自动编号。所以当你有这个组合时问题就出现了:
- BeforeChange 事件
- INSERT 操作(仅限)
- 主键字段
简单的解决方案是将 PRIMARY KEY 更改为 UNIQUE。