導入
COBOLでの帳票作成において、最も頭を悩ませるのが「集計」のタイミングです。データの並び順が変わるたびに小計や中計を計算し、印字するロジックを自前で組むと、どうしてもコードが複雑になり、バグの温床になりがちです。
そこで活用したいのが、REPORT SECTIONで使える「TYPE IS CONTROL FOOTING」です。これを使うことで、キー項目の変化をシステム側が自動検知し、適切なタイミングで集計結果を出力できるようになります。コードの可読性を高め、メンテナンス性を向上させるために必須のテクニックです。
基礎知識
COBOLのREPORT WRITER機能における「CONTROL FOOTING(CF)」は、特定のデータ項目(制御項目)の値が変化した瞬間に起動する処理単位です。
例えば、「部署コード」で並べ替えたデータを読み込んでいる場合、部署コードが「001」から「002」に変わった瞬間に、REPORT WRITERは自動的に「部署ごとの合計(CF)」を印字してくれます。自分でIF文を使って「前回の値と比較して…」といった制御ロジックを書く必要がないため、非常に効率的です。
実装/解決策
実装のポイントは、REPORT SECTION内で「CONTROL IS」句を使用してキー項目を定義し、その後に「TYPE IS CONTROL FOOTING」で集計行を記述することです。集計したい項目には「SUM」句を指定しておけば、レコードが読み込まれるたびに自動的に加算され、CFのタイミングでその値を印字します。
サンプルプログラム
以下のコードは、営業所コード(OFFICE-CODE)ごとの売上合計を印字する例です。
REPORT SECTION.
RD SALES-REPORT
CONTROL IS OFFICE-CODE.
01 TYPE IS DETAIL.
05 COLUMN 1 PIC X(10) SOURCE OFFICE-CODE.
05 COLUMN 20 PIC ZZZ,ZZ9 SOURCE SALES-AMT.
- 営業所コードが変わるたびに実行される小計行
01 TYPE IS CONTROL FOOTING OFFICE-CODE.
05 COLUMN 1 PIC X(15) VALUE ‘営業所合計:’.
- SUM句により、DETAILで加算された売上が自動的に合計される
05 COLUMN 20 PIC ZZZ,ZZ9 SUM SALES-AMT.
応用・注意点
現場でこの機能を使う際の最大の注意点は「入力データの整列(ソート)」です。REPORT WRITERは、指定したキー項目(今回の場合はOFFICE-CODE)が昇順または降順に並んでいることを前提として動作します。データがバラバラの状態で入力されると、意図しないタイミングでCFがトリガーされてしまいます。必ず事前にSORT処理を通すか、インデックス順に読み込まれるようにしてください。
また、複雑な階層(大計・中計・小計)が必要な場合は、CONTROL句で複数の項目をカンマ区切りで指定することで、階層に応じたCFを簡単に実装可能です。ぜひ、帳票プログラムの簡略化に役立ててください。

コメント