【问题标题】:MSAccess event when new record is created创建新记录时的 MS Access 事件
【发布时间】:2023-03-10 10:44:01
【问题描述】:

我使用当前事件根据父表单上记录的 ID 更新子表单的 RecordSource 属性。问题出现在新记录中,因为 ID 字段(自动编号)为空。我测试空 ID 以避免错误,但我需要在创建记录后立即更新 RecordSource,当用户键入第一个字符时。

问题是 Dirty 和 BeforeInsert 事件在实际创建记录之前触发,因此在分配 ID 之前。我需要一个在分配 ID 自动编号后触发的事件。

提前感谢您的帮助

【问题讨论】:

  • 我不确定你可以。您担心检查当前的最大 ID 是正确的;如果刚刚删除顶行,则自动编号值可能会高于该值。 vbdotnetforums.com/ms-access/…

标签: ms-access vba


【解决方案1】:

有一个 After Insert 事件可以执行您想要的操作 - 它在插入记录后触发,因此 ID 存在。

【讨论】:

  • AfterInsert 在记录保存后触发。在此之前我需要一个事件,即一旦用户键入一个字符并创建自动编号。
  • 澄清:当用户键入时,您可以使用的唯一事件将是 On Key Down、On Key Up、on KeyPress。当他们停止输入并且文本框失去焦点时,所有事件(onchange、beforeupdate、afterupdate 等)都会触发。同样,在保存记录之前不会创建自动编号,尽管如果您使用普通访问,一旦文本框失去焦点,就会发生这种情况。我通常对绑定子表单做的是链接主字段和链接子字段,因为访问可以自己处理空 ID,或者
  • 在用户导航到新记录后设置 visible = false,在插入后再次设置 visible = true
  • tl;dr : 你不能得到你想要的,但如果你有时尝试,你可以得到类似的东西。
【解决方案2】:

如果我理解你,你想使用的事件是 Onchange 事件。为了让它在你的表单上工作,第一个获得焦点的控件必须有这个事件可用(即 Textbox )。我不知道哪个控件首先将焦点放在您的表单上,但如果它有此事件,那么您可以捕获键的第一次敲击并在那时运行您希望的过程。在第一次击键时,会创建 ID,并且正在使用的文本框或任何控件捕获每个击键,直到该控件退出。唯一需要注意的是,每次按下某个键时都会调用此事件,因此您必须创建某种类型的状态变量来设置显示您想要完成的操作已经运行并且不再执行。

    dim status as integer(must be declared at form declaration level.)
    if not status then
       do procedure
       Status =-1
    end if

【讨论】:

    【解决方案3】:

    我有点晚了,但是一起使用dirty和newrecord怎么样?

    即:

    If Me.NewRecord And Me.Dirty Then 'user has created a new record that has not yet been saved End If

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多