1. 導入:なぜこの知識が必要なのか
COBOLで帳票を作成する際、REPORT SECTIONで「PAGE HEADING(以下PH)」を定義すると、プログラムは律儀に「全ページ」の先頭にその見出しを出力します。しかし、実務では「表紙(REPORT HEADING)があるから、最初のページにはPHを出したくない」という要件が頻繁に発生します。この「PHスキップ不可」の原則を知らずにいると、設計通りに帳票が出力されず、手戻りが発生する原因となります。今回は、この仕様を正しくコントロールする方法を解説します。
2. 基礎知識:PHの出力タイミング
COBOLのREPORT WRITER機能において、PHは「INITIATE文を実行した後の最初のDETAIL出力時」に必ず自動生成されます。たとえREPORT HEADING(RH)で表紙を出力していても、その直後に続くデータ出力時に、システムは「新しいページが始まった」と判断し、強制的にPHを出力してしまうのです。これはCOBOLの言語仕様であり、単に定義を書いただけでは回避できません。
3. 実装・解決策:SUPPRESS PRINTINGを活用する
この問題を解決するには、DECLARATIVES(宣言部)の中で「USE BEFORE REPORTING」という機能を使います。特定のPHが出力される直前にプログラムを割り込ませ、「条件を満たせば出力を抑止(SUPPRESS)」するロジックを組み込むのが定石です。
4. サンプルプログラム
以下は、1ページ目のみPHの出力を抑制する実用的なコード例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-REPORT.
- … (環境部・データ部は省略) …
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PAGE-COUNT PIC 9(03) VALUE 0.
REPORT SECTION.
RD REP-01 PAGE LIMIT 50.
01 TYPE PAGE HEADING.
05 LINE 1 COLUMN 1 PIC X(10) VALUE “売上報告書”.
PROCEDURE DIVISION.
DECLARATIVES.
- PH出力直前に実行される宣言部
PH-CONTROL SECTION.
USE BEFORE REPORTING PAGE HEADING.
PH-PROC.
- 1ページ目の場合のみ、出力を抑止する
IF PAGE-COUNTER = 1 THEN
SUPPRESS PRINTING
END-IF.
END DECLARATIVES.
MAIN-LOGIC.
INITIATE REP-01.
- ここでDETAILを出力する際、1ページ目ならPHはスキップされる
GENERATE DETAIL-LINE.
TERMINATE REP-01.
STOP RUN.
5. 応用・注意点:現場でのバグ回避
現場でよくある失敗は、SUPPRESS PRINTINGの条件判定を誤ることです。特に「ページ番号」の管理には注意が必要です。REPORT WRITER機能が管理するページ番号(PAGE-COUNTER)は、INITIATEした瞬間に初期値がセットされます。
また、SUPPRESS PRINTINGは「その出力タイミングのみ」を無効にするものです。もし、特定のPHだけではなく、特定の条件下で常にレイアウトを崩したくない場合は、PH自体を条件分岐で制御するのではなく、今回のようにDECLARATIVESで「出力の制御」を行うのが最も安全で、保守性の高い書き方です。ぜひ現場の帳票作成で活用してください。

コメント