CHAIN (ファイルからのランダム検索)
自由形式構文 | CHAIN{(ENHMR) } 検索引数 名前 {データ構造 } |
コード | 演算項目 1 | 演算項目 2 | 結果フィールド | 標識 | ||
---|---|---|---|---|---|---|
CHAIN (E N) | 検索引数 | 名前 (ファイルまたはレコード様式) | データ構造 | NR | ER | _ |
CHAIN 命令は、全手順ファイルからレコードを取り出し、レコード識別標識を オンに設定し (入力仕様に指定された場合)、レコードのデータを入力フィールドに 入れます。
検索引数 (検索引数) は、レコードの検索に使用するキーまたは相対レコード番号でなければなりません。 アクセスがキーによる場合には、検索引数 はフィールド名、名前の付いた固定情報、 形象定数、またはリテラルの形式の単一キーにすることができます。
ファイルが外部記述ファイルの場合、検索引数 は KLIST 名、値のリスト、または %KDS の形式の複合キーにすることもできます。KLIST を 使用して指定されたキーの場合、キー・フィールドはファイル内のキーと同じ CCSID である必要があります。%KDS の例については、%KDS (データ構造の検索引数)の終わりにある例を参照してください。 アクセスが相対レコード番号による場合には、検索引数 に整数のリテラルまたは小数点以下の桁数がゼロの数値フィールドを入れなければなりません。
名前 オペランドには、読み取るファイルまたはレコード様式の名前を指定します。レコード様式名を使用できるのは、外部記述ファイルの場合だけのみです。ファイル名が 名前 に指定されていてアクセスがキーによる場合には、CHAIN 命令によって検索引数と一致する最初のレコードが検索されます。
名前 がレコード様式名でアクセスがキーによる場合には、CHAIN 命令によってそのキーが検索引数と一致する指定されたレコード・タイプの最初のレコードが検索されます。検索引数と一致する指定されたレコード・タイプの レコードが見付からない場合には、該当レコードなしの状況になります。
データ構造 オペランドが指定されている場合、レコードはデータ構造に直接読み込まれます。 名前 がプログラム記述 ファイルを参照する場合、データ構造は、 宣言されたファイルのレコード長と同じ長さの任意のデータ構造にできます。 名前 が外部記述ファイルまたは外部記述ファイルのレコード様式を参照する場合、データ構造は EXTNAME(...:*INPUT or *ALL) または LIKEREC(...:*INPUT or *ALL) で定義されているデータ構造にする必要があります。 データ構造の定義方法、およびファイルとデータ 構造の間でどのようにデータが転送されるかについては、ファイル命令を参照してください。
ワークステーション・ファイルの場合には、CHAIN 命令によってサブファイル・レコードが 検索されます。
複数装置ファイルの場合には、名前 オペランドにレコード様式を指定しなければなりません。データは、DEVID(フィールド名)装置ファイルのファイル仕様書の キーワードに指定されたフィールド名で識別されるプログラム装置から読み取られます。 このキーワードが指定されていない場合には、データは、ファイルに対して最 後に正常な入力操作が行われた装置から読み取られます。
ファイルが入力 DISK ファイルとして指定されている場合には、すべての レコードはロックなしで読み取られ、そのために命令拡張を指定する ことはできません。 ファイルが更新として指定されている場合には、命令拡張 N が指定されていな ければ、すべてのレコードがロックされます。
更新ディスク・ファイルから読み取っている場合には、命令拡張 N を指定して 読み取り時にレコードをロックしないように (例えば、CHAIN (N)) 指示するこ とができます。 詳細については、Rational Development Studio for i ILE RPG プログラマーの手引き を参照してください。
ファイルに検索引数と一致するレコードがない場合にオンに設定される標識 を 71 から 72 桁目に指定することができます。 この情報は %FOUND 組み込み関数 からも入手することができます。この関数は、レコードが見付からない場合は '0' を 戻し、レコードが見付かった場合は '1' を戻します。
CHAIN 例外 (ファイル状況コードが 1000 より大きい) を 処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラー処理の詳細については、ファイル例外/エラーを 参照してください。
75 桁目と 76 桁目はブランクでなければなりません。
CHAIN 命令が正常に実行された場合には、名前 に指定されたファイルは、以後の読み取り操作で論理的に検索済みレコードの後または前にあるレコードが検索されるように位置付けられます。CHAIN 命令が正常に完了しなかった場合 (例えば、エラーが起こったりレコードが見付からなかった場合) には、名前 に指定されたファイルは、そのファイルに対しての次の読み取り操作が実行される前に (例えば、CHAIN または SETLL 命令によって) 再度位置決めされなければなりません。
名前 に指定されたファイルに、そのファイルへの CHAIN 命令が正常に実行された直後に (演算仕様書または出力仕様で) 更新が実行されると、最後に検索されたレコードが更新されます。
ヌル値可能フィールドおよびキーを持つレコードの処理については、データベースのヌル値サポートを参照してください。
詳細については、ファイル命令を参照してください。
*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
*
* CHAIN 命令は、ファイル
* FILEX から、キー・フィールドが検索引数
* KEY (演算項目 1) と同じ値の最初のレコードを検索します。
/FREE
CHAIN KEY FILEX;
// キー値が検索引数と等しいレコードが見付からない場合、
// %FOUND は ’0’ を戻し、EXSR 命令が処理されます。
// キー値が検索引数と等しいレコードが見付かった場合、
// プログラムは、
// EXSR 命令の後の演算から続行します。
IF NOT %FOUND;
EXSR Not_Found;
ENDIF;
/END-FREE
FFilename++IPEASF.....L.....A.Device+.Keywords+++++++++++++++++++++++++
FCUSTFILE IF E K DISK
/free
// 検索キーを直接リスト内で指定します
chain ('abc' : 'AB') custrec;
// キーのリストで式を使用することができます
chain (%xlate(custname : LO : UP) : companyCode + partCode)
custrec;
return;
FFilename++IPEASF.....L.....A.Device+.Keywords+++++++++++++++++++++++++
FCUSTFILE IF E K DISK
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
D custRecDs ds likerec(custRec)
/free
// レコードを直接データ構造に読み込みます
chain ('abc' : 'AB') custRec custRecDs;
// データ構造フィールドを使用します
if (custRecDs.code = *BLANKS);
custRecDs.code = getCompanyCode (custRecDs);
update custRec custRecDs;
endif;