7.8.3 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
以下のロジックを実装する必要がある場合について考えます。
フィールド#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
このコードの方が短く、分かりやすく、また保守も容易です。
さらに、多くの状況で実行速度が速くなります。
フィールド#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
以下のような数値計算を使用してフィールド#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