Page History
[ |../../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 | ||||
|---|---|---|---|---|
|
以下は、ループを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 . . . 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の実行前に、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 .... 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 .... 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 コマンドのセクションを参照してください。
[ |../../index.htm#lansa/dountil_e.htm]