1. 導入:なぜGLOBAL句が重要なのか
COBOLのシステム開発において、親プログラムでオープンしたファイルをサブプログラムで利用したいというケースは多々あります。通常、ファイルの状態を共有するには、パラメータとしてファイル制御ブロックを意識した受け渡しが必要ですが、これが煩雑になるとバグの温床となります。ここで役立つのがGLOBAL句です。これを利用することで、ファイルハンドルを意識せずに親プログラムからサブプログラムへファイルの状態をシームレスに引き継ぐことができ、コードの可読性と保守性を劇的に向上させることができます。
2. 基礎知識:GLOBAL句の仕組み
COBOLにおけるGLOBAL句は、データ記述項やファイル記述項に指定することで、その項目やファイルが定義されたプログラムおよび、その中に含まれる(入れ子構造になっている)サブプログラムから参照可能にするための指定です。
通常、COBOLのプログラムは独立したスコープを持ちますが、プログラムを入れ子(Nested Program)にすることで、親の定義を継承させることができます。この際、GLOBAL属性を持つファイルは、改めてOPEN/CLOSEを行う必要がなく、親で開いた状態のままサブプログラムでREAD/WRITEが可能となります。
3. 実装/解決策:効率的な連携手順
実装の手順は極めてシンプルです。
1. 親プログラムのFILE-CONTROL段落およびFD記述で、ファイル名にGLOBALを指定します。
2. サブプログラムを親プログラムの内部(END PROGRAMの直前)に記述します。
3. サブプログラム側では、同じ名前でファイルを定義(FD)し、GLOBAL句を付与します。
これにより、親でオープンされたファイル位置(レコードポインタ)が維持された状態で処理を継続できます。
4. サンプルプログラム
以下のコードは、親プログラムでファイルを開き、サブプログラムで読み込みを行う実用的な例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. PARENT-PROG.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
- GLOBAL句を指定してファイルを共有可能にする
SELECT DATA-FILE ASSIGN TO ‘DATA.TXT’ GLOBAL.
DATA DIVISION.
FILE SECTION.
FD DATA-FILE GLOBAL.
01 FILE-REC PIC X(80).
PROCEDURE DIVISION.
OPEN INPUT DATA-FILE.
- サブプログラムを呼び出す
CALL ‘SUB-PROG’.
CLOSE DATA-FILE.
STOP RUN.
- 入れ子構造のサブプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-PROG.
PROCEDURE DIVISION.
- 親で開いたファイルをそのまま読み込む
READ DATA-FILE
AT END DISPLAY ‘EOF’
NOT AT END DISPLAY ‘読み込み内容: ‘ FILE-REC
END-READ.
EXIT PROGRAM.
END PROGRAM SUB-PROG.
END PROGRAM PARENT-PROG.
5. 応用・注意点:現場での運用ポイント
現場で活用する上で、以下の点に注意してください。
・スコープの範囲:GLOBAL句が有効なのは、あくまで「入れ子(Nested)」になっているプログラム間のみです。別コンパイル単位のプログラム(CALL先が別ソース)では、この方法は使えません。その場合は、従来通りファイル状態を考慮した設計が必要です。
・CLOSEのタイミング:ファイル共有のメリットは「状態の引き継ぎ」ですが、逆に言うと「誰がCLOSEするのか」という責任分界点が曖昧になりがちです。基本的には、OPENした親プログラム側で責任を持ってCLOSEする設計を推奨します。
・排他制御:複数プログラムから同一ファイルにアクセスする場合、ファイルロックや排他制御が意図せず競合しないよう、アクセスの順序には十分に注意してください。
設計段階でこの機能を適切に取り入れることで、不要なパラメータ受け渡しを排除し、非常にすっきりとした構造のプログラムを作成することが可能です。ぜひ活用してください。

コメント