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 命令が正常に実行された直後に (演算仕様書または出力仕様で) 更新が実行されると、最後に検索されたレコードが更新されます。

ヌル値可能フィールドおよびキーを持つレコードの処理については、データベースのヌル値サポートを参照してください。

詳細については、ファイル命令を参照してください。

注: 命令コード拡張 H、M、および R は、検索引数がリストまたは %KDS() である場合にのみ使用できます。
図 1. ファイル名を指定した 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
図 2. キー・フィールドのリストを使用した CHAIN 命令
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;
図 3. 外部記述ファイルのデータ構造を使用した CHAIN 命令
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;