无法使用新记录在Access窗体中设置字段值

MrM*_*oxy 3 ms-access access-vba

当我将访问表单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
Run Code Online (Sandbox Code Playgroud)

这会引发错误"您无法为此对象赋值"并停止执行.

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

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
Run Code Online (Sandbox Code Playgroud)

或者

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
Run Code Online (Sandbox Code Playgroud)

但是其中任何一个都会导致弹出警告,"你无法转到指定的记录."

我试图用这个来压制警告

    DoCmd.SetWarnings False
    DoCmd.RunCommand acCmdRecordsGoToNew
    DoCmd.SetWarnings True
Run Code Online (Sandbox Code Playgroud)

或者通过设置错误处理,

    On Error GoTo Err_SomeName
Run Code Online (Sandbox Code Playgroud)

但我仍然得到警告.

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

否则,这个表格一切正常.

我究竟做错了什么?是否有一个名为"打开新记录"的事件而不是"开放形式"?

谢谢你的帮助!

Alb*_*lal 5

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

原因是您使用的是开放式活动.

与.net不同,大多数系统访问都有一个很棒的设计,当你打开表单事件(可以取消)和一个on-load事件时,你会发生两个事件.

这种伟大的Access设计意味着可以将用于测试条件和防止表单加载的代码放置在on-open事件中.如果你看起来CLOSE,你会看到开启甚至取消.如果你设置cancel = true,那么表格将不会加载,也不会显示.

因此,您可以测试没有数据,或用户权限等等,小屋取消表单加载.如果你可以取消表单加载,那么允许修改绑定控件的值是没有意义的 - 因此所有绑定控件都是READ ONLY.

您不允许更改on-open事件中BOUND控件的值.这很快就是产品的设计和意图.

因此,测试防止表单加载的条件是开放的.

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

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

综上所述

公开活动:

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

On-LOAD事件:

现在推荐并且可以使用所有启动代码,变量设置,控件设置等.

Access ALSO中的这个简单设计意味着作为开发人员,您现在知道在哪里查找将阻止和取消表单加载的代码.当然,如果没有对差异的基本理解以及为什么在Access中存在两个事件,那么海报和答案的混淆变得显而易见.