CL 程式或程序中的內嵌 IF 指令

If (IF) 指令可以內嵌在另一個 IF 指令中。

附註: 使用程式碼範例,即表示您同意 程式碼授權及免責聲明資訊的條款。

當要在 true 評估下處理的指令 (放置在 THEN 參數上的 CL 指令) 本身是另一個 IF 指令時,即會內嵌 IF 指令:


IF (&A=&B) THEN(IF (&C=&D) THEN(GOTO END))
GOTO START

當在執行特定指令或指令群組之前必須滿足數個條件時,這可能很有用。 在前述範例中,如果第一個表示式為 true ,則系統會讀取第一個 THEN 參數; 在該範例中,如果 &C=&D 表示式評估為 true ,則系統會處理第二個 THEN 參數 (GOTO END) 中的指令。 這兩個表示式都必須為 true ,才能處理 GOTO END 指令。 如果其中一個或另一個為 false ,則會執行 GOTO START 指令。 請注意使用括弧來組織表示式和指令。

在 CL 程式設計中允許最多 25 個層次的此類內嵌。

當內嵌層次增加且邏輯變得更複雜時,您可能想要以開放式設計來輸入程式碼,以釐清關係:


PGM
DCL &A *DEC 1
DCL &B *CHAR 2
DCL &RESP *DEC 1
IF (&RESP=1) +
    IF (&A=5) +
          IF (&B=NO) THEN(DO)
                       .
                       .
                       .
                       ENDDO
CHGVAR &A VALUE(8)
CALL PGM(DAILY)
ENDPGM

之前的 IF 系列會當成一個內嵌指令來處理。 只要任何一個 IF 條件失敗,就會處理分支至程式碼的其餘部分 (Change Variable (CHGVAR) 及後續指令)。 如果此程式碼的目的是累積一系列條件,所有條件都必須為 true 才能處理 Do 群組,則在一個指令中使用具有數個表示式的 *AND 更容易對其進行編碼。

不過,在某些情況下,分支必須根據失敗的條件而不同。 您可以為每一個內嵌的 IF 指令新增 ELSE 指令來達成此目的:


PGM
DCL &A ...
DCL &B ...
DCL &RESP ...
IF (&RESP=1) +
      IF (&A=5) +
             IF (&B=NO) THEN(DO)
                           .
                           .
                           .
                           SNDPGMMSG ...
                           .
                           .
                           .
                          ENDDO
             ELSE CALLPRC PROCA
      ELSE CALLPRC PROCB
CHGVAR &A 8
CALLPRC PROC(DAILY)
ENDPGM

在這裡,如果所有條件都是 true ,則會處理 Send Program Message (SNDPGMMSG) 指令,後面接著 Change Variable (CHGVAR) 指令。 如果第一個及第二個條件 (&RESP=1&A=5) 為 true ,但第三個條件 (&B=NO) 為 false ,則會呼叫 PROCA; 當 PROCA 傳回時,會處理 CHGVAR 指令。 如果第二個條件失敗,則會呼叫 PROCB (未測試&B=NO ) ,後面接著 CHGVAR 指令。 Finally, if &RESP does not equal 1, the CHGVAR command is immediately processed. ELSE 指令已用來為每一個測試提供不同的分支。

附註: 下列三個範例是前述範例中內嵌 IF 指令的正確語法對等項目:

IF (&RESP=1) THEN(IF (&A=5) THEN(IF (&B=NO) THEN(DO)))
 
IF (&RESP=1) THEN +
           (IF (&A=5) THEN +
                         (IF (&B=NO) THEN(DO)))
 
IF (&RESP=1) +
        (IF (&A=5) +
              (IF (&B=NO) THEN(DO)))