7.68.2 LOC_ENTRYの使用例

LANSA

7.68.2 LOC_ENTRYの使用例


例1:#ORDERLINEというリスト内で、数量×価格が1000を超えている最初の項目を見つけます。

DEF_LIST   NAME(#ORDERLINE) FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE) TYPE(*WORKING)
 
LOC_ENTRY IN_LIST(#ORDERLINE) WHERE('(#QUANTITY * #PRICE) *GT 1000')
 

例2:#COUNTRY (国のリスト)という「テーブル・ファイル」は、#CCODE (国コード)、#CMNEM (国の略称)、および#CNAME (国の正式名称)というフィールドで構成されています。作業リストを使用して、このファイルに対するI/Oを最小限にするサブルーチンを作成します(すなわち、FETCHコマンドをLOC_ENTRYコマンドで置き換えます)。

SUBROUTINE NAME(GET_CNTRY) PARMS((#GETCODE *RECEIVED)(#CMNEM *RETURNED) (#CNAME *RETURNED))
 
DEFINE     FIELD(#GETCODE) REFFLD(#CCODE)
DEF_LIST   NAME(#COUNTRIES) FIELDS(#CCODE #CMNEM #CNAME) TYPE(*WORKING) ENTRYS(100)
 
LOC_ENTRY  IN_LIST(#COUNTRIES) WHERE('#CCODE = #GETCODE')
 
IF_STATUS  IS_NOT(*OKAY)
FETCH      FIELDS(#COUNTRIES) FROM_FILE(COUNTRY) WITH_KEY(#GETCODE)
ADD_ENTRY  TO_LIST(#COUNTRIES)
ENDIF
 
ENDROUTINE
 

このルーチンでは、ファイル#COUNTRY内で国コードが見つからない状況が考慮されていないことに注意してください。国が見つかったかどうかに関わらず、項目がリストに追加されます。

また、パラメータ・リストで(#CCODEの代わりに)フィールド#GETCODEを使用していることにも注意してください。このフィールドを使用しない場合、LOC_ENTRYコマンドのWHERE条件をWHERE('#CCODE = #CCODE')として記述する必要がありますが、これは常にtrueのため、常に最初の項目が取得されることになります。

WHERE条件で参照されるフィールドが作業リストの一部である場合、プログラムで認識されている実際のフィールドではなく、作業リスト内のそのフィールドのオカレンスが評価されます。

すなわち、条件WHERE('#CCODE = #GETCODE')は、実際には「作業リスト項目内の国コード・フィールドの値が、プログラム内の取得コード・フィールドの値と等しい場合」という意味になります。