MSACCESS,如何使用“插入后”触发器插入后编辑记录

时间:2019-03-28 21:55:39

标签: ms-access

MS Office 365 ProPlus,Access 2007-2016

在使用“插入后”触发器插入表后,我试图/无法更改表中的字段的值。像这样...

EditRecord
    SetField
        Name orig_id
        Value = [mytable].[id]
End EditRecord

这似乎不起作用。
USysApplicationLog给出...

SourceObject = mytable.AfterInsert
DataMacro InstanceID = {489D5697-5247-44A8-AE3C-3773A25F72E5}
Error Number = -20335
Category = Execution
Object Type = Macro
Description = EditRecord failed because the default alias represents a record which is read only.

该字段不是只读的。事实上,我可以对其进行编辑。我不知道“默认别名”是什么,甚至也不意味着什么。

如果触发器不能做到这一点,您能想到另一种完成同一件事的方法吗?

1 个答案:

答案 0 :(得分:3)

您不想使用AfterInsert,因为自那以来该记录已保存,并且可以很好地收藏起来,并且假定您需要更改该记录中的所有内容。实际上,默认上下文将导致所讨论的记录为只读。您可以通过再次拉动记录(查找记录)来解决此问题,但是如果您再次对其进行修改,则该记录的所有触发器都将再次触发。

因此,我仅建议您使用此事件对sum()进行添加或添加/编辑其他表,但不要使用刚刚编辑并保存的记录。

如果您需要/想要更新此当前记录,则将“编辑”或“修改”代码移至“ BeforeChange”。此事件不仅使您可以在保存之前进行编辑/修改(从而防止不断循环触发更新触发一次又一次),而且CURRENT记录处于完整上下文中,您甚至不需要任何“编辑记录” ”命令,因为您在上下文中拥有未保存的新记录。因此,您可以使用SetField而不需要EditRecord。

因此,AfterInsert在这里确实为时已晚,如果您可以修改该事件中的记录,那么如果您使用解决方法,则会导致AfteUpdate事件再次触发。

现在,如果您使用BeforeChange,它将同时插入和编辑(更改)。因此,如果您的代码确实仅在插入时需要运行,则可以使用

检查此状态
If [isinsert] = True then

编辑

此外,您的代码似乎正在尝试保存(捕获)先前的值,如果是,则可以使用:

[old].[id]

当然,对于“ id”来说这没有太大意义,因为它通常是一个自动编号的PK列,但是对于在BeforeChange事件中进行更新期间获取其他值,您当然可以测试+检查以前的(旧的)值。