使用IF查看多个字段以返回设置值

时间:2019-04-09 16:26:49

标签: ms-access

我有一个访问数据库,该数据库跟踪我们对员工的内部质量保证检查。它们有8个项目,我们对其进行跟踪,并且每个项目都有4个可能的值:
通过(1)
不及格(2)
仅供参考(3)
NP&FYI(4)。
您可以在“ CPT”顶部的左侧看到这4组。 screenshot [1]。我想发生的是,如果这8个字段中的任何一个都是FYI(ID 3),它将FYI复选框设置为true。如果ANY为不合格(ID 2),则将合格复选框设置为false。如果任何字段为NP&FYI(ID 4),我希望将两个复选框设置为不及格和FYI。我正在尝试的代码是:

Private Sub Form_AfterUpdate()
If (Me.Diagnosis And Me.CPT And Me.DOS And Me.UpDownCode And 
    Me.ChargeCorrections And Me.ChurnEsc And Me.Protocol And Me.BillServProv) 
    = 1 Then
    Me.FYI = 0
    Me.QAFail = -1
    End If
If (Me.Diagnosis Or Me.CPT Or Me.DOS Or Me.UpDownCode Or 
    Me.ChargeCorrections Or Me.ChurnEsc Or Me.Protocol Or Me.BillServProv) = 2 
    Then
    Me.QAFail = 0
    End If
If (Me.Diagnosis Or Me.CPT Or Me.DOS Or Me.UpDownCode Or 
    Me.ChargeCorrections Or Me.ChurnEsc Or Me.Protocol Or Me.BillServProv) = 3 
    Then
    Me.FYI = -1
    End If
If (Me.Diagnosis Or Me.CPT Or Me.DOS Or Me.UpDownCode Or 
    Me.ChargeCorrections Or Me.ChurnEsc Or Me.Protocol Or Me.BillServProv) = 4 
    Then
    Me.FYI = -1
    Me.QAFail = 0
    End If
End Sub

不幸的是,我得到的结果不一致。如果我将CPT之类的字段设置为不通过,则FYI复选框tic和QAFail框不会清除。如果将其他字段设置为其他值,则会得到各种不同的结果。我之所以假设它是因为连续的If语句解释的字段的可能值之间存在混淆。我曾考虑过使用CASE,但是我不知道如何根据8个不同的字段设置大小写值。我是VBA的新手,有人可以向我指出正确的方向吗?

6月7日的替代代码(有效)

Dim strCodes As String
With Me
strCodes = Nz(.Diagnosis & .CPT & .DOS & .UpDownCode & _
    .ChargeCorrections & .ChurnEsc & .Protocol & .BillServProv, "")
End With
If InStr(strCodes, 2) > 0 Then
    Me.QAFail = 0
ElseIf InStr(strCodes, 3) > 0 Then
    Me.txtFYI = -1
ElseIf InStr(strCodes, 4) > 0 Then
    Me.txtFYI = -1
    Me.QAFail = 0
ElseIf strCodes <> "" Then
    Me.txtFYI = 0
    Me.QAFail = -1
End If
End Sub

1 个答案:

答案 0 :(得分:1)

If条件返回True或False(-1或0)而不是要测试的1、2、3、4。每个If块都会执行,因此最后一个符合条件的块将返回结果。使用ElseIf,然后只使用一个End If。使用With Me块,而不必重复Me限定词。为什么发布的代码不显示换行符?代码假定每个字段都有一个值。如果任何字段为Null或为空字符串,则ID 1的测试将始终返回False,即使其他7个字段的值为1。

With Me
If (.Diagnosis = 1 And .CPT = 1 And .DOS = 1 And .UpDownCode = 1 And _
    .ChargeCorrections = 1 And .ChurnEsc = 1 And .Protocol = 1 And .BillServProv = 1) Then
...
ElseIf (...) Then
...
ElseIf (...) Then
...
ElseIf (...) Then
...
End If
End With

使用ElseIf运算符对Or表达式使用相同的语法。

确保测试值按优先级顺序排列。如果ID 3的优先级高于2和4,则首先测试3。我认为2优先,但您的叙述矛盾。

考虑备用代码:

Dim strCodes As String
With Me
strCodes = Nz(.Diagnosis & .CPT & .DOS & .UpDownCode & _
    .ChargeCorrections & .ChurnEsc & .Protocol & .BillServProv, "") 
End With
If InStr(strCodes, 2) > 0 Then
    ...
ElseIf InStr(strCodes, 3) > 0 Then
    ...
ElseIf InStr(strCodes, 4) > 0 Then
    ...
ElseIf strCodes <> "" Then
    ...
End If