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 (&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)))