需要验证码,因此 3 个布尔字段中只有 1 个可以为真
Posted
技术标签:
【中文标题】需要验证码,因此 3 个布尔字段中只有 1 个可以为真【英文标题】:Need validation code so only 1 of 3 Boolean fields can be true 【发布时间】:2013-05-27 22:42:23 【问题描述】:Access 2010:我有一个包含 3 个布尔字段的表 - 称它们为 Field_A、Field_B 和 Field_C。
在数据输入表单上,用户应该能够检查(将值设为 TRUE)其中任何一个选项,但任何时候只有一个选项可以为 TRUE。如果 Field_B 已经为真并且用户想要更改它,因此 Field_C 是选择为 TRUE 的选项,他应该首先取消选择 Field_B(将其重置为 FALSE),然后才能选中表单上的 Field_C 框。
因此,我需要为这些字段中的每一个字段设置一些验证代码,如果用户尝试将一个字段设置为 TRUE,则会检查其他两个字段的状态。如果其他两个字段当前都为 FALSE,则允许将当前字段更改为 TRUE。但是,如果其他字段中的任何一个当前为 TRUE,它应该会创建一个弹出消息,说明已经有另一个选择,并且必须先将另一个字段更改为 FALSE,然后才能继续。
我尝试使用 Yes/No 选项的数值,设置条件验证,要求其他两个值的总和为零,然后才允许将感兴趣的字段(例如 Field_A)更改为 TRUE(值= -1) (就像([Field_B] + [Field_C]) =0
一样,但我一直收到语法错误。我对此很陌生,我不知道这是否真的只是一个简单的语法问题,或者是否需要完全不同的方法.
最后一条信息——将所有 3 个字段都设置为 FALSE 是可以接受的,所以我不希望在另一个字段从 TRUE 更改回 FALSE 时强制其中一个字段变为 TRUE。
【问题讨论】:
【参考方案1】:这 3 个复选框有两种可接受的组合:
-
都是
False
(未选中)
只有一个可以是True
(选中)
这意味着这些复选框值的总和必须是 0 或 -1。
? False + False + False
0
? False + False + True
-1
您可以在表单的代码模块中添加一个函数...
Private Function checkBoxProblem() As Boolean
Dim blnReturn As Boolean
Dim intSum As Integer
Dim strPrompt As String
intSum = Nz(Me.Field_A, 0) + Nz(Me.Field_B, 0) + Nz(Me.Field_C, 0)
If Not (intSum = 0 Or intSum = -1) Then
strPrompt = "only one box can be checked"
MsgBox strPrompt
blnReturn = True
Else
blnReturn = False
End If
checkBoxProblem = blnReturn
End Function
然后从这 3 个复选框中的每一个的更新前事件中调用该函数。
Private Sub Field_A_BeforeUpdate(Cancel As Integer)
Cancel = checkBoxProblem
End Sub
Private Sub Field_B_BeforeUpdate(Cancel As Integer)
Cancel = checkBoxProblem
End Sub
Private Sub Field_C_BeforeUpdate(Cancel As Integer)
Cancel = checkBoxProblem
End Sub
【讨论】:
哇!这是完美的——正是我想要的。很抱歉,我无法回到这个项目并回复这么久,但是今晚我只花了几分钟就看到你在做什么,并将代码应用到我的数据库中。感谢您向我展示 Nz 函数。【参考方案2】:数据输入表单后面的一些代码应该可以解决问题。尝试以下方式:
Option Compare Database
Option Explicit
Private Sub Field_A_BeforeUpdate(Cancel As Integer)
Const ThisField = "Field_A"
If Me.Field_A.Value Then
If Me.Field_B.Value Then
ShowMyMessage "Field_B", ThisField
Cancel = True
ElseIf Me.Field_C.Value Then
ShowMyMessage "Field_C", ThisField
Cancel = True
End If
End If
End Sub
Private Sub Field_B_BeforeUpdate(Cancel As Integer)
Const ThisField = "Field_B"
If Me.Field_B.Value Then
If Me.Field_A.Value Then
ShowMyMessage "Field_A", ThisField
Cancel = True
ElseIf Me.Field_C.Value Then
ShowMyMessage "Field_C", ThisField
Cancel = True
End If
End If
End Sub
Private Sub Field_C_BeforeUpdate(Cancel As Integer)
Const ThisField = "Field_C"
If Me.Field_C.Value Then
If Me.Field_B.Value Then
ShowMyMessage "Field_B", ThisField
Cancel = True
ElseIf Me.Field_A.Value Then
ShowMyMessage "Field_A", ThisField
Cancel = True
End If
End If
End Sub
Private Sub ShowMyMessage(OtherField As String, CurrentField As String)
MsgBox _
"You must un-select """ & OtherField & """" & _
" before you can select """ & CurrentField & """", _
vbExclamation, _
"Mutually exclusive options conflict"
End Sub
【讨论】:
感谢您的意见!我最终选择了 HansUp 的示例,因为它使用了我测试布尔整数值的原始方法。以上是关于需要验证码,因此 3 个布尔字段中只有 1 个可以为真的主要内容,如果未能解决你的问题,请参考以下文章