CASE コマンドを "=" (等しい) 以外の演算と組み合わせて使用する
この例は、最も基本的なタイプの CASE コマンド処理を示しています。
ユーザーが値をフィールド #DEPTMENT に入力し、CASE コマンドによってこのロジックが実装される場合について考えます。
|
このロジックを実装する 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
以下のロジックを実装する必要がある場合について考えます。
|
コードで 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
このコードの方が短く、分かりやすく、また保守も容易です。
さらに、多くの状況で実行速度が速くなります。
フィールド #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 の妥当性検査を実行する必要がある場合について考えます。
|
この場合、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
以下のような数値計算を使用してフィールド #DISCOUNT の妥当性検査を実行する必要がある状況について考えます。
|
これは、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