導入
前のレッスンでは WS-SCORE(1) のように数値を直接書いて添字を指定しました。しかし実務では「変数を使って添字を動かしながら」表全体を処理することがほとんどです。この添字の指定方法には、大きく2つの流儀があります。
説明
1. SUBSCRIPT(通常の変数を添字として使う)
WORKING-STORAGE SECTIONで宣言した普通の数値項目を、添字として使えます。
01 WS-SCORES.
05 WS-SCORE PIC 9(3) OCCURS 5 TIMES.
01 WS-IDX PIC 9(2).
PROCEDURE DIVISION.
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 5
DISPLAY WS-SCORE(WS-IDX)
END-PERFORM.
第5章で学んだ PERFORM VARYING と組み合わせて、WS-IDX を1から5まで動かしながら WS-SCORE(WS-IDX) にアクセスする——これがOCCURSを走査する最も基本的な形です。
2. INDEXED BY(専用のインデックスを使う)
OCCURS句に INDEXED BY を付けると、その表専用のインデックスを使えるようになります。
01 WS-SCORES.
05 WS-SCORE PIC 9(3) OCCURS 5 TIMES
INDEXED BY WS-SCORE-IDX.
PROCEDURE DIVISION.
PERFORM VARYING WS-SCORE-IDX FROM 1 BY 1
UNTIL WS-SCORE-IDX > 5
DISPLAY WS-SCORE(WS-SCORE-IDX)
END-PERFORM.
INDEXED BY WS-SCORE-IDX…WS-SCORE-IDXというインデックス名を宣言します。これはPICTURE句を持つ普通の変数ではなく、コンパイラが内部的に管理する特別な仕組みです。- インデックスは、次のレッスンで学ぶ
SEARCH文とセットで使うと特に威力を発揮します。 - 処理系によっては、インデックスを使ったアクセスのほうが、通常のSUBSCRIPTより高速に処理されることがあります(表の先頭からの相対位置を直接扱えるため)。
どちらを使うべきか迷ったら、まずは普通の数値変数(SUBSCRIPT)を使えば十分です。SEARCH文を使う場面になったら、INDEXED BYを検討する、という流れで問題ありません。
試すには
WS-SCORE OCCURS 5 TIMES INDEXED BY WS-IDX のように宣言し直し、SUBSCRIPT版と同じ結果になることを確認してみましょう。宣言の書き方は変わっても、WS-SCORE(WS-IDX) というアクセスの形は同じです。