需要验证码,因此 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 个可以为真的主要内容,如果未能解决你的问题,请参考以下文章

Python图片验证码降噪 — 8邻域降噪

React实现移动端输入短信验证码页面

React实现移动端输入短信验证码页面

验证由 PLSQL 中的 3 个字段组成的日期

Sonata Admin - 布尔字段类型,标签不显示

基于Tensorflow的验证码识别