導入:なぜ今、Report Writerなのか
現代のWeb開発では、ReactやVue.jsといったテンプレートエンジンが当たり前のように使われていますが、実はCOBOLには1960年代から「Report Writer(RW)」という、極めて強力な宣言的テンプレート機能が存在していました。帳票開発において、「どこに何を出すか」というレイアウト定義と、「どのデータを渡すか」というロジックを完全に分離できるこの機能は、複雑な報告書作成の工数を劇的に削減します。メンテナンス性の高いシステムを構築するために、今一度この先人の知恵を振り返ってみましょう。
基礎知識:Report Writerの仕組み
Report Writerは、プログラム内で「出力形式」を定義し、データが揃ったタイミングで「出力命令」を投げるだけで、改ページ処理やヘッダー・フッターの制御、合計行の算出を自動化する機能です。
通常の手続き型プログラミングでは、改行のたびに「行数カウンター」を回し、ページ溢れを判定するコードを書かなければなりませんが、RWを使用すれば、データ構造(FD定義)とレイアウト(RD定義)を紐付けるだけで、面倒な制御をコンパイラが肩代わりしてくれます。
実装:宣言的レイアウトの書き方
RWを利用するには、環境部で出力先を定義し、データ部で「REPORT SECTION」を記述します。ここでページヘッダー(PH)、詳細行(DE)、ページフッター(PF)を定義することで、テンプレートを作成します。
サンプルプログラム:レポート出力の基本構成
以下のコードは、Report Writerを用いた帳票作成の最小単位です。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRINT-FILE ASSIGN TO PRINTER.
DATA DIVISION.
FILE SECTION.
FD PRINT-FILE REPORT IS MY-REPORT.
WORKING-STORAGE SECTION.
01 REPORT-DATA.
05 ITEM-NAME PIC X(20).
05 ITEM-VAL PIC 9(5).
REPORT SECTION.
RD MY-REPORT CONTROLS ARE FINAL.
01 TYPE PAGE HEADING.
05 LINE 1 COLUMN 1 PIC X(10) VALUE “—売上報告書—“.
01 TYPE DETAIL.
05 LINE 2 COLUMN 1 PIC X(20) SOURCE ITEM-NAME.
05 LINE 2 COLUMN 25 PIC ZZZZ9 SOURCE ITEM-VAL.
PROCEDURE DIVISION.
OPEN OUTPUT PRINT-FILE.
INITIATE MY-REPORT. > レポート処理の開始
MOVE “製品A” TO ITEM-NAME.
MOVE 100 TO ITEM-VAL.
GENERATE MY-REPORT. > 詳細行(DE)の出力
TERMINATE MY-REPORT. > レポート処理の終了
CLOSE PRINT-FILE.
STOP RUN.
応用・注意点:現場で陥りやすい罠
Report Writerを使用する際の注意点は、「手続きによる制御」と「宣言による制御」を混同しないことです。
RWを使っているのに、個別の処理内で「改行コード」や「ページ制御」を無理やり書き込むと、RWが管理している内部カウンターと矛盾が生じ、出力が崩れる原因になります。RWを使うと決めたら、出力制御はすべてRWの定義に任せ、手続き部では「データの受け渡し」と「GENERATE命令」に徹するのが、バグを防ぐ鉄則です。
また、レガシーな環境ではRWのコンパイラオプションが制限されている場合もあるため、事前にプロジェクトのコーディング規約を確認することをお勧めします。

コメント