RPGによるコーディング 印刷処理(2)
前ページ 次ページ 目 次


ここではキーブレークの定番処理の方法を紹介します。
随時増ページの予定です。




部門別発生費用集計表

以下のようなデータがあるとします。

事業部 費用発生金額
A 01 01 01 1000
A 01 02 02 100
A 02 01 03 10
B 01 01 04 2000
B 02 01 05 200
C 01 01 01 3000

これを事業部別に集計して上記の表を印刷するケースで考えてみます。
部、課、係のデータがありますが、こればキーブレークのレベルが深くなったときに使用すると考えて下さい。



プログラムの構造

印刷帳票は概ね、次のような形をしています。

見だし部分
       処理プログラム名、タイトル、処理日付、処理時間、ページなど
       項目見だしなどの見出し印刷




明細部分(繰返し)
        明細の各項目の印刷





フッター部分
    合計などの印刷



プログラムを作成する場合は、プログラム構造をこのように出力の形式にあわせると非常にうまくいきます。
理由は、
1.プログラムのどこで何をしているかがわかりやすい。
2.処理の重複が発生しにくい。
3.拡張がやさしい。

特にキーブレーク処理の場合では、キーのブレークが2レベルになろうとも、3レベルになろうとも容易に拡張できます。

1ページ分のプログラムの構造は次のようになります。

     C*キーブレーク前処理
     C                     EXSR SB1HDR           見出し部
     C*キーブレークするまで繰り返し処理
+----C           N1KEY     DOWEQQ1KEY                      第1LEVEL  
|    C                     EXSR SB1DTL            明細部
+----C                     ENDDO
     C*キーブレーク後処理
     C                     EXSR SB1FTR                     フッター部

複数ページ分の処理に拡張すると、上記処理が入力が終わりになるまで繰り返されるので、
次のように上記処理全体をSBMAINというサブルーチンにしておき、これを繰返し処理とします。

+----C           *IN99     DOWEQ*OFF                                  
|    C                     EXSR SBMAIN
+----C                     ENDDO

     C           SBMAIN    BEGSR
     C*
     C*キーブレーク前処理
     C                     EXSR SB1HDR
     C*キーブレークするまで繰り返し処理
+----C           N1KEY     DOWEQQ1KEY                      第1LEVEL
|    C                     EXSR SB1DTL
+----C                     ENDDO
     C*キーブレーク後処理
     C                     EXSR SB1FTR
     C*
     C                     ENDSR



2階層への拡張

2階層への拡張は、1階層の明細処理の部分を拡張します。


見だし部分
       処理プログラム名、タイトル、処理日付、処理時間、ページなど
       項目見だしなど

明細部分(繰返し)
        明細の各項目

見だし部分
       処理プログラム名、タイトル、
       処理日付、処理時間、ページなど
       項目見だしなど




明細部分(繰返し)
        明細の各項目





フッター部分
    合計など

フッター部分
    合計など


明細部分のプログラム例を紹介します。キーの部分はプログラム内部で記述しておきます。

     I*読み取りキー
     IN@KEY       DS
     I                                        1   1 N1KEY
     I                                        2   3 N2KEY
     I*保管キー
     IQ@KEY       DS
     I                                        1   1 Q1KEY
     I                                        2   3 Q2KEY
  

     C           SB1DTL    BEGSR
     C*
     C*キーブレーク前処理
     C                     EXSR SB2HDR
     C*キーブレークするまで繰り返し処理
+----C           N2KEY     DOWEQQ2KEY                       第2LEVEL
|    C                     EXSR SB2DTL
+----C                     ENDDO
     C*キーブレーク後処理
     C                     EXSR SB2FTR
     C*
     C                     ENDSR


3階層への拡張

3階層への拡張の場合はさらに明細処理の部分を拡張します。
(さらに多階層へ拡張する場合でも同じ考え方をします。)



1階層(事業部別)のキーブレーク処理の例

1階層のプログラム例を紹介します。

     **--------------------------------------------------------------
     ** ID   : LF821
     ** NAME :発生費用一覧
     **--------------------------------------------------------------
     H            Y-                                    1
     F*--------------------------------------------------------------
     F*
     F*受注ファイル
     FF820    IF  E           K        DISK
     F*
     F*印刷ファイル
     FLF821P  O   E                    PRINTER
     I*--------------------------------------------------------------
     I*システム情報
     I           SDS
     I                                     *PROGRAM @PGMID
     I*読取キー
     IN@KEY       DS
     I                                        1   1 N1KEY
     I                                        1   1 N1JICD
     I*保管キー
     IQ@KEY       DS
     I                                        1   1 Q1KEY
     I                                        1   1 Q1JICD
     C*--------------------------------------------------------------
     C*               MAIN ROUTINE
     C*--------------------------------------------------------------
     C*初期処理
     C                     EXSR SBINZ                      初期設定処
     C*主処理
