READPE (等しいキーの前のレコードの読み取り)

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

READPE 命令は、レコードのキーが検索引数と一致した場合に、全手順ファ イルから 1 つ前の順次レコードを検索します。レコードのキーが検索引数と一致しない場合には、BOF 条件が発生し、 レコードはプログラムに戻されません。BOF 条件 は、ファイルの先頭になった場合にも適用されます。

検索引数 (検索引数) は、検索するレコードを識別します。 検索引数 オペランドは、従来型の構文においては任意指定ですが、自由形式構文では必須です。 検索引数 は次のいずれかが可能です。
  • フィールド名、リテラル、名前のついた定数、または形象定数
  • 外部記述ファイルの場合は KLIST 名
  • 括弧で囲まれたキー値のリスト。キー値のリストを使用した検索の例については、図 2 を 参照してください。
  • 検索引数はデータ構造のサブフィールドであることを指示する %KDS データ構造内の検索引数の図については、%KDS (データ構造の検索引数)の終わりにある例を参照してください。
  • *KEY または (従来型の構文の場合のみ) 値なし。1 つ前のレコードの全キーが現行レコードの 全キーと等しい場合には、ファイルの 1 つ前のレコードが検索されます。 全キーは、演算項目 2 に使用されたレコード様式またはファイルによって定義されます。

変更の始まりKLIST を 使用して指定されたキーの場合、キー・フィールドはファイル内のキーと同じ CCSID である必要があります。変更の終わり

名前 オペランドは、検索するファイルまたはレコード様式の名前でなければなりません。レコード様式名を使用できるのは、外部記述ファイルの場合だけです。

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

読み取るファイルが更新ディスク・ファイルの場合には、命令拡張 N を指 定して、読み取り時にレコードをロックする必要がないことを指示することがで きます。 詳細については、Rational Development Studio for i ILE RPG プログラマーの手引き を参照してください。

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

BOF 条件が発生した場合、すなわち、検索引数と等しいキーを持つレコードが見付から ないか、またはファイルの先頭になった場合にオンに設定される標識 を 75 から 76 桁目に指定することができます。 この情報は %EOF 組み込み関数からも入手することができます。この関数 は、BOF 条件が発生した場合に '1' を戻します。それ以外の場合には '0' を戻します。

レコード・ロック・エラー (状況コード 1218) が発生した場合、ロックされたレコードにファイルが置かれたままになり、そのレコードの読み取りが次の読み取り操作において再試行されます。 その他の何らかのエラーが発生するか、ファイルの先頭条件が存在する場合には、(CHAIN 命令、SETLL 命令、または SETGT 命令を使用して) ファイルの位置を変更する必要があります。 CHAIN (ファイルからのランダム検索)SETGT (より大きい設定)、または SETLL (下限の設定)を参照してください。

注: ファイルが更新として定義され、N 命令拡張が指定されていない場合、キー値が検索引数と一致しないレコードに対する一時的なレコード・ロックにより、READPE 命令が待たされることがあります。一時的ロックが取得されると、キー値が検索引数に一致しない場合に一時的ロックがリリースされます。

ほとんどの場合、 RPG は、一致するレコードがあるかどうかの判別に一時的レ コード・ロックを取得する必要がないシステム・サポートを使用して READPE を実行できます。 ただし、RPG がこのサポートを使用できない場合があり、その場合は次のレコードを要求してから、READPE 要求でレコードの一致を判別する必要があります。

以下の理由により、RPG は、READPE 命令に対し次のレコードの一時的ロックを取得することを必要とします。
  • 現行レコードのキーが検索引数と一致しない
  • 現行レコードが要求されたレコードと一致しない
  • ファイルにヌル可能フィールドがある
  • 変更の始まりモジュールに ALWNULL(*USRCTL) が指定されている変更の終わり
  • ファイルにファイル終了の遅延がある

通常、指定されたキーとファイル内の実際のキーの比較は、データ管理機能により実行されます。 データ管理機能でこれを実行できない場合は、16 進数照合シーケンスを使用して比較が実行されます。 この場合、予想通りの結果が得られないことがあります。 詳しくは、Rational Development Studio for i ILE RPG プログラマーの手引きのセクション『キー付きファイルの使用による予期しない結果』を参照してください。

OPEN 命令または BOF 条件の直後の READPE に検索引数 オペランドが指定された場合は BOF を戻します。検索引数 が指定されていない、OPEN 命令または BOF 条件の直後の READPE は、エラー条件を招きます。73 桁目 と 74 桁目のエラー標識が指定されている場合、オンに設定されるか、 または %ERROR によって検査される 'E' 拡張が指定されている場合、オンに 設定されます。ファイルは、演算項目 1 がブランクの READPE 命令を出す前に、検索引数 が指定された CHAIN、SETLL、READ、READE、または READP を使用して再度位置決めされなければなりません。 READPE (検索引数 を指定しないで) を出す前に SETGT 命令コードを使用してファイルの位置決めを行うと該当レコードなしの状況になります。 そのような使い方はしないでください (SETGT が出された後では、現行レコードの前のレコードが現行レコードと同じキーを持つことはないからです)。 両方の命令コードに同じキーを使用して検索引数 を指定した場合は、このエラー状況は生じません。

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

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

注: 命令コード拡張 H、M、および R は、検索引数がリストまたは %KDS() である場合にのみ使用できます。
図 1. READPE 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * With Factor 1 Specified...
 *
 * The previous record is read and the key compared to FieldA.
 * Indicator 99 is set on if the record's key does not match
 * FieldA.
C     FieldA        READPE    FileA                                  99
 *
 * The previous record is read from FileB and the key compared
 * to FieldB.  The record is placed in data structure Ds1.  IF/THEN
 * the record key does not match FieldB, indicator 99 is set on.
C     FieldB        READPE    FileB         Ds1                      99
 *
 * The previous record from record format RecA is read, and
 * the key compared to FieldC.  Indicator 88 is set on if the
 * operation is not completed successfully, and 99 is set on if
 * the record key does not match FieldC.
C     FieldC        READPE    RecA                                 8899
 *
 * With No Factor 1 Specified...
 *
 * The previous record in the access path is retrieved if its
 * key value equals the key value of the current record.
 * Indicator 99 is set on if the key values are not equal.
C                   READPE    FileA                                  99
 *
 * The previous record is retrieved from FileB if its key value
 * matches the key value of the record at the current position
 * in the file.  The record is placed in data structure Ds1.
 * Indicator 99 is set on if the key values are not equal.
C                   READPE    FileB         Ds1                      99
 *
 * The previous record from record format RecA is retrieved if
 * its key value matches the key value of the current record in
 * the access path.  Indicator 88 is set on if the operation is
 * not successful; 99 is set on if the key values are unequal.
C                   READPE    RecA                                 8899