Page History
...
7.86.3 LEAVE の使用例
| Anchor | ||||
|---|---|---|---|---|
|
SELECTループ内で1つのレコードを読み取った場合に、これ以上読み取りが必要ないことがあります。この例は、SELECTループ内でLEAVEコマンドを使用して、このような状況に対処する方法を示しています。 SELECTループ内で1つのレコードを読み取った場合に、これ以上読み取りが必要ないことがあります。この例は、SELECTループ内でLEAVEコマンドを使用して、このような状況に対処する方法を示しています。 例えば、価格ファイルが以下のように定義され、以下のプライマリ・キーでソートされているとします。
例えば、価格ファイルが以下のように定義され、以下のプライマリ・キーでソートされているとします。 1. #ITEMNO
- #ITEMNO (昇順)
...
- #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 FIELD2001時点の品目116の価格が必要だとします。 Wiki Markup
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
| Anchor | ||||
|---|---|---|---|---|
|
この例は、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')