Page History
[ |../../index.htm#lansa/dowhile_e.htm]
現在地:
...
7.40.2 DOWHILE の使用例
DOWHILE . . . ENDWHILEルーチンを実行する
DOWHILE . . . ENDWHILEを実行して"n"個のレコードをファイルに入力する
DOWHILEのパラメータでDEF_CONDの値を使用して、わかりやすく保守しやすいコードにする
DOWHILE . . . ENDWHILEとIF . . . GOTO . . . ENDIFの使用例を比較する
配列索引を使用してDOWHILE . . . ENDWHILEルーチンを実行する
| Anchor | ||||
|---|---|---|---|---|
|
以下は、ループを10回繰り返すDOWHILEおよびENDWHILEの単純な使用例です。
| Code Block |
|---|
...
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コマンドでは、最初の反復の実行前に条件が検査されます。
| Anchor | ||||
|---|---|---|---|---|
|
以下の例では、10名の従業員の詳細がファイルに挿入されます。
| Code Block |
|---|
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) |
...
| Anchor | ||||
|---|---|---|---|---|
|
以下の例では、DOWHILEの実行前に、DEF_CONDコマンドによってDOWHILEコマンドのCONDパラメータが設定されます。
| Code Block |
|---|
...
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コマンドのセクションを参照してください。 コマンドのセクションを参照してください。
| Anchor | ||||
|---|---|---|---|---|
|
以下は、DOWHILE .... ENDWHILEルーチンの単純な使用例です。
| Code Block |
|---|
...
DOWHILE COND(' |
...
#A < B')
<< logic >>
<< logic >>
<< logic >>
ENDWHILE |
ここで、上記の例を、以下のIF .... GOTO .... ENDIFルーチンの使用例と比較します。
| Code Block |
|---|
L01: |
...
IF COND(' |
...
#A < B') << logic >> << logic >> << logic >> GOTO LABEL(L01) ENDIF |
...
単純なループの場合、IF .... GOTO .... ENDIFルーチンを使用するよりDOWHILE .... ENDWHILEルーチンを使用した方が簡潔でわかりやすくなります。
| Anchor | ||||
|---|---|---|---|---|
|
以下は、配列索引を使用したDOWHILE .... ENDWHILEルーチンの使用例です。このルーチンでは、3つのフィールド値を1つの配列にグループ化し、それぞれを10%増加させ、結果の値を合計して表示します。
| Code Block |
|---|
...
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) |
配列索引の詳細については、7.20 DEF_ARRAYコマンドのセクションを参照してください。
[ |../../index.htm#lansa/dowhile_e.htm] コマンドのセクションを参照してください。