7.11.3 CASE の使用例

基本的な CASE の処理

CASE コマンドを使用する理由

CASE コマンドを OR 演算と組み合わせて使用する

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