【COBOL学習|初心者向け】COBOLの「SEARCH文」でハマらないために!指標項目の自動操作の仕組みを徹底解説

1. 導入:なぜこの知識が重要なのか

COBOLのプログラミングで、テーブル(配列)を検索する際に欠かせないのが「SEARCH文」です。しかし、初心者のうちは「なぜかループが終わらない」「期待したデータが取れない」といったトラブルに遭遇しがちです。その原因の多くは、SEARCH文が裏側で行っている「指標項目(INDEXED BY項目)の自動インクリメント」を正しく理解できていないことにあります。この仕組みをマスターすれば、バグを未然に防ぎ、効率的な検索処理が書けるようになります。

2. 基礎知識:指標項目(INDEX)とは何か

COBOLのテーブル定義には「INDEXED BY」という句があります。これは、テーブル内の要素を指し示すための「添字」を管理する項目です。
重要なのは、通常のデータ項目(PIC 9など)とは異なり、SEARCH文が実行されると、この指標項目の値はシステムによって自動的に増減されるという点です。自分で値を設定するだけでなく、SEARCH文の動作によって値が変化することを理解しておく必要があります。

3. 実装/解決策:SEARCH文の挙動を制御する

SEARCH文を実行する際は、必ず「開始位置(通常は1)」をセットしてから処理を開始します。SEARCH文は、WHEN句の条件に合致するまで、内部的に指標の値を「+1」し続けます。
ここで注意すべきなのは、SEARCH文のループ内で、自分で指標項目を「ADD 1 TO …」のように操作しないということです。これをやってしまうと、システムによる自動加算と二重にカウントされてしまい、要素を飛ばしたり、意図しない場所を参照したりする原因になります。

4. サンプルプログラム

以下は、IDを検索して名前を表示する標準的なSEARCH文の例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.

  • テーブルの定義:INDEXED BYで指標項目「IDX」を定義

01 EMP-TABLE.
05 EMP-DATA OCCURS 5 TIMES INDEXED BY IDX.
10 EMP-ID PIC 9(03).
10 EMP-NAME PIC X(10).

PROCEDURE DIVISION.

  • 検索開始前に、必ず指標を1に初期化する

SET IDX TO 1.

  • IDが003のデータを検索

SEARCH EMP-DATA
WHEN EMP-ID(IDX) = 003
DISPLAY “見つかりました: ” EMP-NAME(IDX)

  • 条件に一致しない場合、SEARCHが自動的にIDXを+1してくれる

END-SEARCH.

STOP RUN.

5. 応用・注意点:現場で役立つヒント

現場でよくあるバグとして、「SEARCH文の後に、その指標項目を使って別の処理をする」というケースがあります。
SEARCH文が終了した時点で、指標項目は「見つかった場所」または「最後まで探して見つからなかった場合(テーブルの最大値を超えた値)」を指しています。
そのため、SEARCH文の直後に「AT END」句を必ず記述し、見つからなかった場合の処理を明確に分けるのがベテランの作法です。また、条件式には必ず「テーブル名(指標項目)」という形式で記述することを忘れないようにしてください。これを守るだけで、テーブル操作の安定感は格段に上がります。

コメント

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