7.11.3 CASE の使用例
CASE コマンドを "=" (等しい) 以外の演算と組み合わせて使用する
基本的な CASE の処理
この例は、最も基本的なタイプの CASE コマンド処理を示しています。
ユーザーが値をフィールド #DEPTMENT に入力し、CASE コマンドによってこのロジックが実装される場合について考えます。
ユーザーがフィールド#DEPTMENT に入力する値 | フィールド #SECTION の変更後の値 . . | 発行されるメッセージ . . . |
|---|---|---|
ADM | A | ADM が入力されました。 |
AUD | B | AUD が入力されました。 |
FLT | C | FLT が入力されました。 |
TRVL | D | TRVL が入力されました。 |
その他の値 | E | その他の値が入力されました。 |
このロジックを実装する CASE コマンドの構造は以下のようになります。
CASE OF_FIELD(#DEPTMENT)
WHEN VALUE_IS('= ADM')
<< Logic >>
WHEN VALUE_IS('= AUD')
<< Logic >>
WHEN VALUE_IS('= FLT')
<< Logic >>
WHEN VALUE_IS('= TRVL')
<< Logic >>
OTHERWISE
<< Logic >>
ENDCASE
このロジックを完全に実装するサンプル・プログラムのコードは以下のようになります。
BEGIN_LOOP
REQUEST FIELDS(#DEPTMENT (#SECTION *OUTPUT))
CASE OF_FIELD(#DEPTMENT)
WHEN VALUE_IS('= ADM')
CHANGE FIELD(#SECTION) TO(A)
MESSAGE MSGTXT('ADM was entered')
WHEN VALUE_IS('= AUD')
CHANGE FIELD(#SECTION) TO(B)
MESSAGE MSGTXT('AUD was entered')
WHEN VALUE_IS('= FLT')
CHANGE FIELD(#SECTION) TO(C)
MESSAGE MSGTXT('FLT was entered')
WHEN VALUE_IS('= TRVL')
CHANGE FIELD(#SECTION) TO(D)
MESSAGE MSGTXT('TRVL was entered')
OTHERWISE
CHANGE FIELD(#SECTION) TO(E)
MESSAGE MSGTXT('Other value was entered')
ENDCASE
END_LOOP
CASE コマンドを使用する理由
以下のロジックを実装する必要がある場合について考えます。
フィールド #DEPTMENT の値 | フィールド #SECTION の変更後の値 | 発行されるメッセージ |
|---|---|---|
ADM または FLT またはTRVL | A | ADM、FLT、またはTRVL が入力されました。 |
AUD または INF または MKT | B | AUD、INF、または MKTが入力されました。 |
その他の値 | C | その他の値が入力されました。 |
コードで IF-ELSE-END ブロックをネストした場合、最終的なロジックは以下のようになります。
IF COND('(#DEPTMENT = ADM) or (#DEPTMENT = FLT) or (#DEPTMENT = TRVL)')
CHANGE FIELD(#SECTION) TO(A)
MESSAGE MSGTXT('Either ADM , FLT or TRVL was entered')
ELSE
IF COND('(#DEPTMENT = AUD) or (#DEPTMENT = INF) or (#DEPTMENT = MKT)')
CHANGE FIELD(#SECTION) TO(B)
MESSAGE MSGTXT('Either AUD, INF or MKT was entered')
ELSE
CHANGE FIELD(#SECTION) TO(C)
MESSAGE MSGTXT('Other value was entered')
ENDIF
ENDIFここで、CASE コマンドを使用すると、以下のようにコード化することができます。
CASE OF_FIELD(#DEPTMENT)
WHEN VALUE_IS('= ADM' '= FLT' '= TRVL')
CHANGE FIELD(#SECTION) TO(A)
MESSAGE MSGTXT('Either ADM, FLT or TRVL was entered')
WHEN VALUE_IS('= AUD' '= INF' '= MKT')
CHANGE FIELD(#SECTION) TO(B)
MESSAGE MSGTXT('Either AUD, INF or MKT was entered')
OTHERWISE
CHANGE FIELD(#SECTION) TO(C)
MESSAGE MSGTXT('Other value was entered')
ENDCASE
このコードの方が短く、分かりやすく、また保守も容易です。
さらに、多くの状況で実行速度が速くなります。
CASE コマンドを OR 演算と組み合わせて使用する
フィールド #TEST に A または B または C が保持されているときに、特定の操作を実行する必要がある場合について考えます。
また、このフィールドに X または Y または Z が保持されている場合は、他の操作を実行する必要があります。
その他の値が保持されている場合は、さらに別の操作を実行する必要があります。
以下のような構造の CASE コマンドを使用すると、必要なロジックを実装できます。
CASE OF_FIELD(#TEST)
WHEN VALUE_IS('= A' '= B' '= C')
<< Logic Block 1 >>
WHEN VALUE_IS('= X' '= Y' '= Z')
<< Logic Block 2>>
OTHERWISE
<< Logic Block 3>>
ENDCASE
CASE コマンドを "=" (等しい) 以外の演算と組み合わせて使用する
以下の規則に従って、フィールド #COPIES の妥当性検査を実行する必要がある場合について考えます。
#COPIES の値 | 発行するメッセージ |
|---|---|
= 0 | 値 0 は無効です。 |
< 0 | 値が負です。 |
1~50 | 値は適切です。 |
> 50 | 値が正しくない可能性があります。 |
この場合、CASE コマンドを以下のように使用できます。
DEFINE FIELD(#COPIES) TYPE(*DEC) LENGTH(3) DECIMALS(0) EDIT_CODE(N) DEFAULT(+1)
BEGIN_LOOP
REQUEST FIELDS(#COPIES)
CASE OF_FIELD(#COPIES)
WHEN VALUE_IS('= 0')
MESSAGE MSGTXT('Value of zero is invalid')
WHEN VALUE_IS('< 0')
MESSAGE MSGTXT('Value is negative')
WHEN VALUE_IS('<= 50')
MESSAGE MSGTXT('Value is sensible')
OTHERWISE
MESSAGE MSGTXT('Value is probably incorrect')
ENDCASE
END_LOOP
CASE コマンドを複合式と組み合わせて使用する
以下のような数値計算を使用してフィールド #DISCOUNT の妥当性検査を実行する必要がある状況について考えます。
ユーザーがフィールド#DISCOUNT、#QUANTITY に入力する値 | 割引値の妥当性検査に使用する式 | 表示されるメッセージ |
|---|---|---|
1000, 20 | #QUANTITY * 0.1 | 割引値が QUANTITY×0.1 を超えています。 |
10, 200 | #QUANTITY * 0.1 | 割引値は QUANTITY×0.1 未満です。 |
10, 100 | #QUANTITY * 0.1 | 正しい割引値が入力されました。 |
これは、CASE コマンドを使用して以下のようにコード化できます。
DEFINE FIELD(#DISCOUNT) TYPE(*DEC) LENGTH(11) DECIMALS(2) EDIT_CODE(1)
DEFINE FIELD(#QUANTITY) TYPE(*DEC) LENGTH(3) DECIMALS(0)
BEGIN_LOOP
REQUEST FIELDS(#DISCOUNT #QUANTITY)
CASE OF_FIELD(#DISCOUNT)
WHEN VALUE_IS('> (#QUANTITY * 0.1)')
MESSAGE MSGTXT('Discount value is larger than quantity times 0.1')
WHEN VALUE_IS('< (#QUANTITY * 0.1)')
MESSAGE MSGTXT('Discount value is less than quantity times 0.1')
OTHERWISE
MESSAGE MSGTXT('A correct discount value was entered')
ENDCASE
END_LOOP