キーによる順次処理方式では、レコードはファイルからキー順に 読み取られます。
キーによる順次処理方式はプライマリー、セカンダリー、または 全手順ファイルとして使用されるキー付きファイルで有効になります。
出力ファイルおよび、ランダム関数 (例えば、SETLL、SETGT、CHAIN、ADD など) を使わず、かつ唯一のレコード様式を持つ入力ファイルについては、ILE RPG コンパイラーはデフォルトの値を取るか、SEQONLY(*YES) が CL コマンド OVRDBF に指定されている場合と同じように作動します (ILE RPG コンパイラーは更新ファイルに対しては、SEQONLY(*YES) が指定された場合と同じようには作動しません)。SEQONLY(*YES) によって、複数レコードを内部データ管理バッファーに入れることができます。 その後、レコードは入力により一度に 1 つずつ ILE RPG コンパイラーに渡されます。
同一ジョブ内で、2 つのファイルが同じ物理ファイルを使用し、1 つのファイ ルが連続して処理され、もう 1 つのファイルがランダム更新用に処理される場 合、プログラムに渡されるバッファーに既に入っているレコードは、更新 することができます。 この場合には、レコードが順次ファイルから処理される時に、レコードには更 新済みデータは反映されません。 この問題を防止するためには、 CL コマンド OVRDBF を使用してオプション SEQONLY(*NO) を指定し、順次処理 ファイルでは複数レコードを転送しないように指示します。
順次のみの処理についての詳細は、http://www.ibm.com/eserver/iseries/infocenter で iSeries Information Center の中 の『データベース』カテゴリーの『DB2 Universal Database for AS/400』の節を参照してください。
次の 3 つの例は、キーによる順次処理方式のデータ処理の異なる使用法を示し たものです。
図 165 および 図 166 は、例で使われる物理ファイルの データ記述仕様書 (DDS) を示します。 図 167 は、最初の 3 つの例で使われる 論理ファイルの DDS を示します。
A***************************************************************** A* 説明: これは物理ファイル EMPMST の DDS です。 * A* これには 1 つのレコード様式 EMPREC が入っています。 * A* このファイルには、会社の各社員ごとに 1 レコードが * A* 入っています。 * A***************************************************************** A* A R EMPREC A ENUM 5 0 TEXT('EMPLOYEE NUMBER') A ENAME 20 TEXT('EMPLOYEE NAME') A ETYPE 1 TEXT('EMPLOYEE TYPE') A EDEPT 3 0 TEXT('EMPLOYEE DEPARTMENT') A ENHRS 3 1 TEXT('EMPLOYEE NORMAL WEEK HOURS') A K ENUM
A***************************************************************** A* 説明: これは、物理ファイル TRWEEK の DDS です。 * A* これには 1 つのレコード様式 RCWEEK が入っています。 * A* このファイルには、勤務時間報告書作成システムに対して * A* 作成されるすべての週間項目が入っています。 * A***************************************************************** A* A R RCWEEK A ENUM 5 0 TEXT('EMPLOYEE NUMBER') A WEEKNO 2 0 TEXT('WEEK NUMBER OF CURRENT YEAR') A EHWRK 4 1 TEXT('EMPLOYEE HOURS WORKED') A K ENUM A K WEEKNO
A***************************************************************** A* 関連ファイル: EMPMST (物理ファイル) * A* TRWEEK (物理ファイル) * A* 説明: これは論理ファイル EMPL1 の DDS です。 * A* これには、2 つのレコード様式 * A* EMPREC と RCWEEK が入っています。 * A***************************************************************** A R EMPREC PFILE(EMPMST) A K ENUM A* A R RCWEEK PFILE(TRWEEK) A K ENUM A K WEEKNO
この例では、社員マスター・レコード (EMPREC) および 週間勤務時間レコード (RCWEEK) が同じ論理ファイル EMPL1 に含まれています。 EMPL1 ファイルはプライマリー入力ファイルとして定義され、キーによる順次 で読み取られます。 このファイルのデータ記述仕様書で、EMPREC レコードのキーは ENUM (社員番号) フィールド として定義され、RCWEEK レコードのキーは ENUM フィールド、 プラス WEEKNO (週番号) フィールドとして、すなわち複合キーとして 定義されます。
***************************************************************** * プログラム名: YTDRPT1 * * 関連ファイル: EMPL1 (論理ファイル) * * PRINT (プリンター・ファイル) * * 説明: このプログラムはキー順方式を使用 * * するレコードの処理例です。 * * このプログラムは各社員の情報および週間勤務 * * 時間を印刷します。 * ***************************************************************** FPRINT O F 80 PRINTER FEMPL1 IP E K DISK * 各レコードにレコード識別標識を割り当てます。これらのレコード識別標識を * 使用して、異なるレコード・タイプの処理を * 制御します。 IEMPREC 01 I* IRCWEEK 02 I* * EMPL1 ファイルでは、キーによって有効な社員番号が順次読み取り * されるため、RCWEEK レコードの ENUM は最後に検索された * EMPREC の ENUM と同じでなければなりません。これは、EMPREC * レコードの ENUM をフィールド EMPNO に保管し、これを * RCWEEK レコードから読み取られた ENUM と比較することによって * チェックする必要があり、そのチェックがここで行なわれます。 * ENUM が有効な場合に *IN12 がオンに設定されます。*IN12 は * RCWEEK レコードの印刷の制御に使用されます。 C SETOFF 12 C 01 MOVE ENUM EMPNO 5 0 C* C IF (*IN02='1') AND (ENUM=EMPNO) C SETON 12 C ENDIF OPRINT H 1P 2 6 O 40 'EMPLOYEE WEEKLY WORKING ' O 52 'HOURS REPORT' O H 01 1 O 12 'EMPLOYEE: ' O ENAME 32 O H 01 1 O 12 'SERIAL #: ' O ENUM 17 O 27 'DEPT: ' O EDEPT 30 O 40 'TYPE: ' O ETYPE 41 O H 01 1 O 20 'WEEK #' O 50 'HOURS WORKED' O D 12 1 O WEEKNO 18 O EHWRK 3 45
この例は先の例と同じですが、異なる点は、EMPL1 ファイルが全手順ファイル として定義されていて、ファイルの読み取りが READ 命令コードによって行わ れるということです。
***************************************************************** * プログラム名: YTDRPT2 * * 関連ファイル: EMPL1 (論理ファイル) * * PRINT (プリンター・ファイル) * * 説明: このプログラムはキー順方式を使用 * * 使用するレコードの処理例を示しています。 * * このプログラムは各社員の情報および週間勤務 * * 時間を印刷します。 * ***************************************************************** FPRINT O F 80 PRINTER FEMPL1 IF E K DISK * 2 つのレコード (EMPREC と RCWEEK) は同じファイルに入っており、 * レコード識別標識は各レコードに割り当てられています。 * レコード識別標識は異なるレコード・タイプの処理の制御に使用されます。 * 全手順ファイルの場合には、制御レベルまたは突き合わせフィールドを * 指定することはできません。 IEMPREC 01 I* IRCWEEK 02 I* * READ 命令コードは、EMPL1 ファイルからレコードを読み取ります。 * ファイルの終わり標識は 58 〜 59 桁目に指定します。ファイルの終わり * 標識 99 は READ 命令によってオンに設定され、プログラムは * EOFEND タグに分岐して、ファイル終わりルーチンを処理 * します。 C SETOFF 12 C READ EMPL1 99 C 99 GOTO EOFEND C* C 01 MOVE ENUM EMPNO 5 0 C* C IF (*IN02='1') AND (ENUM=EMPNO) C SETON 12 C ENDIF * EMPL1 は全手順ファイルとして定義されているため、最終レコードを * 処理した後でプログラムを終了するために標識 *INLR をオンに * 設定する必要があります。 C EOFEND TAG C 99 SETON LR
OPRINT H 1P 2 6 O 40 'EMPLOYEE WEEKLY WORKING ' O 52 'HOURS REPORT' O H 01 1 O 12 'EMPLOYEE: ' O ENAME 32 O H 01 1 O 12 'SERIAL #: ' O ENUM 17 O 27 'DEPT: ' O EDEPT 30 O 40 'TYPE: ' O ETYPE 41 O H 01 1 O 20 'WEEK #' O 50 'HOURS WORKED' O D 12 1 O WEEKNO 18 O EHWRK 3 45
この例では、TRWEEK ファイルがセカンダリー入力ファイルとして定義されています。EMPREC および RCWEEK レコードは、 突き合わせレコードとして処理され、 両方のレコードの ENUM フィールドには突き合わせレベル値 M1 に割り当てられています。 異なるレコード・タイプの処理を制御するために、レコード識別標識 01 と 02 が割り当てられています。
***************************************************************** * プログラム名: YTDRPT5 * * 関連ファイル: EMPMST (物理ファイル) * * TRWEEK (物理ファイル) * * PRINT (プリンター・ファイル) * * 説明: このプログラムはキー順方式を使用 * * するレコードの処理例です。 * * このプログラムは各社員の情報および週間勤務 * * および超過時間を印刷 * * します。 * ***************************************************************** FPRINT O F 80 PRINTER FEMPMST IP E K DISK FTRWEEK IS E K DISK IEMPREC 01 I ENUM M1 IRCWEEK 02 I ENUM M1
C 01 Z-ADD 0 TOTHRS 5 1 C 01 Z-ADD 0 TOTOVT 5 1 C 01 SETOFF 12 C* C MR IF (*IN02='1') C ADD EHWRK TOTHRS C EHWRK SUB ENHRS OVTHRS 4 111 C 11 ADD OVTHRS TOTOVT C SETON 12 C ENDIF OPRINT H 1P 2 6 O 50 'YTD PAYROLL SUMMARY' O D 01 1 O 12 'EMPLOYEE: ' O ENAME 32 O D 01 1 O 12 'SERIAL #: ' O ENUM 17 O 27 'DEPT: ' O EDEPT 30 O 40 'TYPE: ' O ETYPE 41 O D 02 MR 1 O 8 'WEEK #' O WEEKNO 10 O 32 'HOURS WORKED = ' O EHWRK 3 38 * これらの 2 明細出力行は、*IN01 がオンで、一致するレコードが * 見付からない (つまりその社員レコードの RCWEEK レコードが見付からない) * 場合に処理されます。この場合には、明らかに * 合計フィールド (TOTHRS と TOTOVT) はゼロと等しくなります。 O D 01NMR 1 O 70 'YTD HOURS WORKED = ' O TOTHRS 3 78 O D 01NMR 1 O 70 'YTD OVERTIME HOURS = ' O TOTHRS 3 78 * これら 2 行の合計出力行は、明細演算を実行する前に処理されます。 * したがって、指定された標識がオンの場合は、最後に * 検索されたレコードの社員の合計フィールド (TOTHRS と TOTOVT) * が印刷されます。 O T 01 12 1 O OR LR 12 O 70 'YTD HOURS WORKED = ' O TOTHRS 3 78 O T 01 12 1 O OR LR 12 O 70 'YTD OVERTIME HOURS = ' O TOTOVT 3 78
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.