導入:なぜGLOBAL属性が必要なのか
COBOLの報告書作成機能(REPORT SECTION)を使用する際、大規模な帳票になればなるほど、プログラムの肥大化が課題となります。従来、報告書記述項(RD)は定義したプログラム内でしか操作できず、処理をサブプログラムに分割したくても、出力制御をメインプログラムに引きずられるという制限がありました。
2002規格以降で利用可能な「GLOBAL」属性は、この「報告書の所有権」をスコープの範囲内で共有可能にするものです。これにより、メインで定義した帳票に対して、呼び出し先のサブプログラムから直接「GENERATE」を発行できるようになり、帳票ロジックの疎結合化と保守性の向上が実現できます。
基礎知識:RD記述項とGLOBAL属性の仕組み
報告書作成機能は、COBOLが持つ強力な帳票出力機能ですが、RD記述項は通常、そのプログラム専用の静的な構造体として扱われます。
GLOBAL属性を付与することで、そのRD記述項は「そのプログラム」および「そのプログラムに直接・間接的に含まれる(入れ子になった)プログラム」から参照可能になります。これにより、帳票のレイアウト定義と、実際のデータ編集・出力処理を行うプログラムを明確に分離できるのです。
実装:GLOBAL属性の活用
実装のポイントは、親プログラムでRD記述項に「GLOBAL」を記述し、サブプログラム側で同じ名前の報告書を定義する際に「EXTERNAL」または「GLOBAL」の仕組みを正しく認識させることです。最も一般的な設計は、帳票定義を含むプログラムを親とし、データ加工を行うサブプログラムへ制御を委譲するパターンです。
サンプルプログラム
以下は、メインプログラムから報告書をグローバル化し、サブプログラムから出力を行う構成例です。
[メインプログラム側]
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.
DATA DIVISION.
REPORT SECTION.
- GLOBALを指定することで、サブプログラムからアクセス可能にする
RD MY-REPORT GLOBAL
CONTROLS ARE FINAL
PAGE LIMIT IS 60 LINES.
… (以下、報告書の詳細定義) …
PROCEDURE DIVISION.
INITIATE MY-REPORT.
- サブプログラムを呼び出し、帳票出力を委譲する
CALL ‘SUB-PROG’.
TERMINATE MY-REPORT.
STOP RUN.
[サブプログラム側]
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-PROG.
DATA DIVISION.
REPORT SECTION.
- 親プログラムで定義された報告書を参照
RD MY-REPORT.
PROCEDURE DIVISION.
- 親で定義されたGLOBALな報告書に対してGENERATEを発行
GENERATE DETAIL-LINE.
EXIT PROGRAM.
応用・注意点:現場での運用におけるヒント
1. 階層構造の意識
GLOBAL属性は、あくまで「そのプログラムに含まれる(入れ子)」プログラムに対して有効です。別々にコンパイルされた外部プログラム間での共有を行いたい場合は、GLOBALではなく「EXTERNAL」属性の使用を検討してください。
2. コンパイルオプションの確認
古いコンパイラや設定によっては、COBOL 2002規格の構文が正しく解釈されない場合があります。現場の環境で「-std=cobol2002」のような標準規格準拠のオプションが有効になっているか、必ず事前に確認してください。
3. デバッグの難易度
GLOBAL化すると、どのプログラムでGENERATEが発行されているのか追跡が難しくなる場合があります。帳票出力のロジックが複雑な場合は、GENERATEの発行箇所を特定のモジュールに集約する設計を心がけてください。
この機能を活用することで、帳票定義が数千行に及ぶような「モンスタープログラム」を、機能単位でスリムに分割することが可能になります。ぜひ、次回の改修案件から取り入れてみてください。

コメント