在MS Access 2013中,我有一个名为 [Serials] 的表格,其中只有3列: [ID] , [哈希ID] 和 [产品说明] 。
[ID]是增量整数自动编号和主键。 [哈希ID]保存应用于[ID]的哈希函数的结果。最后,[Product Description]保存用户输入(Hash功能作为公共函数存储在VBA模块中)。
我想要做的是在[Serials]表格中插入一行后自动计算[Hashed ID]字段。
我想这个诀窍在于正确使用此表的事件驱动数据宏,但我只是设法使用已经插入的行上的“更改前”事件(因此,使用在[ID]字段中保存了值?)。我迷路了!!!
答案 0 :(得分:1)
这是在Access 2016上测试的。我在读取BeforeChange数据宏内的字段时获得NULL值时发现了这种情况。如果该字段是PRIMARY KEY,则会发生这种情况。它不是自动编号。所以当你有这个组合时会出现问题:
简单的解决方案是将PRIMARY KEY更改为UNIQUE。
答案 1 :(得分:0)
好吧,我找到了一个可以接受的解决方案!
首先,似乎在MS Access中,当一个人使用事件驱动的数据宏用于表时,不可能 DIRECTLY 引用自动编号字段的值直到它完全插入并保存在DB上(其他字段类型不是这种情况)。作为参数传递时,它将始终返回 NULL VALUE 。
话虽如此,我们仍然可以借助自定义VBA功能(感谢 HansUp 为任何自动编号字段引用当前种子编号 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将返回Access将在[ID]字段中设置的自动编号值,如果插入新行,则HASH FUNCTION需要作为输入参数。现在我们可以在Before Change Event中创建我们的数据宏,它应该如下所示:
If [IsInsert] = True Then
Set Field
Name Hashed ID
Value = HASHFUNCTION ( NEXTAUTONUM ( "Serials","ID" ) - 1 )
End If
此外,我们从NEXTAUTONUM函数返回的值中减去1,因为我们需要当前正在处理的行的[ID]自动编号值,而不是接下来要创建的行。
希望这会对某人有所帮助!