キーによる順次処理

キーによる順次処理方式では、レコードはファイルからキー順に 読み取られます。

キーによる順次処理方式はプライマリー、セカンダリー、または 全手順ファイルとして使用されるキー付きファイルで有効になります。

出力ファイルおよび、ランダム関数 (例えば、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/infocenteriSeries Information Center の中 の『データベース』カテゴリーの『DB2 Universal Database for AS/400』の節を参照してください。

キーによる順次処理の例

次の 3 つの例は、キーによる順次処理方式のデータ処理の異なる使用法を示し たものです。

データ記述仕様書 (DDS)

図 165 および 図 166 は、例で使われる物理ファイルの データ記述仕様書 (DDS) を示します。 図 167 は、最初の 3 つの例で使われる 論理ファイルの DDS を示します。

図 165. データベース・ファイル EMPMST (物理ファイル) の 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
図 166. データベース・ファイル TRWEEK (物理ファイル) の DDS
     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
図 167. データベース・ファイル EMPL1 (論理ファイル) の DDS
     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
プログラム例 1 (1 次ファイルを使用するキーによる順次処理)

この例では、社員マスター・レコード (EMPREC) および 週間勤務時間レコード (RCWEEK) が同じ論理ファイル EMPL1 に含まれています。 EMPL1 ファイルはプライマリー入力ファイルとして定義され、キーによる順次 で読み取られます。 このファイルのデータ記述仕様書で、EMPREC レコードのキーは ENUM (社員番号) フィールド として定義され、RCWEEK レコードのキーは ENUM フィールド、 プラス WEEKNO (週番号) フィールドとして、すなわち複合キーとして 定義されます。

図 168. キーによる順次処理、例 1
      *****************************************************************
      *  プログラム名:  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
プログラム例 2 (READ を使用したキーによる順次処理)

この例は先の例と同じですが、異なる点は、EMPL1 ファイルが全手順ファイル として定義されていて、ファイルの読み取りが READ 命令コードによって行わ れるということです。

図 169. キーによる順次処理、例 2
      *****************************************************************
      *  プログラム名:  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
プログラム例 3 (レコード突き合わせ手法)

この例では、TRWEEK ファイルがセカンダリー入力ファイルとして定義されています。EMPREC および RCWEEK レコードは、 突き合わせレコードとして処理され、 両方のレコードの ENUM フィールドには突き合わせレベル値 M1 に割り当てられています。 異なるレコード・タイプの処理を制御するために、レコード識別標識 01 と 02 が割り当てられています。

図 170. キーによる順次処理、例 3
      *****************************************************************
      *  プログラム名:  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