Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

7.86.3 LEAVE の使用例

SELECTループ内でLEAVEを使用する

BEGIN_LOOPループ内でLEAVEを使用する

Anchor
LEAVE_EX1
LEAVE_EX1
SELECTループ内でLEAVEを使用する

SELECTループ内で1つのレコードを読み取った場合に、これ以上読み取りが必要ないことがあります。この例は、SELECTループ内でLEAVEコマンドを使用して、このような状況に対処する方法を示しています。 SELECTループ内で1つのレコードを読み取った場合に、これ以上読み取りが必要ないことがあります。この例は、SELECTループ内でLEAVEコマンドを使用して、このような状況に対処する方法を示しています。  例えば、価格ファイルが以下のように定義され、以下のプライマリ・キーでソートされているとします。

例えば、価格ファイルが以下のように定義され、以下のプライマリ・キーでソートされているとします。  1.   #ITEMNO

  1. #ITEMNO (昇順) 

...

  1. #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

Wiki Markup請求のため、08/02/2001時点の品目116の価格が必要だとします。 DEFINE     FIELD2001時点の品目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

Anchor
Using LEAVE within a BEGIN_LOO loop
Using LEAVE within a BEGIN_LOO loop
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')