なぜ「報告書集団」を使うのか
COBOL開発の現場では、今もなお大量の帳票(レポート)を出力する業務が数多く存在します。皆さんがもし、改ページ処理や小計・合計の計算、ヘッダーの出力などをすべて手作業で制御しようとすれば、プログラムは非常に複雑になり、バグの温床となってしまいます。
そこで役立つのがCOBOLの「報告書作成機能(Report Writer)」です。特にその中核となる「報告書集団(Report Group)」を理解すれば、帳票のレイアウト定義とデータ出力を論理的に分離でき、メンテナンス性の高いコードが書けるようになります。
報告書集団の基礎知識
「報告書集団」とは、帳票の構成要素を定義する「01レベル」の記述項のことです。報告書作成機能では、帳票を単なる「行」としてではなく、「ページ見出し」「明細」「合計」といった論理的なグループとして扱います。
このグループが「いつ出力されるか」を決定するのが「TYPE句」です。例えば、TYPE IS PAGE HEADINGと指定すればページ先頭に、TYPE IS DETAILと指定すれば明細データとして自動的に出力されます。これにより、開発者は「行をどこで印刷するか」という細かい制御から解放されます。
実装の考え方
報告書集団を使用するには、DATA DIVISION内のREPORT SECTIONで帳票のレイアウトを定義します。
1. REPORT SECTIONで報告書名を定義する。
2. 01レベルで報告書集団を定義し、TYPE句で種類を指定する。
3. 手続き部(PROCEDURE DIVISION)で、INITIATE文で開始し、GENERATE文で明細を出力、TERMINATE文で終了する。
この流れを守るだけで、システム側が自動的に行送りや改ページを判断してくれます。
サンプルプログラム
以下は、明細行を定義する基本的な実装例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
- — 報告書作成機能を使用した明細出力の例 —
DATA DIVISION.
REPORT SECTION.
RD MY-REPORT
CONTROLS ARE FINAL.
- — 報告書集団の定義 —
01 TYPE IS DETAIL.
05 COLUMN 1 PIC X(10) VALUE “売上データ:”.
05 COLUMN 12 PIC ZZZ9 SOURCE WS-SALES-AMT.
WORKING-STORAGE SECTION.
01 WS-SALES-AMT PIC 9(4) VALUE 1000.
PROCEDURE DIVISION.
INITIATE MY-REPORT. > 報告書処理の開始
GENERATE DETAIL-GROUP. > 明細行の出力(システムがTYPEを判別)
TERMINATE MY-REPORT. > 報告書処理の終了
STOP RUN.
応用と注意点
現場での開発で陥りやすいのが「TYPE句の指定ミス」と「CONTROLS句の定義漏れ」です。
注意点1: TYPE IS DETAIL以外のグループ(PAGE HEADINGなど)を使用する場合、REPORT SECTIONでの定義順序には注意してください。記述順序がそのまま出力順序に影響することがあります。
注意点2: 集計(小計・合計)を行いたい場合は、必ずRD(Report Description)項目にてCONTROLS句で制御フィールドを指定してください。これがないと、自動集計機能が正しく動作しません。
最初は複雑に感じるかもしれませんが、一度この仕組みに慣れると、手書きの出力処理には戻れなくなるほど強力なツールです。ぜひ、既存の帳票プログラムを読み解く際の参考にしてください。

コメント