7.8.3 CASEの使用例

LANSA

7.8.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