7.38.2 DOWHILE の使用例

DOWHILE . . . ENDWHILEルーチンを実行する

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

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

DOWHILE . . . ENDWHILEとIF . . . GOTO . . . ENDIFの使用例を比較する

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

DOWHILE . . . ENDWHILEルーチンを実行する

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

DEFINE     FIELD(#COUNT) REFFLD(#STD_NUM)
CHANGE     FIELD(#COUNT) TO(1)
DOWHILE    COND('#COUNT <= 10')
DISPLAY    FIELDS(#COUNT)
CHANGE     FIELD(#COUNT) TO('#COUNT + 1')
ENDWHILE
 

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

DOWHILE . . . ENDWHILEを実行して"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)
DOWHILE    COND('#COUNT <= 10')
DISPLAY    FIELDS(#COUNT)
REQUEST    FIELDS(#EMPNO #SURNAME #SALARY)
ADD_ENTRY  TO_LIST(#WORKER)
CHANGE     FIELD(#COUNT) TO('#COUNT + 1')
ENDWHILE   
DISPLAY    BROWSELIST(#WORKER)
 

 

Ý  Back to top

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

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

DEFINE     FIELD(#COUNT) REFFLD(#STD_NUM)
DEF_COND   NAME(*COUNT_TEN) COND('#COUNT <= 10')
CHANGE     FIELD(#COUNT) TO(1)
DOWHILE    COND(*COUNT_TEN)
DISPLAY    FIELDS(#COUNT)
CHANGE     FIELD(#COUNT) TO('#COUNT + 1')
ENDWHILE
 

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

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

DOWHILE . . . ENDWHILEとIF . . . GOTO . . . ENDIFの使用例を比較する

以下は、DOWHILE .... ENDWHILEルーチンの単純な使用例です。

 DOWHILE    COND('#A < B')
           << logic >>
           << logic >>
           << logic >>
ENDWHILE
 

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

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

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

Ý  Back to top

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

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

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)
DOWHILE    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')
ENDWHILE   
DISPLAY FIELDS(#TOTAL)
 

Ý  Back to top

配列索引の詳細については、7.20 DEF_ARRAY コマンドのセクションを参照してください。