IN (データ域の検索)

自由形式構文 IN{(E) } {*LOCK } データ域名
コード 演算項目 1 演算項目 2 結果フィールド 標識
IN (E) *LOCK データ域名   _ ER _

IN 命令では、データ域を検索して、別のプログラムによって更新されない ようにデータ域をロックするかどうかをオプションで指定することができます。 IN 命令 でデータ域を検索する場合には、*DTAARA DEFINE ステートメント の結果フィールドに指定するか、あるいは定義仕様書の DTAARA キーワードを 使用して指定しなければなりません。(*DTAARA DEFINE 命令については DEFINE (フィールド定義)を、また DTAARA キーワードについては定義仕様書を参照してください。)

DTAARA(*VAR) がフィールドの定義に指定されたために、データ域の名前が実行時に判別される場合、そのデータ域名を含む変数は IN 命令の実行 前に設定する必要がありま す。しかし、データ域が以前に実行した *LOCK IN 命令が原因でロックされている場合は、以前にロックさ れたデータ域が使用され、データ域の名前を含む変数は参照されません。

予約語 *LOCK を演算項目 1 で指定することにより、(1) UNLOCK 命令が処理されるか、(2) data-area-name オペランド が指定されていない OUT 命令が処理されるか、 あるいは (3) プログラムの終了時に RPG IV プログラムが暗黙にデータ域をアンロックしない限り、 データ域を別のプログラムが更新またはロックできないことを指示することができます。

データ域名 オペランドが内部データ域またはプログラム初期化パラメーター (PIP) データ域の名前である場合には、*LOCK は指定できません。

プログラムがすでにロックしているデータ域に *LOCK IN ステートメントを 指定することができます。 データ域名 オペランドが指定されていない場合には、ロック状況は、データ域が検索される前の状況と同じになります。 すなわち、ロックされていた場合にはロックされたままで、アンロックされていた場合にはアンロックされたままとなります。

データ域名は、DTAARA キーワード、*DTAARA DEFINE 命令の結果フィールド、または予約語 *DTAARA を使用して定義された定義名でなければなりません。 *DTAARA が指定された場合には、プログラム内で定義されているすべてのデー タ域が検索されます。 データ域の検索でエラーが起こった (例えば、データ域を検索できるが、ロックできない) 場合には、IN 命令でエラーが起こって RPG IV 例外/エラー処理ルーチンに制御が渡されます。要求元にメッセージが出された場合には、そのメッセージによってエラーのあ るデータ域が識別されます。

IN 例外 (プログラム状況コード 401 から 421、431、 または 432) を処理するために、命令コード拡張 'E' またはエラー標識 ER を 指定できますが、両方を指定することはできません。 エラー処理の詳細については、プログラム例外/エラーを 参照してください。

固定形式演算では、71 から 72 桁目と 75 から 76 桁目はブランクでなければなりません。

IN 命令に関する規則の詳細については、データ域命令を参照してください。

図 1. IN および OUT 命令
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
 * Define Data areas
D TotAmt          s              8p 2 dtaara
D TotGrs          s             10p 2 dtaara
D TotNet          s             10p 2 dtaara

 *  TOTAMT, TOTGRS, and TOTNET are defined as data areas.  The IN
 *  operation retrieves all the data areas defined in the program
 *  and locks them.  The program processes calculations, and at
 *  LR time it writes and unlocks all the data areas.
 *  The data areas can then be used by other programs.

 /free
 
      in *lock *dtaara;
      TotAmt = TotAmt + Amount;
      TotGrs = TotGrs + Gross;
      TotNet = TotNet + Net;
 
 /end-free
 * To start total calcs, code a fixed format calc statement with a
 * level entry specified.
CL0   total_calcs   tag
 /free
 
      if *inlr
         out *dtaara
      endif
 /end-free