当我将访问表单 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。记录集类型是动态集。
否则,此表单的一切正常。
我做错了什么?是否有一个名为“打开新记录”的事件而不是“开放形式”?
感谢您的帮助!
答案 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 ...等等,用于您要添加的每个字段。这样,您可以键入检查每个字段或根据您的需要进行其他检查。然后,当用户满意时,然后使用插入查询添加记录。
然而,对于你提出的问题。看起来您正在尝试为绑定字段分配值。尝试将值分配给字段绑定的对象。