【実務・中級編】ON ENDFILE条件によるファイル読み込み終了制御 – PL/Iの基本構文とデータ制御実践ガイド

【PL/I深掘り】ON ENDFILEはなぜ「フラグ管理」が正義なのか?現場で迷わない制御フローの極意

メインフレームのバッチ改修現場で、若手から一番よく受ける質問がこれだ。「`ON ENDFILE`をどう書くのが一番安全ですか?」というもの。

教科書的なリファレンスをなぞるだけなら簡単だ。だが、何百万件ものVSAMレコードを処理し、途中で異常終了が許されない基幹バッチの世界では、この「ファイル終了制御」一つがシステムの堅牢性を左右する。今日は、現場のベテランが必ず守っている、読みやすく、デバッグしやすい標準的な制御構造について、その「作法」を伝授しよう。

1. なぜ「ONユニット」の中で直接処理をしてはいけないのか

多くの初心者がやりがちな失敗が、`ON ENDFILE`のブロック内に直接`READ`文や出力処理を記述してしまうことだ。これはコードが複雑化するだけでなく、実行パスが不明瞭になり、後からデバッグする人間を地獄に突き落とすことになる。

基本は「フラグのセット」と「メインループへの復帰」。これに尽きる。ONユニットはあくまで「事象の検知」に徹し、実際の制御フローはメインの読み込みループ内で完結させるべきだ。

2. 実践的コーディング:推奨されるテンプレート

以下に、実務でそのまま使える堅牢なループ構造を示す。ポイントは`EOF_SW`というフラグを明示的に定義し、それを起点にループを制御することだ。

/i
/ ————————————————————- /
/ プログラム名: BATCH001.PLI /
/ 目的: VSAMファイルを読み込み、終了フラグでループを制御 /
/ ————————————————————- /
BATCH001: PROCEDURE OPTIONS(MAIN);

/ ファイル終了判定フラグ (BIT(1)はメモリ効率が良く、フラグには最適) /
DCL EOF_SW BIT(1) INIT(‘0’B);
DCL IN_FILE FILE RECORD INPUT;

/ ONユニットの定義:ファイル終了時にフラグを立てる /
ON ENDFILE(IN_FILE) EOF_SW = ‘1’B;

/ ファイルのオープン /
OPEN FILE(IN_FILE);

/ 最初のリード(ループ前読み) /
READ FILE(IN_FILE) INTO(IN_REC);

/ メインループ:EOFフラグが立つまで回す /
DO WHILE(^EOF_SW);

/ ここにロジックを記述 /
CALL PROCESS_DATA(IN_REC);

/ 次のレコードを読み込む /
READ FILE(IN_FILE) INTO(IN_REC);
END;

/ 後処理 /
CLOSE FILE(IN_FILE);

RETURN;

/ ロジック処理用外部プロシージャ等の定義 /
PROCESS_DATA: PROCEDURE(REC);
DCL REC CHAR(100);
/ 処理内容 /
END PROCESS_DATA;

END BATCH001;

3. ここがプロのこだわり:デバッグと可読性のポイント

コードを見て気づいたかもしれないが、あえて「前読み(ループ前のREAD)」を採用している。

  • なぜ前読みか?

`DO WHILE`のループ内で`READ`を行えば、ループの先頭で必ず終了判定が行われる。これにより、「ファイルが空だった場合」の挙動も自然に処理できるからだ。ループの途中で変に`IF`文を入れて終了判定をするよりも、圧倒的にバグが混入しにくい。

  • フラグ管理の利点

`EOF_SW`を`BIT(1)`で宣言しているのは、単なる習慣ではない。メインフレームの限られたメモリリソースを節約しつつ、論理的な真偽値として最も直感的に扱えるからだ。また、大規模な改修時に「ファイルが終了したのか」「エラーが発生したのか」を判別するための拡張(例えば`ERROR_SW`を追加する等)が容易になる。

  • BUILTIN関数の活用

もしVSAMのレコード長が可変であれば、`STG`や`LENGTH`、あるいは`ONCODE`関数を組み合わせることで、より高度な例外処理が可能になる。だが、まずはこの「フラグ制御」という基本を徹底してほしい。

4. 最後に:現場のエンジニアへ

PL/IのONユニットは、非常に強力な機能だが、使い方を誤ると「制御フローが見えないブラックボックス」になってしまう。

「動けばいい」というコードではなく、「次にこのソースを触る人が、どこで何が起きているか一目でわかるコード」を目指してほしい。特に、複数のファイル入出力を伴うバッチでは、このフラグ管理の徹底が、トラブル発生時の調査時間を劇的に短縮する。

もし、レガシーコードの解析で複雑な`GO TO`や、ネストされた`ON`ユニットに遭遇して頭を抱えたときは、この記事の構造を思い出してほしい。リファクタリングの第一歩は、常に「読みやすく、制御しやすいループ構造」への回帰から始まるものだ。

さて、次はVSAMの`ON KEY`条件の扱いについて深掘りしようか。あれもまた、現場のエンジニアを悩ませる奥深いテーマだからな。

タイトルとURLをコピーしました