Versions Compared

Key

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

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

...

7.39.2 DOUNTIL の使用例

DOUNTIL . . . ENDUNTILルーチンを実行する

DOUNTIL . . . ENDUNTILを実行して"n"個のレコードをファイルに入力する DOUNTIL . . . ENDUNTILを実行して"n"個のレコードをファイルに入力する

DOUNTILのパラメータでDEF_CONDの値を使用して、わかりやすく保守しやすいコードにする

DOUNTIL . . . ENDUNTILとIF . . . GOTO . . . ENDIFの使用例を比較する

配列索引を使用してDOUNTIL . . . ENDUNTILルーチンを実行する

Anchor
DOUNTIL_EX1
DOUNTIL_EX1
DOUNTIL . . . ENDUNTILルーチンを実行する

以下は、ループを10回繰り返すDOUNTILおよびENDUNTILの単純な使用例です。 DEFINE     FIELD

   DEFINE     FIELD(#COUNT)

...

 REFFLD(#STD_NUM)

...


CHANGE     FIELD(#COUNT)

...

 TO(1)

...


DOUNTIL    COND('

...

#COUNT > 10')

...


DISPLAY    FIELDS(#COUNT)

...


CHANGE     FIELD(#COUNT)

...

 TO('

...

#COUNT +

...

 1')
ENDUNTIL

...

DOUNTILコマンドの構造は、DOWHILEコマンドの構造に似ていますが、重要な違いが1つあります。DOUNTILコマンドでは、最初の反復の実行前に条件が検査されません。以下はその例です。 DEFINE     FIELD

   DEFINE     FIELD(#COUNT)

...

 REFFLD(#STD_NUM)

...


CHANGE     FIELD(#COUNT)

...

 TO(5)

...


DOUNTIL    COND('

...

#COUNT > 1')

...


DISPLAY    FIELDS(#COUNT)
ENDUNTIL

...

#COUNTは1より大きいですが、ループは1回実行されます。

Anchor
DOUNTIL_EX2
DOUNTIL_EX2

...

DOUNTIL . . . ENDUNTILを実行して"n"個のレコードをファイルに入力する

以下の例では、10名の従業員の詳細がファイルに挿入されます。

   GROUP_

...

BY   NAME(#EMPDET)

...

 FIELDS(#EMPNO #SURNAME #SALARY)
DEFINE     FIELD(#COUNT)

...

 REFFLD(#STD_NUM)
DEF_

...

LIST   NAME(#WORKER)

...

 FIELDS(#EMPNO #SURNAME #SALARY)
CHANGE     FIELD(#COUNT)

...

 TO(1)

...


DOUNTIL    COND('

...

#COUNT > 10')

...


DISPLAY    FIELDS(#COUNT)

...


proREQUEST    FIELDS(#EMPNO #SURNAME #SALARY)
ADD_ENTRY  TO_LIST(#WORKER)

...


CHANGE     FIELD(#COUNT)

...

 TO('

...

#COUNT +

...

 1')

...


ENDUNTIL 
DISPLAY    BROWSELIST(#WORKER)

...

  

Anchor
DOUNTIL_EX3
DOUNTIL_EX3
DOUNTILのパラメータでDEF_CONDの値を使用して、わかりやすく保守しやすいコードにする

以下の例では、DOUNTILの実行前に、DEF_CONDコマンドによってDOUNTILコマンドのCONDパラメータが設定されます。 DEFINE     FIELD

   DEFINE     FIELD(#COUNT)

...

 REFFLD(#STD_NUM)
DEF_

...

COND   NAME(*COUNT_TEN)

...

 COND('

...

#COUNT > 10')

...


CHANGE     FIELD(#COUNT)

...

 TO(1)

...


DOUNTIL    COND(*COUNT_TEN)

...


DISPLAY    FIELDS(#COUNT)

...


CHANGE     FIELD(#COUNT)

...

 TO('

...

#COUNT +

...

 1')
ENDUNTIL

...

DEF_CONDを使用すると、プログラマは、複雑な条件に、条件の検査理由を示す意味のあるラベルを付けることができます。これにより、他のプログラマがDOWHILEステートメントを見たときに、意味のあるラベルからそのステートメントの目的を理解することができます。

また、DEF_CONDを使用すると、ファンクション内で同じ条件が複数回参照される場合にも役立ちます。この場合、コード量が少なくなり、条件を容易に保守できるようになります。詳細については、<<DEF_CONDへのリンク>>コマンドのセクションを参照してください。

Anchor
DOUNTIL_EX4
DOUNTIL_EX4
DOUNTIL . . . ENDUNTILとIF . . . GOTO . . . ENDIFの使用例を比較する

以下は、DOUNTIL .... ENDUNTILルーチンの単純な使用例です。 DOUNTIL    COND

   DOUNTIL    COND('

...

#A >= B')
           << logic >>
           << logic >>
           << logic >>
ENDUNTIL

ここで、上記の例を、以下のIF .... GOTO .... ENDIFルーチンの使用例と比較します。

   L01:

...

 IF         COND('

...

#A < B')
          << logic >>
          << logic >>
           << logic >>
GOTO       LABEL(L01)
ENDIF

単純なループの場合、IF .... GOTO .... ENDIFルーチンを使用するよりDOUNTIL .... ENDUNTILルーチンを使用した方が簡潔でわかりやすくなります。

Anchor
DOUNTIL_EX5
DOUNTIL_EX5
配列索引を使用してDOUNTIL . . . ENDUNTILルーチンを実行する

以下は、配列索引を使用したDOUNTIL .... ENDUNTILルーチンの使用例です。このルーチンでは、3つのフィールド値を1つの配列にグループ化し、それぞれを10%増加させ、結果の値を合計して表示します。 DEFINE     FIELD

   DEFINE     FIELD(#VAL1)

...

 REFFLD(#STD_NUM)

...


DEFINE     FIELD(#VAL2)

...

 REFFLD(#STD_NUM)

...


DEFINE     FIELD(#VAL3)

...

 REFFLD(#STD_NUM)

...


DEFINE     FIELD(#I1)

...

 REFFLD(#STD_NUM)

...


DEFINE     FIELD(#TOTAL)

...

 TYPE(*DEC)

...

 LENGTH(6)

...

 DECIMALS(2)

...

 LABEL(TOTAL)

...

 EDIT_CODE(3)
DEF_

...

ARRAY  NAME(#ARR)

...

 INDEXES(#I1)

...

 OF_FIELDS(

...

#VAL1 #VAL2 #VAL3)
CHANGE     FIELD(#TOTAL)

...

 TO(1)

...


CHANGE     FIELD(#I1)

...

 TO(1)
REQUEST    FIELDS(#VAL1 #VAL2 #VAL3)
DOUNTIL    COND('#I1 > 3')
CHANGE     FIELD(#ARR#I1) TO('#ARR#I1 * 1.1')
CHANGE     FIELD(#TOTAL) TO('#TOTAL + #ARR#I1')
CHANGE     FIELD(#I1) TO('#I1 + 1')
ENDUNTIL 
DISPLAY FIELDS(#TOTAL)

配列索引の詳細については、7.39 DOUNTIL コマンドのセクションを参照してください。 REQUEST    FIELDS(#VAL1 #VAL2 #VAL3) DOUNTIL    COND('#I1 > 3') CHANGE     FIELD(#ARR#I1) TO('#ARR#I1  1.1') CHANGE     FIELD(#TOTAL) TO('#TOTAL  #ARR#I1') CHANGE     FIELD(#I1) TO('#I1  1') ENDUNTIL    DISPLAY FIELDS(#TOTAL)  
配列索引の詳細については、7.39 DOUNTIL コマンドのセクションを参照してください。
[ Image Removed |../../index.htm#lansa/dountil_e.htm]