[
|../../index.htm#lansa/leave_e.htm]
現在地:
SELECTループ内でLEAVEを使用する
BEGIN_LOOPループ内でLEAVEを使用する
SELECTループ内でLEAVEを使用する
SELECTループ内で1つのレコードを読み取った場合に、これ以上読み取りが必要ないことがあります。この例は、SELECTループ内でLEAVEコマンドを使用して、このような状況に対処する方法を示しています。
例えば、価格ファイルが以下のように定義され、以下のプライマリ・キーでソートされているとします。
1. #ITEMNO (昇順)
2. #EFF_DATE (昇順)
品目番号 (パック10進数(7,0)) |
有効日 (パック10進数(8,0)) |
価格($) (パック10進数(9,2)) |
116 |
2000/01/01 |
4.00 |
116 |
2000/07/01 |
4.25 |
116 |
2001/01/01 |
4.50 |
116 |
2001/07/01 |
4.75 |
116 |
2002/01/01 |
5.00 |
請求のため、08/02/2001時点の品目116の価格が必要だとします。
DEFINE FIELD(#REQITEM) REFFLD(#ITEMNO) DEFINE FIELD(#REQDATE) REFFLD(#EFF_DATE) DEFINE FIELD(#PRICEOUT) REFFLD(#PRICE) BEGIN_LOOP REQUEST FIELDS(#REQITEM #REQDATE) CHANGE FIELD(#PRICEOUT) TO(0) EXECUTE SUBROUTINE(GETPRICE) WITH_PARMS(#REQITEM #REQDATE #PRICEOUT) DISPLAY FIELDS(#REQITEM #PRICEOUT) END_LOOP SUBROUTINE NAME(GETPRICE) PARMS((#REQITEM *RECEIVED) (#REQDATE *RECEIVED) (#PRICEOUT *RETURNED)) SELECT FIELDS(#ITEMNO #EFF_DATE #PRICE) FROM_FILE(PRICING) WHERE('#ITEMNO = #REQITEM') WITH_KEY(#REQITEM #REQDATE) OPTIONS(*BACKWARDS *STARTKEY *ENDWHERE) CHANGE FIELD(#PRICEOUT) TO(#PRICE) LEAVE ENDSELECT ENDROUTINE
SELECTは、有効日が要求の日付以前の価格レコードを見つけ、そのレコードを読み取ります。該当するレコードが見つかった場合、#PRICEの値が#PRICEOUTに移動されます。必要なレコードが見つかった場合はこれ以上価格レコードを読み取り続ける必要がないため、LEAVEによってSELECTループを終了します。
要求された日付以前の、要求された品目のレコードが見つからない場合、#PRICEOUTの値は0のままです。
または、特定の日付「時点」のレコードを要求する代わりに、今日の日付を自動的に使用することもできます。
DEFINE FIELD(#REQITEM) REFFLD(#ITEMNO) DEFINE FIELD(#PRICEOUT) REFFLD(#PRICE) BEGIN_LOOP REQUEST FIELDS(#REQITEM) CHANGE FIELD(#PRICEOUT) TO(0) EXECUTE SUBROUTINE(GETPRICE) WITH_PARMS(#REQITEM #PRICEOUT) DISPLAY FIELDS(#REQITEM #PRICEOUT) END_LOOP SUBROUTINE NAME(GETPRICE) PARMS((#REQITEM *RECEIVED)(#PRICEOUT *RETURNED)) SELECT FIELDS(#ITEMNO #EFF_DATE #PRICE) FROM_FILE(PRICING) WHERE('#ITEMNO = #REQITEM') WITH_KEY(#REQITEM *YYYYMMDD) OPTIONS(*BACKWARDS *STARTKEY *ENDWHERE) CHANGE FIELD(#PRICEOUT) TO(#PRICE) LEAVE ENDSELECT ENDROUTINE
<ac:structured-macro ac:name="anchor" ac:schema-version="1" ac:macro-id="d3ca4df0-ae43-4e86-8506-1340b787c9e4"><ac:parameter ac:name="">LEAVE_EX2</ac:parameter></ac:structured-macro>BEGIN_LOOPループ内でLEAVEを使用する
この例は、BEGIN_LOOPループ内でLEAVEコマンドを使用する方法を示しています。追加のユーザー・ファンクション・キーと定義済みの条件を利用することで、ユーザーが\[終了\]キーを押したときにLEAVEコマンドによってループを終了することができます。
DEF_COND NAME(*FINISHED) COND('#IO$KEY = ''09''') DEF_LIST NAME(#EMPBROWSE) FIELDS(#EMPNO #SURNAME #GIVENAME) BEGIN_LOOP REQUEST FIELDS(#EMPNO #SURNAME #GIVENAME) BROWSELIST(#EMPBROWSE) USER_KEYS((09 'Finish')) LEAVE IF(*FINISHED) ADD_ENTRY TO_LIST(#EMPBROWSE) END_LOOP MESSAGE MSGTXT('Input of Employees Completed')
[ !worddavaf485e25f57cd86bb5b0fc63f3f1b1cc.png|height=32,width=32! |../../index.htm#lansa/leave_e.htm] |