UPDATE (既存のレコードの変更)

自由形式構文 UPDATE{(E) } 名前 {データ構造 | %FIELDS(名前{:名前... }) }
コード 演算項目 1 演算項目 2 結果フィールド 標識
UPDATE (E)   名前 (ファイルまたはレコード様式) データ構造 _ ER _

UPDATE 命令は、更新ディスク・ファイルまたはサブファイルから処理用に 検索された、最後にロックされたレコードを修正します。 レコードを検索する入力操作から UPDATE 命令までの間に、他の操作を実行し てはいけません。

名前 オペランドは、更新するファイルまたはレコード様式の名前でなければなりません。 外部記述ファイルの場合には、レコード様式名が必要です。レコード様式名は、ファイルから読み取られる最後のレコードの名前でなけれ ばなりません。そうでない場合にはエラーが起こります。 プログラム記述ファイルの場合には、名前 オペランドとしてファイル名が必要です。

データ構造オペランドが指定されている場合、レコードはデータ構造から直接更新されます。 データ構造は、以下の規則に準拠する必要があります。
  1. データ構造 オペランドが指定されている場合、 レコードはデータ構造から直接更新されます。
  2. 名前 が プログラム記述ファイルを参照する場合、データ構造は、 宣言されたファイルのレコード長と同じ長さの任意のデータ構造にできます。
  3. 変更の始まり名前 が外部記述ファイルまたは外部記述データベース・ファイルのレコード様式を参照する場合、データ構造は、同じファイルまたはレコード様式で、LIKEREC または EXTNAME キーワードの 2 番目のパラメーターとして *INPUT、*OUTPUT、または *ALL を指定して定義されたデータ構造、または LIKEREC キーワードに 2 番目のパラメーターが指定されていないデータ構造にする必要があります。変更の終わり
  4. 変更の始まり名前 が外部記述ディスプレイ・ファイルのサブファイル・レコード様式を参照する場合、データ構造は、同じファイルまたはレコード様式で、LIKEREC または EXTNAME キーワードの 2 番目のパラメーターとして *OUTPUT または *ALL を指定して定義されたデータ構造にする必要があります。変更の終わり
  5. データ構造の定義方法、およびデータ構造とファイルの間で どのようにデータが転送されるのかについては、ファイル命令を参照してください。

更新するフィールドのリストは %FIELDS を使用して指定できます。 %FIELDS のパラメーターは、更新するフィールド名のリストです。 フィールドの更新の図については、%FIELDS (更新するフィールド)の終わりにある例を参照してください。

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

UPDATE 命令を使用する場合には、次のことに留意してください。
  • 名前 がレコード様式名の場合、レコード定義の中のこのフィールドのプログラムにおける現行値を使用して、レコードが修正されます。
  • レコードの (すべてのフィールドでなく) 一部のフィールドを更新する場 合には、UPDATE 命令を使用しないで出力仕様を使用するか、あるいは %FIELDS を使用して 更新対象のフィールドを識別してください。
  • ファイルまたはレコードに UPDATE を出す前に、同じファイルまたはレコ ードに、ロックを伴う有効な入力命令 (READ、READC、READE、READP、 READPE、CHAIN、または 1 次/2 次ファイル) を出す必要があります。 読み取り操作でエラー条件が戻された場合、またはロックなしで読み取られて場 合には、そのレコードはロックされないので、UPDATE を出すことはできません。 このレコードは、ロック要求を指定するために、命令拡張をデフォルトの値のブラ ンクにしてもう一度読み取らなければなりません。
  • 同じファイルまたはレコードに連続して UPDATE 命令を使用することはで きません。更新するレコードを位置決めしてロックするためには、間に正常な読み取り命令 を出さなければなりません。
  • 合計演算中に 1 次または 2 次ファイルに UPDATE 命令を使用する場合には 注意してください。 RPG IV サイクルのこの段階では、現行レコード (処理しようとしているレコード) のフィールドは、まだ処理域に転送されていません。 したがって、UPDATE 命令では現行レコードが前のレコードのフィールドで更新 されます。 また、現行レコードのフィールドが処理域に転送される場合にも、 それらは前のレコードから更新されたフィールドになります。
  • 複数装置ファイルの場合、名前 オペランドとしてサブファイル・レコード様式を指定します。 この命令は、ファイル仕様書に DEVID キーワードを使用して指定されたフィールド名で識別されるプログラム装置で処理されます。プログラム装置が指定されていない場合には、最後の正常な入力命令で使用さ れた装置が使用されます。 この装置は、入力命令 (UPDATE 命令に先行する必要がある) で指定された装置 と同じでなければなりません。 入力命令から UPDATE 命令までの間に、他の装 置に対する入出力命令を処理してはいけません。 そのようなことをすると、 UPDATE 命令は正常に実行されなくなります。
  • 複数のサブファイル・レコード様式を持つ表示装置ファイルの場合には、 1 つのサブファイル・レコードに対する更新のための読み取り命令を、同じ表示 装置ファイルの別のサブファイルに対する入力命令から UPDATE 命令までの間 に処理してはいけません。 そのようなことをすると、UPDATE 命令は正常に実行されなくなります。
  • サブファイル・レコード様式に対する UPDATE 命令は、サブファイル・ レコード様式名に対する正常な入力命令 (READC、CHAIN) が少なくとも 1 回 (中間に別の様式名に対する入力命令を入れないで) 行われた場合に有効となります。 更新レコードは、最後の正常な入力操作で検索されたレコードとなります。 このことは、1 つのレコードが正常に読み取られて、次に同じ形式が正常に読 み取られなかった場合に、更新は行われるが、最初のレコードが更新される ことを意味しています。 これは DISK ファイルの場合とは異なります。

    正しくないレコードの更新を避けるために、結果の標識またはレコード識別 標識を調べて、正常な入力操作が行われた後で更新命令が実行されることを 確認してください。

ヌル値を含むヌル値可能フィールドを持つレコードの更新について は データベースのヌル値サポートを参照してください。

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