導入:なぜINPUT PROCEDUREを使うのか
COBOLの現場で大量のデータを扱う際、単にファイルをそのままソートするだけでは要件を満たせないことが多々あります。「ソートする前に特定の条件でレコードを抽出したい」「計算結果をフィールドに追加してから並べ替えたい」といった場面で活躍するのが INPUT PROCEDURE です。これを使うことで、外部のワークファイルを作成することなく、メモリ上で効率的にデータの加工とソートを完結させることができます。
基礎知識:INPUT PROCEDUREの仕組み
通常、SORT文は `USING` で入力ファイルを指定しますが、`INPUT PROCEDURE` を使うと、指定した「節(SECTION)」の中でデータを作成・編集し、それをソート用ワークファイルへ直接渡す仕組みになります。
ここで重要なのは、手続き内で RELEASE 文を使用することです。この命令が実行されるたびに、加工済みのレコードがソート用ワークファイルへと順次送り込まれます。処理が完了したら、必ずその節の最後で抜けるような構造にする必要があります。
実装・解決策:構造化のルール
実装上の最大の注意点は、「節(SECTION)」単位で記述することです。`INPUT PROCEDURE` で指定された節内の処理が終わるまで、SORT文は次の処理へ進みません。
処理の流れとしては以下の通りです。
1. 入力元ファイルをオープンする。
2. レコードを読み込み、必要な加工を行う。
3. RELEASE 文でソート用ワークファイルに書き出す。
4. 全レコード処理後、入力元ファイルをクローズする。
サンプルプログラム
以下は、入力データから特定の条件を満たすものだけを抽出し、ソートする例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SORT-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO ‘INPUT.DAT’ ORGANIZATION LINE SEQUENTIAL.
SELECT WORK-FILE ASSIGN TO ‘SORT.TMP’.
SELECT OUT-FILE ASSIGN TO ‘OUTPUT.DAT’ ORGANIZATION LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-ID PIC X(05).
05 IN-VAL PIC 9(05).
FD WORK-FILE.
01 WORK-REC.
05 W-ID PIC X(05).
05 W-VAL PIC 9(05).
FD OUT-FILE.
01 OUT-REC.
05 O-ID PIC X(05).
05 O-VAL PIC 9(05).
PROCEDURE DIVISION.
000-MAIN.
SORT WORK-FILE ON ASCENDING KEY W-ID
INPUT PROCEDURE 100-EDIT-SECTION
OUTPUT PROCEDURE 200-PRINT-SECTION.
STOP RUN.
100-EDIT-SECTION SECTION.
100-START.
OPEN INPUT IN-FILE.
PERFORM UNTIL EXIT
READ IN-FILE AT END EXIT PERFORM END-READ
> IDが’00’で始まるものだけをソート対象にする
IF IN-ID(1:2) = ’00’
MOVE IN-REC TO WORK-REC
RELEASE WORK-REC > ここでソート用ワークへ書き出し
END-IF
END-PERFORM.
CLOSE IN-FILE.
100-EXIT. EXIT.
200-PRINT-SECTION SECTION.
200-START.
OPEN OUTPUT OUT-FILE.
PERFORM UNTIL EXIT
RETURN WORK-FILE AT END EXIT PERFORM END-READ
MOVE WORK-REC TO OUT-REC
WRITE OUT-REC
END-PERFORM.
CLOSE OUT-FILE.
200-EXIT. EXIT.
応用・注意点:現場でのトラブルを避けるために
RELEASE 文を忘れると、ソート対象のデータが空のまま処理が進んでしまうため注意が必要です。また、`INPUT PROCEDURE` 内でのファイル操作(OPEN/CLOSE)は必ずその節の中で完結させてください。
もう一点、`INPUT PROCEDURE` は節単位で呼び出されるため、プログラムが複雑になると制御フローが見えにくくなることがあります。処理が長くなる場合は、段落名を細かく分けるなどして、可読性を保つ工夫を心がけましょう。これらの基本を押さえるだけで、複雑なソート処理も非常にシンプルに記述できるようになります。

コメント