【问题标题】:MSACCESS, how to edit a record after insert using the "after insert" triggerMSACCESS,如何使用“插入后”触发器在插入后编辑记录
【发布时间】:2019-08-19 19:19:27
【问题描述】:

MS Office 365 专业增强版,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.

该字段不是只读的。事后我可以编辑它就好了。我不知道“默认别名”是什么,甚至是什么意思。

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

【问题讨论】:

  • 我从未使用过数据宏。我根本不使用任何宏。为什么需要更改 ID 值?
  • 我试图复制这个。 DataMacro 不出错 - 不执行任何操作,字段值未更改。为什么将 [mytable] 引用为值的来源?
  • 实际归档是一个日期字段,用于标识任务预计何时完成(称为“expected_finish”)。客户可以更改该值,但他们也想知道在任何更改之前它最初是什么。所以我添加了一个名为“initial_expected_finish”的列。在最初插入记录时设置该值对我来说很有意义。我想我可以要求用户输入值,然后让更新前触发器拒绝除相同条目之外的所有内容,但他们不会喜欢这样。
  • initial_expected_finish 可以由 DefaultValue 属性设置,然后表单上的文本框可以被锁定,因此无法编辑,只能查看。

标签: ms-access


【解决方案1】:

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

所以我只建议你使用这个事件来 sum() 或添加/编辑 OTHER 表,而不是刚刚编辑和保存的记录。

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

所以,AfterInsert 在这里真的太晚了,如果您可以在该事件中修改记录,如果您确实使用解决方法,您将导致 AfteUpdate 事件再次触发。

现在,如果您使用 BeforeChange,它将同时触发插入和编辑(更改)。所以,如果你的代码真的只需要在插入时运行,你可以使用

来检查这个状态
If [isinsert] = True then

编辑

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

[old].[id]

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

【讨论】:

  • 这不是一个真正的 id 字段,它是一个日期,它反映了用户移动日期目标帖子之前的初始时间估计。 (我可能应该早点说,对不起)。我在更新触发器中尝试了“if [IsInsert] = True”,并且成功了。谢谢,我为此点击了您帖子上的向上箭头。谁会想到插入会触发更新?
  • 谢谢。是的,如果您更改或添加新记录,之前的更改将运行。它简化了一些在您更新时运行的代码,并且插入确实建议添加记录,然后您修改添加的记录。如果您在某个零件号上保留运行总计,那么您需要知道这是否是插入,但您可能会在更改事件中保留一个通用代码。 (是的,id 只是变老的一个例子,而 ID 是我的一个坏例子。
  • 查看数据控件旧值的语法是:controlname.OldValue[isinsert] 是什么?
  • Isinsert 让您的代码检查这是一条新记录还是您正在更改(我们正在更改事件中) - 所以这两个事件都会触发
  • 我仍然不清楚 [isinsert] 是什么 - 变量、函数、属性、字段?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2016-01-27
  • 1970-01-01
  • 2013-07-17
  • 2011-12-06
  • 2016-10-13
相关资源
最近更新 更多