導入
COBOLの実務現場において、テーブル検索は避けて通れない処理です。しかし、SEARCH文を記述する際、終了位置が不明瞭になり、特にネスト(入れ子)が深くなった場合に「どこまでがSEARCHの範囲か」が判別しづらくなるケースがあります。END-SEARCHを使用することは、コードの可読性を高め、保守性を向上させるために極めて重要です。本稿では、この範囲終了指定子を正しく活用し、堅牢なプログラムを書くためのポイントを解説します。
基礎知識
SEARCH文は、テーブル(OCCURS句で定義された配列)を順次または二分探索するための命令です。従来、SEARCH文の範囲は、記述の終わり(ピリオド)までと見なされてきました。しかし、ピリオドによる終了は、意図しない範囲まで処理を巻き込んでしまう「ロジックの暴走」の原因になります。END-SEARCHは、SEARCH文の処理範囲を明示的に区切るための「構造化制御構文」の一つであり、コンパイラに対してSEARCHの終了を明確に伝える役割を果たします。
実装/解決策
実務では、単一のSEARCH文だけでなく、複数のWHEN句を組み合わせたり、SEARCHの中に別のIF文をネストさせることが多々あります。END-SEARCHを適切に記述することで、コンパイラがSEARCHの範囲を正しく認識し、構造化された美しいコードを維持できます。特に、メンテナンス時にロジックを追加・修正する際、END-SEARCHを記述しておけば、ピリオドの位置を気にして全体の構成を書き直す手間が省けます。
サンプルプログラム
以下は、売上テーブルから特定のコードを検索し、見つかった場合に金額を更新する標準的な実装例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-ITEM OCCURS 10 TIMES INDEXED BY IDX.
10 WS-CODE PIC X(04).
10 WS-AMT PIC 9(07).
01 WS-SEARCH-KEY PIC X(04) VALUE ‘A001’.
PROCEDURE DIVISION.
SET IDX TO 1.
SEARCH WS-ITEM
AT END
DISPLAY ‘該当データなし’
WHEN WS-CODE(IDX) = WS-SEARCH-KEY
DISPLAY ‘データ発見:’ WS-AMT(IDX)
> 構造を明確にするためにEND-SEARCHを使用
END-SEARCH.
STOP RUN.
応用・注意点
現場で最も注意すべきは、「旧来のピリオド終端と混在させない」ことです。SEARCH文にEND-SEARCHを使用する場合、その範囲内での各処理(WHEN句内の処理など)の末尾にピリオドを打たないようにしてください。範囲内の処理の途中でピリオドを打ってしまうと、そこでSEARCH文自体が強制的に終了とみなされ、END-SEARCHが構文エラーになるか、意図しない動作を引き起こします。
また、複雑な条件分岐が必要な場合は、SEARCH文を単独のサブルーチンやセクションに切り出すのがベストプラクティスです。END-SEARCHを使いこなすことは、単なる構文の習得ではなく、後続のエンジニアが読みやすい「クリーンなコード」を書くための第一歩です。ぜひ、既存のソースコードを見直す際にも積極的に取り入れてみてください。

コメント