【问题标题】:Can't set field value in Access form with new record无法使用新记录在 Access 表单中设置字段值
【发布时间】:2013-01-31 23:10:49
【问题描述】:

当我打开我的访问表单 ActivityTracker 到新记录时,我希望它使用当前时间 now() 自动填充字段 *start_time*。

Private Sub Form_Open(Cancel As Integer)
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then
        Form_ActivityEntry.Start_time = Now()
    End If
End Sub

这会引发错误“您无法为该对象赋值”并停止执行。

我可以通过明确转到新记录来修复错误

Private Sub Form_Open(Cancel As Integer)
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then
        DoCmd.RunCommand acCmdRecordsGoToNew
        Form_ActivityEntry.Start_time = Now()
    End If
End Sub

或通过

Private Sub Form_Open(Cancel As Integer)
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then
        Me.Recordset.AddNew
        Form_ActivityEntry.Start_time = Now()
    End If
End Sub

但其中任何一个都会导致弹出警告,“您无法转到指定的记录。”

我试图用这个来抑制警告

    DoCmd.SetWarnings False
    DoCmd.RunCommand acCmdRecordsGoToNew
    DoCmd.SetWarnings True

或通过设置错误处理,

    On Error GoTo Err_SomeName

但我仍然收到警告。

AllowAdditions 设置为 True。记录集类型是动态集。

否则,此表单一切正常。

我做错了什么?是否有一个名为“打开新记录”而不是“打开表格”的事件?

感谢您的帮助!

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    这里的问题仍然没有人正确回答为什么发布的代码不起作用。

    原因是您正在使用 on-open 事件。

    与 .net 不同,大多数系统访问具有出色的设计,其中当您打开表单事件(可以取消)和加载事件时,您会发生两个事件。

    Access 的这一出色设计意味着可以将用于测试条件和防止表单加载的代码放在 on-open 事件中。如果您查看 CLOSE,您会看到 on-open 甚至有取消。如果您设置 cancel = true,则 FORM 不会加载,也不会显示。

    因此,您可以测试是否没有数据,或测试用户权限或其他任何内容,然后小屋会取消表单加载。如果您可以取消表单加载,那么允许修改绑定控件的值就没有什么意义了——因为所有绑定控件都是只读的。

    您不能在 on-open 事件中更改 BOUND 控件的值。这太快了,而且是产品的设计和意图。

    因此,测试条件以防止表单加载在打开时进行。

    因此,这表明变量的设置、控件的设置、控件的设置值和您的基本表单启动代码属于 ON-LOAD 事件。开启还为时过早。

    当然,如果您的代码要取消表单加载,那么您的所有表单启动和设置代码不应该也不需要运行是合乎逻辑的。

    总结

    开放式活动:

    可以设置cancel = true 代码在这里测试您是否希望阻止表单加载并被用户看到。

    加载事件:

    您的所有启动代码、变量设置、控件设置等现在都被推荐并可以使用。

    Access 中的这种简单设计还意味着,作为开发人员,您现在知道在哪里寻找可以阻止和取消表单加载的代码。当然,如果没有对 Access 中存在两个事件的差异和原因的基本了解,那么海报和给出的答案的混淆就会变得很明显。

    【讨论】:

      【解决方案2】:

      我建议您将控件的默认值设置为 Now() 或 Date()。默认值仅适用于新记录,一旦您完成任何其他字段,该值将被分配。

      在这种特殊情况下,甚至还有一个参数用于设置表中字段的默认值。

      请不要使用设置警告:What's the difference between DoCmd.SetWarnings and CurrentDB.Execute

      【讨论】:

      • 正如荷马所说,“天哪!”那太明显了。 :-) 我在创建表单时考虑过这一点,但没有选择,因为我认为我希望它由用户发起。
      【解决方案3】:

      我不喜欢在表格上移动到新记录。可能发生的数据漏洞太多,您会遇到类似的问题。

      对于您要添加的每个字段,我建议使用一个空白的、未绑定的表单,其中包含一个文本框、日历控件、向下编号……等等。这样,您可以键入检查每个字段或根据您的需要进行其他检查。然后,当用户满意时,使用插入查询添加记录。

      但是,对于您提出的问题。看起来您正在尝试为绑定字段分配一个值。尝试将值分配给该字段绑定到的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2021-08-04
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多