编辑:使用表级验证的解决方案
表级解决方案不会禁用字段,它只会在添加记录时对其进行验证。如果验证规则失败(评估为FALSE),则会向用户显示一条警告消息,并且将取消更新(未添加记录)。
应在Validation Rule 表属性中输入此表达式,如下所示:
IIf((([category]="gold" Or [category]="silver" Or [category]="bronze") And (Len([Field5])>0 Or Len([Field6])>0))
Or (([category]="Wood" Or [category]="stubble" Or [category]="hay") And (Len([Field8])>0 Or Len([Field9])>0))
,False,True)
警告:请确保括号按照上面的表达式排列!!
表达式很乱,但它测试您描述的两个“失败条件”是否为真,即:
1) 类别 = 金/银/铜并且 Field5/Field6 中的值不是空值
2) Category = wood/stubble/hay AND 非空值在 Field8/Field9
然后在表格属性表的Validation Text 属性中输入您希望通知用户记录失败并需要更正才能保存记录的文本。例如:
"If category is gold/silver/bronze then Field5 and Field6 must be blank, if wood/stubble/hay then Field8 and Field9 blank. Record not saved, please correct before saving."
这是设计视图中表格的屏幕截图,显示了属性表和您需要更改的 2 个属性。
更好:在表单中使用事件驱动验证和控制锁定的解决方案
鉴于 Access 表级和字段级验证不会执行所需的操作,此解决方案将在表单上使用事件驱动验证。它假定您有一个带有名为category、Field5、Field6、Field8 和Field9 的文本框控件的表单。
在设计视图中使用表单,右键单击category 字段(或同时按ALT 和ENTER)查看控件的属性。在屏幕右侧的属性表中,单击Events 选项卡。这将显示所选控件的可能事件。请参阅下面的屏幕截图。
您对After Update 事件感兴趣,因此请单击它,然后单击右侧的按钮...。选择 Code Builder 将为表单打开一个新的 VBA 模块并自动为您创建一个事件。
Private Sub category_AfterUpdate()
' by default enable all four fields 5/6/8/9
Me.Field5.Enabled = True
Me.Field6.Enabled = True
Me.Field8.Enabled = True
Me.Field9.Enabled = True
' test the value entered by user in the category field and hide fields as required
Select Case Me.category
Case "Gold", "Silver", "Bronze"
' if the user has entered Gold, Silver or Bronze lock Fields 5/6
Me.Field5.Enabled = False
Me.Field6.Enabled = False
Case "Wood", "Stubble", "Hay"
' if the user has entered Gold, Silver or Bronze lock Fields 8/9
Me.Field8.Enabled = False
Me.Field9.Enabled = False
End Select
End Sub
因此,上面的代码将确保当用户更新 category 字段时,Sub 和 End Sub 之间的代码将运行,并且此代码根据您的逻辑为您提到的字段设置 Enabled 属性。如果将此 Enabled 属性设置为 False 将锁定该字段,使其无法激活(接受光标)并将其变灰,以便用户知道它已被禁用。
最后,当用户移动到新记录时,您需要再添加一段代码,将 4 个字段重置为 Enabled。所以回到设计视图中的表单,通过单击表单的一部分而不是控件来访问Form 对象本身的属性。例如,单击表单页眉或页脚。当您看到表单的事件属性时,您将看到一个名为 Current 的事件。这是您创建事件过程所需要的,其方式与上面使用... 按钮的方式大致相同。这将带您再次进入 VBA 窗口,您需要确保在此处输入以下代码:
Private Sub Form_Current()
' by default enable all four fields 5/6/8/9
Me.Field5.Enabled = True
Me.Field6.Enabled = True
Me.Field8.Enabled = True
Me.Field9.Enabled = True
End Sub
这是包含所有代码的 VBA 屏幕的屏幕截图。
当您现在保存并运行您的表单时,它的行为应该完全符合您的意愿。如有任何问题或问题,请发表评论,我会尽力提供帮助。