1. 導入:なぜCONTROL HEADINGが重要なのか
COBOLで業務システムを開発していると、必ずと言っていいほど「売上報告書」や「請求書」のような帳票出力の依頼が来ます。単なるデータの羅列ではなく、部門ごとや顧客ごとに見出しを付けて見やすく出力したい。そんな時、個別にフラグ管理をしてif文で制御していませんか?
『CONTROL HEADING (CH)』を活用すれば、データの「変わり目」を自動で検知し、見出しを自動挿入できます。コードがスッキリし、メンテナンス性が劇的に向上する、ベテランも多用する必須テクニックです。
2. 基礎知識:制御ブレイクとは?
帳票作成において、ある項目(例:部門コード)の値が変わる瞬間のことを「制御ブレイク」と呼びます。
CONTROL HEADINGは、この「値が変わった直後」に自動的に実行される処理です。例えば、「営業部」のデータを出力し終えて「開発部」のデータが来た瞬間、自動で「開発部」という見出しを印字してくれます。これにより、複雑な状態管理フラグを自前で書く必要がなくなります。
3. 実装・解決策:CHの定義方法
Report Writer機能を使用する場合、REPORT SECTION内で記述します。
基本構文は「01 TYPE IS CONTROL HEADING 項目名.」です。
この項目名の値が変化した瞬間に、その下に記述した各行が出力されます。大分類・中分類・小分類と階層がある場合は、それぞれの項目に対してCHを定義することで、自動的にネストされた見出しを作成できます。
4. サンプルプログラム
以下は、部門コードが変わるたびに部門名を表示する簡単な例です。
REPORT SECTION.
RD SAMPLE-REPORT.
01 TYPE IS PAGE HEADING.
05 LINE 1 PIC X(20) VALUE ‘売上報告書’.
- 部門コードが変わった時に実行される見出し
01 TYPE IS CONTROL HEADING DEPT-CODE.
05 LINE 2 COLUMN 1 PIC X(10) VALUE ‘部門名:’.
05 COLUMN 11 PIC X(20) SOURCE DEPT-NAME.
01 TYPE IS DETAIL.
05 LINE 3 COLUMN 5 PIC X(10) SOURCE ITEM-NAME.
05 COLUMN 20 PIC ZZZ,ZZ9 SOURCE ITEM-PRICE.
- 実際の処理部(手順部)
PROCEDURE DIVISION.
- データの取り込みループの中で以下を実行
- GENERATE DETAIL-LINE.
- これにより、DEPT-CODEが変われば自動的にCHが呼ばれます。
5. 応用・注意点:現場でのトラブル回避
現場でよくある失敗は、「ソート順序のミス」です。CONTROL HEADINGは、対象項目でデータが昇順または降順に整列(ソート)されていることが前提です。データがバラバラの状態で実行すると、何度も同じ見出しが出力されてしまいます。
また、複数のCHを定義する場合、階層の深い順(小分類→中分類→大分類)に論理を整理してください。
初心者が陥りやすいのは、CHの中で計算結果を表示しようとして、まだ集計が終わっていない値を参照してしまうケースです。基本的には「見出しの表示」に徹し、集計処理はCONTROL FOOTING(合計行)で行うのが、バグを生まない堅実な設計ルールです。

コメント