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')は、実際には「作業リスト項目内の国コード・フィールドの値が、プログラム内の取得コード・フィールドの値と等しい場合」という意味になります。