Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

[ Image Removed |../../index.htm#lansa/case_e.htm]
現在地:

...

7.11.3 CASE の使用例

基本的な CASE の処理

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

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

CASE コマンドを "=" (等しい) 以外の演算と組み合わせて使用する

CASE コマンドを複合式と組み合わせて使用する

Anchor
CASE_EX1
CASE_EX1
基本的な CASE の処理

この例は、最も基本的なタイプの CASE コマンド処理を示しています。

ユーザーが値をフィールド #DEPTMENT に入力し、CASE コマンドによってこのロジックが実装される場合について考えます。

ユーザーがフィールド#DEPTMENT に入力する値

フィールド #SECTION の変更後の値 . .

発行されるメッセージ . . .

ADM

A

ADM が入力されました。

AUD

B

AUD が入力されました。

FLT

C

FLT が入力されました。

TRVL

D

TRVL が入力されました。

その他の値

E

その他の値が入力されました。

このロジックを実装する CASE コマンドの構造は以下のようになります。 CASE       OF

   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 

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

以下のロジックを実装する必要がある場合について考えます。

フィールド #DEPTMENT の値

フィールド #SECTION の変更後の値

発行されるメッセージ

ADM または FLT またはTRVL

A

ADM、FLT、またはTRVL が入力されました。

AUD または INF または MKT

B

AUD、INF、または MKTが入力されました。

その他の値

C

その他の値が入力されました。

コードで IF-ELSE-END ブロックをネストした場合、最終的なロジックは以下のようになります。 IF         COND

   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

このコードの方が短く、分かりやすく、また保守も容易です。

さらに、多くの状況で実行速度が速くなります。

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

フィールド #TEST に A または B または C が保持されているときに、特定の操作を実行する必要がある場合について考えます。

また、このフィールドに X または Y または Z が保持されている場合は、他の操作を実行する必要があります。

その他の値が保持されている場合は、さらに別の操作を実行する必要があります。

以下のような構造の CASE コマンドを使用すると、必要なロジックを実装できます。 CASE       OF

   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  

Anchor
CASE_EX4
CASE_EX4
CASE コマンドを "=" (等しい) 以外の演算と組み合わせて使用する

以下の規則に従って、フィールド #COPIES の妥当性検査を実行する必要がある場合について考えます。

#COPIES の値

発行するメッセージ

= 0

値 0 は無効です。

< 0

値が負です。

1~50

値は適切です。

> 50

値が正しくない可能性があります。

この場合、CASE コマンドを以下のように使用できます。 DEFINE     FIELD

      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 

Anchor
CASE_EX5
CASE_EX5
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

   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