【COBOL学習|実務向け】[報告書の品質を上げる!コントロール見出し(CH)のページ跨ぎ再出力テクニック]

1. 導入:なぜ「CHの再出力」が必要なのか

帳票出力プログラムにおいて、改ページが発生した際、読み手が「今、どのグループのデータを読んでいるのか」を見失うのは非常にストレスです。特に長大な報告書では、ページ先頭で「現在どの部門のデータが続いているのか」を表示することが、ユーザーの利便性を左右します。自動改ページ機能に頼り切るのではなく、現場で意図的に「CH(コントロール見出し)の再出力」を制御するテクニックは、帳票の品質を一段階引き上げるために不可欠です。

2. 基礎知識:CHとPHの役割

COBOLの報告書作成機能(Report Writer機能)において、PH(ページ見出し)は全ページ共通のタイトルなどを出力し、CH(コントロール見出し)は特定の項目(例:部門コード、顧客ID)が変更されたタイミングで出力されます。
通常、改ページが発生するとPHが出力されますが、CHは「値が変化した時」しか出力されません。そのため、ページをまたぐとCHが消えてしまい、データの所属が不明瞭になるという課題が発生します。これを解決するのが「ページ跨ぎ時のCH再出力」です。

3. 実装・解決策:フラグによる制御

最も確実な方法は、改ページ時のロジックに「現在保持しているグループキー」を強制的に再出力するフラグを設けることです。Report Writerを使用しない汎用的な印刷ロジックの場合、改ページ処理の後に「現在処理中のグループキーを退避したエリア」を参照して、強制的にCH出力サブルーチンを呼び出すことで解決します。

4. サンプルプログラム

以下は、改ページ処理の中でCHを再出力する実装例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. PRINT-REPORT.
——————————————————-

  • 部門別売上報告書:ページ跨ぎ時のCH再出力サンプル

——————————————————-
WORKING-STORAGE SECTION.
01 WS-CONTROL-AREA.
05 WS-PREV-DEPT-ID PIC X(04) VALUE SPACE.
05 WS-CURRENT-DEPT-ID PIC X(04).

PROCEDURE DIVISION.
MAIN-LOGIC.
PERFORM PRINT-LINE-ROUTINE.
STOP RUN.

PRINT-LINE-ROUTINE.

  • 部門コードが変更された場合のみCHを出力

IF WS-CURRENT-DEPT-ID NOT = WS-PREV-DEPT-ID
PERFORM PRINT-CH-ROUTINE
END-IF.

  • (中略:明細行の出力処理)

.

PRINT-CH-ROUTINE.

  • CH出力処理:現在処理中の部門IDを退避

MOVE WS-CURRENT-DEPT-ID TO WS-PREV-DEPT-ID.
DISPLAY “— 部門見出し: ” WS-CURRENT-DEPT-ID ” —“.
.

PAGE-BREAK-ROUTINE.

  • 改ページ処理

DISPLAY “【改ページ処理実行】”.

  • ここで強制的にCHを再出力することで、次ページの先頭に表示させる

PERFORM PRINT-CH-ROUTINE.
.

5. 応用・注意点:現場で陥りやすい罠

実装上の注意点として、「再出力したCHと、通常のCHでデザインを変える」という工夫が有効です。例えば、再出力されたCHの横に「(続き)」という文字を付加することで、ユーザーは「これは新しいグループの開始ではなく、前ページからの続きである」と一目で判断できます。

また、バグの温床になりやすいのが「改ページが発生しないギリギリの行で、意図せずCHだけがページ最下部に出力される」ケースです。この場合、CHの後の明細行が次のページに送られてしまい、見出しだけが孤立する「孤立見出し(Widow)」が発生します。これを防ぐには、「CH出力前に、最低限必要な行数が残っているか」をチェックする行数カウンタの制御を必ず組み込んでください。ベテランの現場では、この「余白計算」の精度が帳票の美しさを決めると言っても過言ではありません。

コメント

タイトルとURLをコピーしました