1. 導入:なぜ今、REPORT SECTIONなのか
業務システムにおいて、請求書や一覧表などの「帳票作成」は避けて通れない重要なタスクです。皆さんは、改行制御や合計行の計算をプログラム内で一生懸命コーディングしていませんか?実は、COBOLには「REPORT SECTION」という強力な機能が用意されています。これを使えば、面倒なレイアウト管理や集計処理をCOBOLのコンパイラに任せることができ、保守性の高いコードを書くことが可能になります。
2. 基礎知識:REPORT SECTIONの仕組み
REPORT SECTIONは、DATA DIVISION(データ部)の最後に記述する特別な節です。最大の特徴は「宣言的」であること。つまり、「どこに何を配置するか」「どのタイミングで合計を出すか」を定義するだけで、プログラムが自動的に出力処理を行ってくれます。
主な構成要素は以下の通りです。
RD句(REPORT DESCRIPTION):帳票の全体構成(ページ長や行配置)を定義します。
REPORT HEADING(RH):ページの一番上に一度だけ出す情報。
PAGE HEADING(PH):各ページの先頭に出すヘッダー。
DETAIL(DE):メインとなる明細行。
CONTROL FOOTING(CF):データの区切り(キーブレイク)で合計などを出す行。
3. 実装と解決策
REPORT SECTIONを使うには、FILE SECTIONで「REPORT IS」句を使って報告書名を指定し、PROCEDURE DIVISIONで「GENERATE」命令を呼び出すだけでOKです。複雑なループ処理やカウンタ変数の管理から解放されるため、バグの混入を大幅に減らすことができます。
4. サンプルプログラム
以下は、売上データを読み込み、部門ごとの合計を出力するシンプルな例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO ‘SALES.DAT’.
DATA DIVISION.
FILE SECTION.
FD SALES-FILE REPORT IS SALES-REPORT.
01 SALES-REC.
05 DEPT-ID PIC X(04).
05 AMOUNT PIC 9(08).
REPORT SECTION.
RD SALES-REPORT
CONTROLS ARE DEPT-ID
PAGE LIMIT 60 LINES.
01 TYPE PAGE HEADING.
05 COLUMN 20 “— 売上報告書 —“.
01 TYPE DETAIL.
05 COLUMN 05 PIC X(04) SOURCE DEPT-ID.
05 COLUMN 15 PIC ZZZ,ZZZ,ZZ9 SOURCE AMOUNT.
01 TYPE CONTROL FOOTING DEPT-ID.
05 COLUMN 05 “合計:”.
05 COLUMN 15 PIC ZZZ,ZZZ,ZZ9 SUM AMOUNT.
PROCEDURE DIVISION.
OPEN INPUT SALES-FILE.
INITIATE SALES-REPORT.
PERFORM UNTIL END-OF-FILE
READ SALES-FILE AT END SET END-OF-FILE TO TRUE
NOT AT END
GENERATE SALES-REPORT > ここで自動的にレイアウト出力
END-READ
END-PERFORM.
TERMINATE SALES-REPORT.
CLOSE SALES-FILE.
STOP RUN.
5. 応用・注意点:現場での活用ポイント
制御のタイミングを理解する:REPORT SECTIONを使う際、もっとも注意すべきは「キーブレイク」のタイミングです。CONTROLS句で指定した項目が変化した瞬間に、自動的にCONTROL FOOTINGが呼び出されます。そのため、入力データはあらかじめそのキー順にソートしておく必要があります。
柔軟性とのトレードオフ:非常に便利ですが、複雑すぎるレイアウトや、動的に列を大きく変更するような特殊な帳票には不向きな場合があります。基本はREPORT SECTIONで、どうしても制御できない例外的な部分だけを通常のPRINT文で書くといった「使い分け」ができるようになると、一人前のCOBOL技術者といえます。ぜひ、まずは簡単なリスト出力から試してみてください。

コメント