Ms access MSACCESS,如何在插入后使用;在后面插入“;触发

Ms access MSACCESS,如何在插入后使用;在后面插入“;触发,ms-access,Ms Access,MS Office 365 ProPlus,访问权限2007-2016 在使用“after insert”触发器插入表后,我尝试/未能更改表中字段的值。像这样的 EditRecord SetField Name orig_id Value = [mytable].[id] End EditRecord 这似乎不起作用。 USysApplicationLog提供了 SourceObject = mytable.AfterInsert DataMacro I

MS Office 365 ProPlus,访问权限2007-2016

在使用“after insert”触发器插入表后,我尝试/未能更改表中字段的值。像这样的

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.
该字段不是只读的。事实上,我可以编辑它只是罚款。我不知道“默认别名”是什么,也不知道它是什么意思


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

您不想使用AfterInsert,因为此时记录已经保存,并被很好地隐藏起来,并且您需要在该记录中更改的所有内容都假定已经完成。事实上,默认上下文将导致相关记录为只读。您可以通过再次拉取记录(查找记录)来解决此问题,但如果再次修改记录,则该记录的所有触发器将再次触发

因此,我只建议您使用此事件来sum()或添加/编辑其他表,而不是刚刚编辑和保存的记录

如果需要/希望更新此当前记录,请将“编辑”或“修改”代码移动到“更改前”。此事件不仅允许您在保存之前进行编辑/修改(从而防止更新触发一次又一次触发的无休止的循环),而且当前记录处于完整上下文中,您甚至不需要任何“编辑记录”命令,因为您在上下文中拥有新的未保存记录。因此,您可以使用设置字段,而无需编辑记录

因此,这里的AfterInsert实在太晚了,如果您可以在该事件中修改记录,那么如果您确实使用了变通方法,将导致AfterUpdate事件再次触发

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

If [isinsert] = True then
编辑 此外,代码似乎正在尝试保存(捕获)以前的值,如果是,则可以使用:

[old].[id]

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

我从未使用过数据宏。我根本不使用任何宏。为什么需要更改ID值?我试图复制这个。DataMacro不出错-不执行任何操作,字段值未更改。为什么要引用[mytable]作为值的来源?实际字段是一个日期字段,用于标识任务预计何时完成(称之为“预期完成”)。客户可以更改该值,但他们也希望在任何更改之前知道它最初是什么。所以我添加了一个名为“初始预期完成”的专栏。在最初插入记录时设置该值对我来说很有意义。我想我可以要求用户输入值,然后让更新前触发器拒绝除相同项以外的所有内容,但他们不会喜欢。初始\u预期\u完成可以由DefaultValue属性设置,然后表单上的文本框可以锁定,因此无法编辑,只需查看。它不是真正的id字段,这是一个日期,它反映了用户移动目标发布日期之前的初始时间估计。(对不起,我可能应该早点说)。我在update触发器中尝试了“if[IsInsert]=True”,结果成功了。谢谢,我点击了你帖子上的向上箭头。谁会想到插入会触发更新?谢谢。是的,如果您更改或添加新记录,则将运行“更改前”命令。它简化了更新时运行的一些代码,插入确实建议添加记录,然后修改添加的记录。如果您在某些情况下(比如零件号)保留一个运行总数,那么您需要知道这是否是一个插入,但您可能会在更改事件中保留一个公共代码。(是的,id只是一个变老的例子,id对我来说是一个坏例子。查看数据控件旧值的语法是:
controlname.OldValue
。什么是
[isinsert]
?isinsert让我们检查您的代码这是新记录还是正在更改(我们正在更改事件中)-所以这两个事件都会触发,直到我不清楚[isinsert]是什么-变量、函数、属性、字段?