+----C           *IN99     DOWEQ*OFF
|    C                     EXSR SBMAIN
+----C                     ENDDO
     C*終了処理
     C                     EXSR SBEND                      終了処理
     C*--------------------------------------------------------------
     C*         .SBINZ   初期設定
     C*--------------------------------------------------------------
     C           SBINZ     BEGSR
     C*
     C*タイトルのセット
     C                     Z-ADDUDATE     H1YMD             JOB日付
     C                     Z-ADD000       N       70
     C                     Z-ADD000       W1SUM  120        合計
     C                     Z-ADD000       W9SUM  120        総合計
     C*初期セット
     C                     MOVEL@PGMID    H1PGID            PROGRAM-ID
     C                     MOVEL*ALL'-'   H1BAR             ----------
     C                     MOVEL*ALL'-'   H1BAR2            ----------
     C*読取り
     C                     EXSR SBREAD
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBMAIN  主処理   
     C*--------------------------------------------------------------
     C           SBMAIN    BEGSR
     C*
     C*キーブレーク前処理
     C                     EXSR SB1HDR
     C*キーブレークするまで繰り返し処理
+----C           N1KEY     DOWEQQ1KEY                      第1LEVEL
|    C                     EXSR SB1DTL
+----C                     ENDDO
     C*キーブレーク後処理
     C                     EXSR SB1FTR
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SB1HDR  第1レベルキーブレーク前処理
     C*--------------------------------------------------------------
     C           SB1HDR    BEGSR
     C*見出し部印刷
     C                     MOVELGNJICD    H1JICD            事業部CD
     C                     WRITEHDR01
     C*新旧キー取替え
     C                     MOVELN1KEY     Q1KEY
     C*合計クリア
     C                     Z-ADD000       W1SUM             合計
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SB1DTL   キーブレークなしの処理
     C*--------------------------------------------------------------
     C           SB1DTL    BEGSR
     C*明細編集
     C*明細出力
     C                     WRITEDTL01
     C*合計計算
     C                     ADD  GNHSGK    W1SUM
     C*次の読取
     C                     EXSR SBREAD
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB1FTR   キーブレーク後処理
     C*--------------------------------------------------------------
     C           SB1FTR    BEGSR
     C*
     C* 合計編集
     C                     Z-ADDW1SUM     F1SUM
     C* 合計印刷
     C                     WRITEFTR01
     C                     ADD  W1SUM     W9SUM
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SBREAD  マスターREAD処理
     C*--------------------------------------------------------------
     C           SBREAD    BEGSR
     C*
     C                     READ F820R                    99
     C           *IN99     IFEQ *OFF
     C                     MOVELGNJICD    N1JICD           事業部CD
     C                     ELSE
     C                     MOVEL*HIVAL    N@KEY
     C                     ENDIF
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBEND   終了処理  
     C*--------------------------------------------------------------
     C           SBEND     BEGSR
     C*
     C                     Z-ADDW9SUM     F9SUM
     C                     WRITEFTR09
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C                     ENDSR


2階層(事業部別、部別)のキーブレーク処理の例

2階層のプログラム例を紹介します。

     **--------------------------------------------------------------
     ** ID   : LF822
     ** NAME :発生費用一覧
     ** FUNC :
     **--------------------------------------------------------------
     H            Y-                                    1
     F*--------------------------------------------------------------
     F*受注ファイル
     FF820    IF  E           K        DISK
     F*
     F*印刷ファイル
     FLF822P  O   E                    PRINTER
     I*--------------------------------------------------------------
     I*システム情報
     I           SDS
     I                                     *PROGRAM @PGMID
     I*読取キー
     IN@KEY       DS
     I                                        1   1 N1KEY
     I                                        2   3 N2KEY
     I*保管キー
     IQ@KEY       DS
     I                                        1   1 Q1KEY
     I                                        2   3 Q2KEY
     C*--------------------------------------------------------------
     C*               MAIN ROUTINE
     C*--------------------------------------------------------------
     C*初期処理
     C                     EXSR SBINZ                      初期設定処
     C*主処理
