1. 導入:なぜSEARCH文の「NEXT SENTENCE」は危険なのか
ベテランの現場では、時折「なぜか意図した通りに処理がスキップされない」というトラブルに遭遇します。その原因の多くが、SEARCH文のWHEN句で使われる「NEXT SENTENCE」です。これは単にループを抜けるだけでなく、現在のピリオドまでの処理をすべて無効化するという強力かつ予測困難な挙動を引き起こします。プログラムの可読性を保ち、後のメンテナンスで泣きを見ないために、なぜこの命令を避けるべきか、そしてどう代替すべきかを解説します。
2. 基礎知識:SEARCH文とNEXT SENTENCEの仕組み
COBOLのSEARCH文は、表(テーブル)を逐次探索する強力なツールです。ここで「NEXT SENTENCE」を使用すると、指定した条件に一致した瞬間、コンパイラは「次のピリオドまで」の全命令を無視してジャンプします。
しかし、現代のCOBOL開発において「ピリオド」は構造の区切りとして非常に曖昧です。もしIF文や他の制御構造の中にSEARCH文が埋め込まれている場合、NEXT SENTENCEは予想もしない外側の文までスキップしてしまい、プログラムの論理構造を破壊します。これが「副作用」の正体です。
3. 実装/解決策:PERFORM文への書き換え
現代のCOBOLでは、SEARCH文による検索は「フラグ制御」あるいは「PERFORM VARYING」を用いたループ処理への書き換えを強く推奨します。これにより、処理の開始点と終了点が明確になり、制御フローが予測可能になります。
4. サンプルプログラム:安全な検索処理への移行
以下に、NEXT SENTENCEに依存しない、堅牢な検索ロジックの実装例を示します。
プログラム例:
IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TABLE-DATA.
05 ITEM-ARRAY OCCURS 10 TIMES INDEXED BY IDX.
10 ITEM-CODE PIC X(04).
01 SEARCH-KEY PIC X(04) VALUE ‘A002’.
01 FOUND-FLG PIC X VALUE ‘N’.
88 IS-FOUND VALUE ‘Y’.
PROCEDURE DIVISION.
> NEXT SENTENCEを使わず、PERFORMで明示的にループを制御する
PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > 10 OR IS-FOUND
IF ITEM-CODE(IDX) = SEARCH-KEY
SET FOUND-FLG TO ‘Y’
> ここで処理を終了し、ループを抜けるのが構造化の基本
END-IF
END-PERFORM.
IF IS-FOUND
DISPLAY ‘検索成功: インデックス ‘ IDX
ELSE
DISPLAY ‘対象は見つかりませんでした’
END-IF.
GOBACK.
5. 応用・注意点:現場で陥りやすいバグの回避策
現場で最も注意すべきは、「古いコードの保守」です。既存のソースコードにNEXT SENTENCEが残っている場合、安易にピリオドを外したり追加したりすると、プログラム全体の実行パスが劇的に変わってしまうリスクがあります。
もし、修正対象のコードにNEXT SENTENCEが含まれている場合は、以下の手順を守ってください。
1. まず、そのSEARCH文の範囲を明確にする(ピリオドの位置を特定する)。
2. フラグを用いたPERFORMループに書き換え、NEXT SENTENCEを完全に排除する。
3. 最後に、ピリオドを「END-PERFORM」や「END-IF」といった構造化命令に置換する。
「動くからいい」という判断で放置されたNEXT SENTENCEは、将来のバグの温床です。ぜひ、次回の保守作業で「構造化の再構築」を検討してみてください。これがベテランエンジニアとしての責任あるコード管理です。

コメント