導入:なぜ「動的なファイルパス」が必要なのか
長年COBOLに携わっていると、システム移行やバッチ処理の現場で「処理対象のファイル名が実行時まで分からない」という場面に多々遭遇します。例えば、日付ごとに生成されるログファイルや、連番で出力される大量の帳票ファイルなどです。従来の手法である環境変数(EXTERNAL句やDD名)による制御は管理が煩雑になりがちですが、モダンなCOBOL(2002規格以降)ではASSIGN句にデータ項目(変数)を直接指定することで、プログラム内部から柔軟にファイルパスを制御できます。これにより、バッチ処理のメンテナンス性が飛躍的に向上します。
基礎知識:ASSIGN句とデータ項目の関係
通常、COBOLのSELECT句では「ASSIGN TO ‘FILE-NAME’」のように物理ファイル名を直接記述します。しかし、これではコンパイル後にファイル名を変更できません。モダンCOBOLでは、ASSIGN句に「データ項目(WORKING-STORAGE SECTION等で定義した変数)」を指定可能です。プログラム実行時にこの変数の中身を書き換えることで、COBOLランタイムは「その変数に入っている文字列」をファイルパスとして認識し、OPEN処理を行います。
実装・解決策
具体的な手順は以下の3ステップです。
1. SELECT句のASSIGN対象に、作業用領域(PIC X形式)の変数名を記述する。
2. ファイルをOPENする直前に、その変数に実際のパス(C:\DATA\FILE01.DATなど)をMOVEする。
3. OPEN文を発行する。
これにより、ループ処理内でファイル名を切り替えて連続処理を行うといった実装が容易になります。
サンプルプログラム
以下のコードは、変数を使って動的にファイルパスを切り替えてオープンする例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. DYNAMIC-FILE-OPEN.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MY-FILE ASSIGN TO WS-FILE-PATH
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD MY-FILE.
01 MY-RECORD PIC X(80).
WORKING-STORAGE SECTION.
- ファイルパスを格納する変数
01 WS-FILE-PATH PIC X(100).
01 WS-COUNT PIC 9(2).
PROCEDURE DIVISION.
- 連番ファイル(FILE01.DAT~FILE03.DAT)を順次処理する想定
PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT > 3
- 実行時にファイルパスを動的に生成して代入
STRING “C:\DATA\FILE” WS-COUNT “.DAT”
INTO WS-FILE-PATH
- ファイルを開く前に変数の中身が参照される
OPEN INPUT MY-FILE
DISPLAY “処理中: ” WS-FILE-PATH
- ここに読み込みや書き込み処理を記述
CLOSE MY-FILE
END-PERFORM.
STOP RUN.
応用・注意点
現場での実装において、特に注意すべきは「パスのクリア」と「後続処理」です。
まず、ファイル名が可変長である場合、MOVEやSTRINGを行う前に変数をスペースで初期化(INITIALIZE)することを忘れないでください。古いパス文字列が末尾に残っていると、意図しないファイルを開く原因になります。
また、処理中にOPENエラーが発生した場合、ファイルパスが正しくセットされているか(パスの存在確認や権限など)を、エラーハンドリング用のルーチンで必ずログ出力するようにしましょう。動的な制御は強力ですが、デバッグ時に「今どのファイルを開いているのか」が分かりにくくなる側面もあるため、ログの充実は必須です。

コメント