+----C           *IN99     DOWEQ*OFF
|    C                     EXSR SBMAIN
+----C                     ENDDO
     C*終了処理
     C                     EXSR SBEND                      終了処理
     C*--------------------------------------------------------------
     C*         .SBINZ   初期設定
     C*--------------------------------------------------------------
     C           SBINZ     BEGSR
     C*
     C*タイトルのセット
     C                     Z-ADDUDATE     H1YMD             JOB日付
     C                     Z-ADD000       N       70
     C                     Z-ADD000       W1SUM  120        合計
     C                     Z-ADD000       W2SUM  120        合計
     C                     Z-ADD000       W9SUM  120        総合計
     C*初期セット
     C                     MOVEL@PGMID    H1PGID            PROGRAM-ID
     C                     MOVEL*ALL'-'   H1BAR             ----------
     C                     MOVEL*ALL'-'   H1BAR2            ----------
     C*読取り
     C                     EXSR SBREAD
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBMAIN  主処理   
     C*--------------------------------------------------------------
     C           SBMAIN    BEGSR
     C*
     C*キーブレーク前処理
     C                     EXSR SB1HDR
     C*キーブレークするまで繰り返し処理
+----C           N1KEY     DOWEQQ1KEY                      第1LEVEL
|    C                     EXSR SB1DTL
+----C                     ENDDO
     C*キーブレーク後処理
     C                     EXSR SB1FTR
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB1HDR  第1レベルキーブレーク前処理
     C*--------------------------------------------------------------
     C           SB1HDR    BEGSR
     C*
     C*見出し部印刷は行わない
     C*                    *NONE
     C*新旧キー取替え
     C                     MOVELN1KEY     Q1KEY
     C*合計クリア
     C                     Z-ADD000       W1SUM             合計
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB1DTL   キーが同一の場合の処理
     C*--------------------------------------------------------------
     C           SB1DTL    BEGSR
     C*
     C*キーブレーク前処理
     C                     EXSR SB2HDR
     C*キーブレークするまで繰り返し処理
+----C           N2KEY     DOWEQQ2KEY                      第2LEVEL
|    C                     EXSR SB2DTL
+----C                     ENDDO
     C*キーブレーク後処理
     C                     EXSR SB2FTR
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB2HDR   第2レベルキーブレーク前処理
     C*--------------------------------------------------------------
     C           SB2HDR    BEGSR
     C*見出し部印刷
     C                     MOVELGNBUCD    H1BUCD            部CD
     C                     WRITEHDR01
     C*新旧キー取替え
     C                     MOVELN2KEY     Q2KEY
     C                     Z-ADD000       W2SUM             合計
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB2DTL   キーが同一の場合の処理
     C*--------------------------------------------------------------
     C           SB2DTL    BEGSR
     C*明細編集
     C*  なし
     C*明細出力
     C                     WRITEDTL01                      明細出力
     C*合計計算
     C                     ADD  GNHSGK    W2SUM
     C*次の読取
     C                     EXSR SBREAD
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB2FTR   キーブレーク後処理
     C*--------------------------------------------------------------
     C           SB2FTR    BEGSR
     C*
     C* 合計編集
     C                     Z-ADDW2SUM     F2SUM            第二レベル計
     C* 合計印刷
     C                     WRITEFTR02
     C                     ADD  W2SUM     W1SUM
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SB1FTR   キーブレーク後処理
     C*--------------------------------------------------------------
     C           SB1FTR    BEGSR
     C*
     C* 合計編集
     C                     Z-ADDW1SUM     F1SUM
     C* 合計印刷
     C                     WRITEFTR01
     C                     ADD  W1SUM     W9SUM
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SBREAD  マスターREAD処理
     C*--------------------------------------------------------------
     C           SBREAD    BEGSR
     C*
     C                     READ F820R                    99
     C           *IN99     IFEQ *OFF
     C                     MOVELGNJICD    N1JICD           事業部CD
     C                     MOVELGNBUCD    N2BUCD           部CD
     C                     ELSE
     C                     MOVEL*HIVAL    N@KEY
     C                     ENDIF
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBEND   終了処理  
     C*--------------------------------------------------------------
     C           SBEND     BEGSR
     C*
     C                     Z-ADDW9SUM     F9SUM            総合計
     C                     WRITEFTR09
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C                     ENDSR


注:RPGサイクルを使用すればプログラムはもっと簡単になるのですが、ここではとりあげません。



前ページ 次ページ 目 次


(C)COPYRIGHT ISHIOKA KATSUHIDE 2002