根据另一个字段的值启用/禁用对某些字段的输入
Posted
技术标签:
【中文标题】根据另一个字段的值启用/禁用对某些字段的输入【英文标题】:Enabling/disabling input into certain fields based on the value of another field 【发布时间】:2014-01-04 16:37:58 【问题描述】:在数据输入表单 frmlastweeksactivities 中。当某行的 [“活动类别”] 字段 /column 中的内容为“Gold”或“Silver”或“Bronze”时,禁用列/字段[5] & [6]
当一行在 [“活动类别”] 字段/列中包含“木头”或“干草”或“残茬”作为内容时,禁用列/字段[8] & [9]
禁用意味着在这种情况下不允许任何数据输入,将它们变成红色也会很好
我正在尝试构建和表达以在表格验证规则属性或表单中的控制 -txt 框之一中使用
【问题讨论】:
您最好在表单而不是表格中使用验证,因为您希望根据您定义的逻辑在表单中禁用控件(输入数据的位置)。您是在谈论添加新记录还是更新现有记录?AfterUpdate
事件在用户更改控件值时为控件触发,并且在此事件后面的 VBA 代码中,您可以定义自定义操作(例如,为表单上的其他控件设置 Enabled
属性)。见这个例子access-programmers.co.uk/forums/showthread.php?t=209730
谢谢你我的计划是在这个阶段使用表格验证规则,因为 VBA 略高于我目前的技能水平。所以我只是在寻找一个表达式来放入验证规则框中表属性。我只对输入的未来记录感兴趣,而不是在现有记录中。我希望使用数据库的少数操作员将快速了解需要将哪些数据放入其中,因此表单验证是一个不错的想法,但可能对我来说太过分了目前需要完成。再次感谢
恐怕无法在表格验证规则中做你想做的事。我检查了自己,Access 抛出了一个异常:Invalid SQL syntax - cannot use multiple columns in a column-level CHECK constraint
。通过首先限制他们使用控件来改善用户体验也是更好的做法。我将在下面发布一个 VBA 示例,您应该会发现它很容易实现。
我上面错了。可以创建表级验证规则,但它不如禁用表单中的控件是一个好的解决方案。我已经更新了我的解决方案以反映这一点......
【参考方案1】:
编辑:使用表级验证的解决方案
表级解决方案不会禁用字段,它只会在添加记录时对其进行验证。如果验证规则失败(评估为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 屏幕的屏幕截图。
当您现在保存并运行您的表单时,它的行为应该完全符合您的意愿。如有任何问题或问题,请发表评论,我会尽力提供帮助。
【讨论】:
这个回复比我以前在访问过的任何 Access 论坛上收到的都要清晰得多 您好我已经实施了这个解决方案并且效果很好。但是有一个问题是:- 您好,我已经按照描述实现了这个解决方案 2,它运行良好。但是有一个问题: - 在新记录期间,这些字段根据需要被禁用但是如果由于某种原因用户返回他们已经输入的记录,比如说检查它们,他们可以在错误的字段中输入数据。我将进行实验,看看如果我省略控制当前属性的 vba 模块的第二部分会发生什么 是的,它现在可以正常工作了,欢迎任何关于这种方法可能会产生不重置表单的问题的指导 对那些阅读本文的人有一点观察——Access 提示我在表单属性中为 HAsModule 表单属性选择“YEs”,我一开始就忽略了这一点——当然,模块现在什么也没做齐尔奇。一旦我选择了“是”并保存它,它就可以正常工作了.. 非常好,非常感谢您的帮助以上是关于根据另一个字段的值启用/禁用对某些字段的输入的主要内容,如果未能解决你的问题,请参考以下文章