You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

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

7.39.2 DOUNTIL の使用例

DOUNTIL . . . ENDUNTILルーチンを実行する
DOUNTIL . . . ENDUNTILを実行して"n"個のレコードをファイルに入力する
DOUNTIL . . . ENDUNTILを実行して"n"個のレコードをファイルに入力する
DOUNTIL . . . ENDUNTILとIF . . . GOTO . . . ENDIFの使用例を比較する
配列索引を使用してDOUNTIL . . . ENDUNTILルーチンを実行する
DOUNTIL . . . ENDUNTILルーチンを実行する
以下は、ループを10回繰り返すDOUNTILおよびENDUNTILの単純な使用例です。
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(#COUNT) REFFLD(#STD_NUM) CHANGE     FIELD(#COUNT) TO(5) DOUNTIL    COND('#COUNT > 1') DISPLAY    FIELDS(#COUNT) ENDUNTIL  
#COUNTは1より大きいですが、ループは1回実行されます。
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)
 
DOUNTILのパラメータでDEF_CONDの値を使用して、わかりやすく保守しやすいコードにする
以下の例では、DOUNTILの実行前に、DEF_CONDコマンドによってDOUNTILコマンドのCONDパラメータが設定されます。
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へのリンク>>コマンドのセクションを参照してください。
DOUNTIL . . . ENDUNTILとIF . . . GOTO . . . ENDIFの使用例を比較する
以下は、DOUNTIL .... ENDUNTILルーチンの単純な使用例です。
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ルーチンを使用した方が簡潔でわかりやすくなります。
配列索引を使用してDOUNTIL . . . ENDUNTILルーチンを実行する
以下は、配列索引を使用したDOUNTIL .... ENDUNTILルーチンの使用例です。このルーチンでは、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) 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]

  • No labels