【发布时间】:2015-03-05 17:34:28
【问题描述】:
在 MS Access 2013 中,我有一个名为 [Serials] 的表,它仅包含 3 列:[ID]、[Hashed ID] 和 [产品说明]。
[ID] 是一个增量整数自动编号和主键。 [Hashed ID] 保存应用于 [ID] 的哈希函数的结果。最后,【产品描述】保存用户输入(哈希函数作为公共函数存储在 VBA 模块中)。
我想做的是在 [Serials] 表中插入一行后自动计算字段 [Hashed ID]。
我想诀窍在于正确使用该表的事件驱动数据宏,但我只设法在已插入的行上使用“更改前”事件来完成这项工作(因此,使用在他们的 [ID] 字段上保存的值?)。我迷路了!!!
【问题讨论】:
-
更新:我继续使用“Before Change”事件,并使用它将记录中的所有插入值复制到同一行中的不同空列。所有这些都被复制了,除了 [ID] COLUMN,它显然只是抛出一个 NULL 值。难道在处理完所有事件之前,表上的 AUTONUMBERS 或 PRIMARY KEYS 并没有真正“插入”吗???
-
是的,不幸的是,当更改前数据宏在插入一行时运行时,它“看到”自动编号字段的值为
Null。尽管 Access 已经检索到下一个自动编号值并且甚至可能正在显示它(例如,在数据表视图中),但还是会这样做。因此,事件驱动的数据宏可能不适合您的预期目的。 -
感谢您的评论!它显示在数据表视图中的事实使其非常反直觉。请在下面查看我的答案,它可能不是理想的解决方案,但我认为这是一种有效的解决方法!
-
你必须使用后插入。在插入更改之前可以取消,因此永远不会使用自动编号。大多数数据库系统/触发器都是空自动编号。在提交记录之前,您不能(也不应该)使用 autonubmer。任何需要自动编号的代码都需要移动到插入事件后。事实上,从任何“合理”的意义上说,这样的代码确实不能属于可以取消的事件。您在更改之前对 PK 值的需求为零,因为您不知道该记录是否会在该时间点提交。
标签: vba ms-access calculated-field ms-access-data-macro