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

时间:2013-02-15 21:44:39

标签: ms-access access-vba

当我将访问表单 ActivityTracker 打开到新记录时,我希望它使用当前时间()自动填充字段* 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。记录集类型是动态集。

否则,此表单的一切正常。

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

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

原因是你为什么要使用公开赛。

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

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

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

您不允许在开启事件中更改BOUND控件的值。这很快就是产品的设计和意图。

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

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

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

总结

开放式活动:

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

On-LOAD事件:

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:-1)

我不喜欢转移到表单上的新记录。可能会出现太多数据漏洞而且您会遇到像您这样的问题。

我推荐一个空白的,未绑定的表单,其中包含一个文本框,calander conrol,number up down ...等等,用于您要添加的每个字段。这样,您可以键入检查每个字段或根据您的需要进行其他检查。然后,当用户满意时,然后使用插入查询添加记录。

然而,对于你提出的问题。看起来您正在尝试为绑定字段分配值。尝试将值分配给字段绑定的对象。