1

在 MS Access 2013 中,我有一个名为[Serials]的表,它仅包含 3 列:[ID][Hashed ID][Product Description]

[ID] 是增量整数自动编号和主键。[Hashed ID] 保存应用于 [ID] 的哈希函数的结果。最后,[产品描述] 保存用户输入(哈希函数作为公共函数存储在 VBA 模块中)。

我想做的是在 [Serials] 表中插入一行后自动计算字段 [Hashed ID]。

我想诀窍在于正确使用该表的事件驱动数据宏,但我只设法在已插入的行上使用“更改前”事件来完成这项工作(因此,在他们的 [ID] 字段?)。我迷路了!!!

4

2 回答 2

1

这是在 Access 2016 上测试的。我发现了在读取 BeforeChange 数据宏中的字段时获得 NULL 值的情况。如果该字段是 PRIMARY KEY,就会发生这种情况。它不是自动编号。所以当你有这个组合时,问题就出现了:

  1. 变更前事件
  2. INSERT 操作(仅限)
  3. 主键字段

简单的解决方案是将 PRIMARY KEY 更改为 UNIQUE。

于 2016-11-09T23:20:38.713 回答
0

好吧,我设法找到了一个可以接受的解决方案!

首先,在 MS Access 中,当对表使用事件驱动数据宏时,不可能直接引用自动编号字段的值,直到它被完全插入并保存在数据库中(不是其他字段类型的情况)。当作为参数传递时,它将始终返回NULL VALUE

话虽如此,我们仍然可以在自定义 VBA 函数的帮助下为任何自动编号字段引用当前种子编号(感谢HansUp这篇文章):

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 将返回 Access 将在 [ID] 字段中设置的下一个自动编号值,这是 HASH FUNCTION 需要作为输入参数的值。现在我们可以在更改前事件中创建我们的数据宏,它应该如下所示:

If [IsInsert] = True Then
     Set Field
       Name  Hashed ID
       Value = HASHFUNCTION ( NEXTAUTONUM ( "Serials","ID" ) - 1 )
End If

此外,我们从 NEXTAUTONUM 函数返回的值中减去 1,因为我们需要当前正在处理的行的 [ID] Autonumber 值,而不是下一个将创建的行。

希望这会对某人有所帮助!

于 2015-03-05T22:42:06.937 回答