3

当我打开访问表单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。记录集类型是动态集。

否则,此表单一切正常。

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

谢谢你的帮助!

4

3 回答 3

5

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

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

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

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

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

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

因此,测试条件以防止表单加载进入打开状态。

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

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

总之

开场活动:

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

加载事件:

您的所有启动代码、变量设置、控件设置等现在都已被推荐并成为可能。

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

于 2013-02-16T23:28:25.563 回答
3

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

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

请不要使用设置警告:DoCmd.SetWarnings 和 CurrentDB.Execute 有什么区别

于 2013-02-15T21:46:55.323 回答
-1

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

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

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

于 2013-02-15T23:16:07.720 回答