1. 導入:なぜ「相対移動」が重要なのか
COBOLのテーブル(配列)操作において、単純な「1つずつ進める」処理だけで満足していませんか?実務では、データ構造が複雑な場合や、特定の条件を満たすレコードまで一気に飛ばしたい場面が多々あります。
今回解説する「指標名の相対移動(SET … UP/DOWN BY)」は、固定値ではなく変数を用いてインデックスを制御する手法です。これにより、不規則な間隔のデータ抽出や、スキップ処理を簡潔に記述でき、保守性と処理速度の両面で大きなメリットが得られます。
2. 基礎知識:指標名 (Index-name) とは
COBOLの 指標名 (Index-name) は、OCCURS句で定義されたテーブルの要素を指し示すポインタのようなものです。添字(Subscript)と異なり、指標名はメモリ上のオフセットを直接保持しているため、内部的な計算負荷が少なく、高速なデータアクセスが可能です。
通常、PERFORM VARYINGなどで自動制御されますが、SET文を使うことで、開発者が意図したタイミングで値を操作(増減)させることができます。
3. 実装と解決策:変数による制御
SET文の UP BY / DOWN BY 句を使う際、固定値(例:UP BY 1)だけでなく、データ項目(WS-OFFSET-VALなど)を指定することで、柔軟なジャンプが可能になります。
例えば、マスターファイルのフラグを見て「次の有効レコードまで5つ飛ばす」といった複雑なロジックを、計算式を介さず直感的に実装できます。
4. サンプルプログラム
以下は、不規則な間隔で配置された「更新対象データ」を、オフセット値を読み込みながら抽出するサンプルです。
- ——————————————————–
- テーブル走査サンプル:相対移動によるジャンプ処理
- ——————————————————–
WORKING-STORAGE SECTION.
01 WS-TABLE-AREA.
05 WS-DATA OCCURS 100 INDEXED BY WS-IDX.
10 WS-VAL PIC X(10).
01 WS-OFFSET-VAL PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
SET WS-IDX TO 1.
PERFORM UNTIL WS-IDX > 100
- 移動量を取得(例:0の場合は終了、それ以外はジャンプ)
MOVE FUNCTION RANDOM-OFFSET TO WS-OFFSET-VAL
IF WS-OFFSET-VAL = 0
EXIT PERFORM
END-IF
- 指標名を動的な値分だけ前進させる
SET WS-IDX UP BY WS-OFFSET-VAL
- 範囲外チェック(安全のため必須)
IF WS-IDX <= 100 DISPLAY "処理対象データ: " WS-VAL(WS-IDX) END-IF END-PERFORM.
5. 応用・注意点:現場で陥りやすい罠
相対移動を使いこなす上で、以下の2点に注意してください。
1. 範囲外参照(Index Out of Range)
UP BYで移動した結果、テーブルの最大要素数を超えると、プログラムが異常終了(ABEND)する可能性があります。必ず移動後に「IF WS-IDX > 100」のような範囲チェックを行うか、最大値を超えないよう制御を組み込んでください。
2. 添字との混同
指標名はあくまで内部的なオフセットです。MOVEなどで数値を直接代入しようとせず、必ず SET文 を使用してください。また、指標名はテーブル専用であるため、計算処理などにそのまま流用する際は、一度データ項目に変換する必要がある点も忘れないようにしましょう。
このテクニックを習得すれば、複雑なネスト構造を持つロジックを大幅にスリム化できます。ぜひ現場のバッチ処理などで活用してみてください。

コメント