Как да комбинирам множество оператори If/функции Dlookup?

Имам следния код, който изпълнявам, когато се щракне върху бутон във формуляр:

If DLookup("ECN_Class_I_Change", "ENGINEERING_CHANGE_NOTICE_TABLE", "[ECN_Class_I_Change] = -1") Then
If DLookup("ECN", "ENGINEERING_CHANGE_NOTICE_TABLE", "'ECN' = 'Forms!DRAWING_INFO_FORM!Subform_DRAWING_STATUS!Subform_DRAWING_STATUS_ECN!ECN'") Then
    strMessage = "Change third digit."
    MsgBox strMessage, vbInformation, "Action Required"

    Else

 If DLookup("PCP", "REVIEW_PANEL_TABLE", "[PCP] = -1") Then
 If DLookup("GWSHW_BL", "REVIEW_PANEL_TABLE", "'[GWSHW_BL]' = 'Forms!DRAWING_INFO_FORM!Subform_DRAWING_STATUS!Subform_DRAWING_STATUS_CONFIGURATION_HWCI_BL!BL_HWCI_HWCI'") Then
 If DLookup("GWSHW_HW", "REVIEW_PANEL_TABLE", "'[GWSHW_HW]' = 'Forms!DRAWING_INFO_FORM!Subform_DRAWING_STATUS!Subform_DRAWING_STATUS_CONFIGURATION_HWCI_BL!BL_HWCI_HWCI'") Then
    strMessage = "Change fourth digit - HWCI/BL has been certified."
    MsgBox strMessage, vbInformation, "Action Required"

        Else
          strMessage = "Change fifth digit"
          MsgBox strMessage, vbInformation, "Action Required"

Кодът не хвърля никакви грешки, но не води до очакваното поведение. Доста съм убеден, че проблемът е от комбинирането на множество функции If/Dlookup последователно. Винаги съм кодирал само един по един, така че не съм сигурен как да ги комбинирам, тъй като това не са просто множество критерии на един Dlookup, а множество Dlookup изрази.

Всяка помощ ще бъде високо оценена.

Актуализация на 5.8.2018 г. 16:55 ч. EST Първият раздел на кода вече работи благодарение на предложенията. Все още не мога да накарам тази част да работи:

If Not IsNull(DLookup("PCP", "REVIEW_PANEL_TABLE", "[PCP] = -1")) Then
If Not IsNull(DLookup("GWSHW_BL", "REVIEW_PANEL_TABLE", "GWSHW_BL = " & Me.Subform_DRAWING_STATUS!Subform_DRAWING_STATUS_CONFIGURATION_HWCI_BL!BL_HWCI_BL)) Then
If Not IsNull(DLookup("GWSHW_HW", "REVIEW_PANEL_TABLE", "GWSHW_HW = '" & Me.Subform_DRAWING_STATUS!Subform_DRAWING_STATUS_CONFIGURATION_HWCI_BL!BL_HWCI_HWCI & "'")) Then
   strMessage = "Change fourth digit - HWCI/BL has been certified."
   MsgBox strMessage, vbInformation, "Action Required"

      Else

        strMessage = "Change fifth digit"
        MsgBox strMessage, vbInformation, "Action Required"

При щракване върху бутона не се извършва никакво действие. Както е посочено в коментар, PCP е поле Да/Не, GWSHW BL е петцифрен идентификатор (1.2.0.0.01), а GWS HW HW е акроним от три букви (ABC).


person Sarah    schedule 05.08.2018    source източник
comment
Какво е очакваното поведение?   -  person Rene    schedule 05.08.2018
comment
Обърнете внимание на редакцията на въпроса, за да се покаже по-добър отстъп, за да стане кодът по-разбираем. И редакции на моя отговор може да не сте виждали.   -  person June7    schedule 05.08.2018
comment
Защо отменихте редакциите? Кодът е по-малко разбираем.   -  person June7    schedule 05.08.2018
comment
Как са свързани таблиците ENGINEERING_CHANGE_NOTICE_TABLE и REVIEW_PANEL_TABLE? Има ли полета за ID? Връзка "един към много"?   -  person Parfait    schedule 05.08.2018
comment
Съжалявам, че не исках да отменя редакциите. Имам проблеми с форматирането на секциите с код и с редактирането на публикацията си. За първи път използвам този форум. Очакваното поведение е да се създаде кутия за съобщения въз основа на инструкциите If/Then.   -  person Sarah    schedule 06.08.2018
comment
GWSHW_BL е текст, използвайте текстови разделители.   -  person June7    schedule 06.08.2018
comment
Добавени разделители, все още не работят... :(   -  person Sarah    schedule 06.08.2018


Отговори (1)


DLookup ще върне или стойност, или ако няма съвпадение, Null. Така че If трябва да вземе предвид Null в условен тест:

If IsNull(DLookup("PCP", "REVIEW_PANEL_TABLE", "[PCP] = -1")) Then

or

If Not IsNull(DLookup("PCP", "REVIEW_PANEL_TABLE", "[PCP] = -1")) Then

Не използвайте разделители с апостроф за имена на полета. И вероятно трябва да свърже препратките за контрол на формуляра. Препратка към контролата на контейнера на подформуляра, а не името на формуляра, който съдържа:

If DLookup("ECN", "ENGINEERING_CHANGE_NOTICE_TABLE", "ECN = " & Forms!DRAWING_INFO_FORM!Subform_DRAWING_STATUS!ECN)

Ако ECN е текстово поле, използвайте разделители с апостроф в параметъра:

If DLookup("ECN", "ENGINEERING_CHANGE_NOTICE_TABLE", "ECN = '" & Forms!DRAWING_INFO_FORM!Subform_DRAWING_STATUS!ECN & "'")

Пряк път използвай ме.:

If DLookup("ECN", "ENGINEERING_CHANGE_NOTICE_TABLE", "ECN = '" & Me.Subform_DRAWING_STATUS!ECN & "'")

Препоръчайте именуване на контейнер на подформуляр, различен от обекта, който съдържа, като например ctrStatus, след което:

If DLookup("ECN", "ENGINEERING_CHANGE_NOTICE_TABLE", "ECN = '" & Me.ctrStatus!ECN & "'")

Тези примери препращат към име на поле. Ако искате да препратите към контрола с име като tbxECN:

If DLookup("ECN", "ENGINEERING_CHANGE_NOTICE_TABLE", "ECN = '" & Me.ctrStatus.Form.tbxECN & "'")

person June7    schedule 05.08.2018
comment
Това беше голяма помощ. Добавих If Not IsNull, за да стигна до Dlookup, и използвах за апострофиране на разделители за полето ECN. Обобщавам, използвайки Мен. препратки към текущия формуляр? Все още имам проблеми с трите израза Dlookup, свързани с полетата PCP, HWSHW BL и GWSHW HW... PCP е поле за да/не, GWSHW BL е петцифрен запис (1.2.0.0.00) и GWSHW HW е трибуквен акроним (ABC). Когато стартирам този сегмент от кода, нищо не се случва. - person Sarah; 05.08.2018
comment
Към оригиналния въпрос е добавен актуализиран код. Благодаря ви за цялата ви помощ! - person Sarah; 06.08.2018