CHAIN (ファイルからのランダム検索)

自由形式構文 CHAIN{(ENHMR)} 検索引数 名前 {データ構造}
コード 演算項目 1 演算項目 2 結果フィールド 標識
CHAIN (E N) 検索引数 名前 (ファイルまたはレコード様式) データ構造 NR ER _

CHAIN 命令は、全手順ファイル (ファイル仕様書の 18 桁目に F) から レコードを検索し、レコード識別標識を オンに設定 (入力仕様書に指定された場合) して、 レコードのデータを入力 フィールドに入れます。

検索引数 (検索引数) は、レコードの検索に使用するキーまたは相対レコード番号でなければなりません。アクセスがキーによる場 合には、検索引数 はフィールド名、名前の付いた定数、形象定数、またはリテラルの形式の単一キーにすることができます。

ファイルが外部記述ファイルの場合、検索引数 は KLIST 名、値のリスト、または %KDS の形式の複合キーにすることもできます。図形および UCS-2 のキー・フィールド には、そのファイル内のキーと同じ CCSID がなければなりません。 %KDS の例については、%KDS (データ構造の検索引数)の終わりにある例を参照してください。 アクセスが相対レコード番号による場合には、検索引数 に整数のリテラルまたは小数点以下の桁数がゼロの数値フィールドを入れなけ ればなりません。

名前 オペランドには、読み取るファイルまたはレコード様式の名前を指定します。レコード様式名を使用できるのは、外部記述ファイルの場合だけのみです。ファイル名が 名前 に指定されていてアクセスがキーによる場合には、CHAIN 命令によって検索引数と一致する最初のレコードが検索されます。

名前 がレコード様式名でアクセスがキーによる場合には、CHAIN 命令によってそのキーが検索引数と一致する指定されたレコード・タイプの最初のレコードが検索されます。検索引数と一致する指定されたレコード・タイプの レコードが見付からない場合には、該当レコードなしの状況になります。

データ構造 オペランドが指定されている場合、レコードはデータ構造に直接読み込まれます。 名前 がプログラム記述ファイル (ファイル記述仕様書の 22 桁目の F によって識別される) を参照する場合、 データ構造は宣言されているファイルのレコード長と同じ長さのデータ構造にすることができます。 名前 が外部記述ファイルまたは外部記述ファイルのレコード様式 を参照する場合、データ構造は EXTNAME(...:*INPUT) または LIKEREC(...:*INPUT) で定義されているデータ構造にする 必要があります。 データ構造の定義方法、およびファイルとデータ 構造の間でどのようにデータが転送されるかについては、ファイル命令を参照してください。

ワークステーション・ファイルの場合には、CHAIN 命令によってサブファイル・レコードが 検索されます。

複数装置ファイルの場合には、名前 オペランドにレコード様式を指定しなければなりません。データは、DEVID(フィールド名)装置ファイルのファイル仕様書の キーワードに指定されたフィールド名で識別されるプログラム装置から読み取られます。 このキーワードが指定されていない場合には、データは、ファイルに対して最 後に正常な入力操作が行われた装置から読み取られます。

ファイルが入力 DISK ファイルとして指定されている場合には、すべての レコードはロックなしで読み取られ、そのために命令拡張を指定する ことはできません。 ファイルが更新として指定されている場合には、命令拡張 N が指定されていな ければ、すべてのレコードがロックされます。

更新ディスク・ファイルから読み取っている場合には、命令拡張 N を指定して 読み取り時にレコードをロックしないように (例えば、CHAIN (N)) 指示するこ とができます。 詳細については、「WebSphere Development Studio: ILE RPG プログラマーの手引き」を参照してください。

ファイルに検索引数と一致するレコードがない場合にオンに設定される標識 を 71 から 72 桁目に指定することができます。 この情報は %FOUND 組み込み関数 からも入手することができます。この関数は、レコードが見付からない場合は '0' を 戻し、レコードが見付かった場合は '1' を戻します。

CHAIN 例外 (ファイル状況コードが 1000 より大きい) を 処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラー処理の詳細については、ファイル例外/エラーを参照してください。

75 桁目と 76 桁目はブランクでなければなりません。

CHAIN 命令が正常に実行された場合には、名前 に指定されたファイルは、以後の読み取り操作で論理的に検索済みレコードの後または前にあるレコードが検索されるように位置付けられます。CHAIN 命令が正常に完了しなかった場合 (例えば、エラーが起こったりレコードが見付からなかった場合) には、名前 に指定されたファイルは、そのファイルに対しての次の読み取り操作が実行される前に (例えば、CHAIN または SETLL 命令によって) 再度位置決めされなければなりません。

名前 に指定されたファイルに、そのファイルへの CHAIN 命令が正常に実行された直後に (演算仕様書または出力仕様書で) 更新が実行されると、最後に検索されたレコードが更新されます。

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

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

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