Использование ЕСЛИ для просмотра нескольких полей для возврата заданного значения

У меня есть база данных доступа, которая отслеживает наши внутренние проверки качества для персонала. У них есть 8 элементов, по которым мы их отслеживаем, и каждый из этих элементов имеет 4 возможных значения:
Пройти (1)
Без прохода (2)
К вашему сведению (3)
NP&FYI (4).
Вы можете увидеть эти 4 набора слева в столбце, над которым стоит «CPT». Использование ЕСЛИ для просмотра нескольких полей для возврата заданного значения[1]. Я хотел бы, чтобы произошло, если ЛЮБОЕ из этих 8 полей FYI (ID 3), он устанавливает флажок FYI в true. Если ЛЮБОЙ не проходит (ID 2), он устанавливает флажки прохождения на false. Если ЛЮБОЕ из полей имеет значение NP&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, как непроходное, то галочки флажка FYI и поле QAFail не очищаются. Если я устанавливаю для других полей другие значения, я получаю самые разные результаты. Я предполагаю это из-за путаницы между возможными значениями полей, интерпретируемых последовательными операторами If. Я думал об использовании CASE, но не мог понять, как установить значение case на основе 8 разных полей. Я новичок в VBA, может ли кто-нибудь указать мне правильное направление?

Альтернативный код 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

Изображение не вставилось.

June7 09.04.2019 20:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

8 полей не являются полями да/нет, они являются полями поиска на основе таблицы, в которой хранятся 4 значения. Числа, которые я перечислил, являются значениями идентификаторов для этих записей. Я не знал об операторе with/end with - попробую.

Robert Loughrey 09.04.2019 23:01

Я знаю, что это не поля да/нет. Я никогда не говорил, что они есть. Условие If возвращает True/False в зависимости от того, являются ли выражения критериев истинными или ложными. С And все 8 выражений должны быть истинными, чтобы условие было истинным. С Or только любое из 8 выражений должно быть истинным, чтобы условие было истинным.

June7 09.04.2019 23:09

Я попробовал ваш альтернативный код, и он работает, но я не уверен, что понимаю последний оператор elseif. Access не примет его без оператора then после него, и я поместил его туда. Должен ли я указывать то, что я хочу, если все 8 полей = 1? Я поставил код, который пробовал выше.

Robert Loughrey 11.04.2019 17:14

Извините, исправил недостающую Then опечатку. Условие для всех 8 полей = 1 на самом деле не нужно. Любая ситуация, которая не соответствует первым трем условиям, будет проверена последним условием, и если переменная не является пустой строкой, будет выполнен код в этом ElseIf. После проверки первых трех условий в каждом поле должно быть только значение 1 (при условии, что пользователям запрещено вводить какие-либо другие значения, кроме этих четырех). Однако ни один код не гарантирует наличие данных в КАЖДОМ поле. Разрешено ли пользователям оставлять поле пустым?

June7 11.04.2019 19:19

Нет, по умолчанию для полей установлено значение «1». Я хотел, чтобы там был код «все равно 1», на случай, если кто-то установит значение непроходного, а затем вернет его обратно. Я хотел, чтобы автоматическое обновление произошло. Код работает отлично! Я очень ценю это! Ответ отмечен.

Robert Loughrey 11.04.2019 19:26

Ну а последний ElseIf позаботится о «все равно 1». Может быть даже просто Else, без проверки на пустую строку.

June7 11.04.2019 19:28

Поле может быть установлено по умолчанию равным 1, но разрешено ли пользователям удалять значение и оставлять поле пустым (Null)? Если у вас нет проверки, чтобы предотвратить это, это, безусловно, может произойти, даже случайно.

June7 12.04.2019 00:08

Они не могут, это поле со списком, ограниченное списком, поэтому оно всегда имеет значение. По другому вопросу у меня есть к вам вопрос по предложенному вами коду. У меня есть это в свойстве After Update формы. он работает на форме ввода данных. Однако, когда я пытаюсь добавить новую запись с помощью макроса доступа или методов DoCmd.GoToRecord , , acNewRec, мне не удается добавить новую запись. Есть предположения? У меня есть это в неправильном свойстве?

Robert Loughrey 15.04.2019 23:36

Поле со списком с ограничением на список по-прежнему допускает Null. Пользователь просто должен удалить ввод с помощью клавиши ESC, DELETE или BACKSPACE. Следует использовать AfterUpdate каждого элемента управления. Поместите код в подпрограмму за формой, затем вызовите подпрограмму из каждого из 8 элементов управления.

June7 16.04.2019 03:49

Спасибо, 7 июня, все работает отлично. Спасибо за помощь и урок!

Robert Loughrey 17.04.2019 21:01

Другие вопросы по теме