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