なぜSEARCH文の前にSET文が必要なのか?
COBOLのプログラムでテーブル(配列)を扱う際、SEARCH文は非常に強力なツールです。しかし、このSEARCH文には「前準備」を忘れると、プログラムが正しく動かないどころか、データの見落としという致命的なバグを引き起こすという特性があります。その前準備とは、SET文による指標(インデックス)の初期化です。なぜこれが必要なのか、その理由を解説します。
基礎知識:指標(インデックス)とは何か
COBOLにおけるテーブル検索で使う「指標(INDEX)」は、メモリ上の位置を直接指し示す特殊なデータ項目です。通常の数値変数(PIC 9など)と異なり、指標は「現在どこを指しているか」という情報を保持し続ける性質があります。
もし、あるプログラム内で一度SEARCH文を実行した後、再び同じテーブルを検索しようとしたとき、指標を初期化(1に戻す)しなければどうなるでしょうか? 指標は「前回の検索で終了した位置」を覚えたままになっています。その結果、テーブルの途中から検索が始まり、最初の方にあるはずのデータが見つからない、といったトラブルが発生するのです。
実装:SET文による初期化の鉄則
SEARCH文を実行する直前には、必ず SET 指標名 TO 1 という記述を入れます。これにより、検索が常にテーブルの先頭から開始されることが保証されます。これは、構造化プログラミングにおいても、プログラムの予測可能性を高めるために極めて重要な作法です。
サンプルプログラム
以下のコードは、テーブルから特定の値を探す基本的な実装例です。COPYしてコンパイル環境で試してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- テーブルの定義:OCCURS句で繰り返しを指定し、INDEXED BYで指標名を定義
01 WS-TABLE.
05 WS-ITEM OCCURS 5 TIMES INDEXED BY WS-IDX.
10 WS-NAME PIC X(10).
10 WS-VAL PIC 9(03).
PROCEDURE DIVISION.
- 検索したい値をセット
MOVE “APPLE” TO WS-NAME(1). MOVE 100 TO WS-VAL(1).
MOVE “ORANGE” TO WS-NAME(2). MOVE 200 TO WS-VAL(2).
- 【重要】検索前に必ず指標を1にセットする
SET WS-IDX TO 1.
- テーブルを検索:名前がORANGEのものを探す
SEARCH WS-ITEM
AT END DISPLAY “見つかりませんでした。”
WHEN WS-NAME(WS-IDX) = “ORANGE”
DISPLAY “検索成功!値は: ” WS-VAL(WS-IDX)
END-SEARCH.
STOP RUN.
応用・注意点:現場で陥りやすい罠
ベテランでもやりがちなミスは、「サブルーチンに処理を渡した際、戻ってきた後に指標がどうなっているか忘れてしまう」ことです。
1. 再帰呼び出しやループ内での注意:ループの中で何度もSEARCH文を使う場合、毎回必ずSET文を通るように設計してください。「一度初期化したから大丈夫」という思い込みがバグの温床になります。
2. 指標の書き換え禁止:指標は直接MOVE文などで値を代入せず、必ずSET文を使って操作しましょう。計算機内部の効率的なメモリアクセスのため、COBOLの仕様上、指標には専用の操作が必要だからです。
SEARCH文は便利ですが、その裏側で「現在の位置」を誰が管理しているかを常に意識することが、堅牢なCOBOLプログラムを書くための第一歩です。ぜひ、今日からのコーディングで「SEARCHの前にはSET」を合言葉にしてください。

コメント