#ms-access
#ms-access
Вопрос:
У меня есть база данных access, которая отслеживает наши внутренние проверки качества для персонала. У них есть 8 элементов, по которым мы их отслеживаем, и каждый из этих элементов имеет 4 возможных значения:
Pass (1)
Non-Pass (2)
FYI (3)
NP amp; FYI (4).
Вы можете увидеть эти 4 набора слева в столбце, который заканчивается «CPT». [1]. Я хотел бы, чтобы произошло то, что если КАКОЕ-либо из этих 8 полей соответствует FYI (ID 3), оно устанавливает флажок FYI в значение true. Если КАКИЕ-либо из них не являются проходными (ИДЕНТИФИКАТОР 2) Он устанавливает проходные флажки в значение false. Если КАКОЕ-ЛИБО из полей NP amp; FYI (ID 4) Я хочу, чтобы для двух флажков были установлены значения non-pass и 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 значение non-pass, то флажок FYI будет установлен, а поле QAFail не будет очищено. Если я задаю другим полям другие значения, я получаю самые разные результаты. Я предполагаю, что это связано с тем, что существует путаница между возможными значениями полей, интерпретируемых последовательными операторами If. Я думал об использовании CASE, но я не мог понять, как установить значение case на основе 8 разных полей. Я новичок в VBA, кто-нибудь может указать мне правильное направление?
Альтернативный код June7 (работает)
Dim strCodes As String
With Me
strCodes = Nz(.Diagnosis amp; .CPT amp; .DOS amp; .UpDownCode amp; _
.ChargeCorrections amp; .ChurnEsc amp; .Protocol amp; .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. Изображение не вставлено.
Ответ №1:
If
Условие возвращает значение True или False (-1 или 0), а не 1, 2, 3, 4, для которых вы тестируете. Каждый If
блок выполняется, поэтому последний, который соответствует критериям, возвращает результат. ElseIf
Затем используйте только одно End If
. Используйте With Me
блок и не нужно повторять Me
квалификатор. Почему в опубликованном коде не отображается символ продолжения строки? Код предполагает, что каждое поле имеет значение. Если какое-либо поле является нулевым или пустой строкой, тест на идентификатор 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
оператор.
Убедитесь, что значения тестирования расположены в порядке приоритета. Если идентификатор 3 должен иметь приоритет над 2 и 4, то сначала проверьте 3. Я бы подумал, что 2 имеет приоритет, но ваше повествование противоречит.
Рассмотрим альтернативный код:
Dim strCodes As String
With Me
strCodes = Nz(.Diagnosis amp; .CPT amp; .DOS amp; .UpDownCode amp; _
.ChargeCorrections amp; .ChurnEsc amp; .Protocol amp; .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
Комментарии:
1. 8 полей не являются полями да / нет, это поля поиска, основанные на таблице, хранящей 4 значения. Числа, которые я перечислил, являются значениями идентификаторов для этих записей. Я не знал о операторе with / end with — я попробую это сделать.
2. Я знаю, что это не поля да / нет. Я никогда не говорил, что они есть.
If
Условие возвращает значение True / False в зависимости от того, приводят ли выражения критериев к true или false. Для того, чтобыAnd
условие было истинным, все 8 выражений должны быть истинными.Or
Только одно из 8 выражений должно быть истинным, чтобы условие было истинным.3. Я попробовал ваш альтернативный код, и он работает, но я не уверен, что понимаю последнее утверждение elseif. Access не примет его без оператора then после него, и я вставил это туда. Должен ли я помещать то, что я хочу, чтобы произошло, если все 8 полей = 1? Я поместил код, который я пробовал выше.
4. Извините, исправлена пропущенная
Then
опечатка. Условие для всех 8 полей = 1 на самом деле не требуется. Любая ситуация, которая не соответствует первым 3 условиям, будет проверена последним условием, и если переменная не является пустой строкой, код в этом ElseIf будет выполнен. После проверки первых 3 условий в каждом поле должно быть только значение 1 (при условии, что пользователям запрещено вводить какие-либо другие значения, кроме этих четырех). Однако ни один код не гарантирует, что В КАЖДОМ поле есть данные. Разрешено ли пользователям оставлять поле пустым?5. Нет, по умолчанию поля имеют значение «1», я хотел, чтобы там был код «все равны 1» на случай, если кто-то установит значение, не являющееся проходным, а затем вернет его на передачу. Я хотел, чтобы произошло автоматическое обновление. Код работает отлично! Я действительно ценю это! Ответ отмечен.