導入
索引編成ファイルの定義ができたので、実際にキーを指定して読み込む処理を書いてみましょう。順編成ファイルの AT END に相当する仕組みとして、索引編成ファイルでは INVALID KEY が登場します。
説明
PROCEDURE DIVISION.
OPEN INPUT CUSTOMER-FILE.
MOVE 100234 TO CUST-ID.
READ CUSTOMER-FILE
INVALID KEY
DISPLAY "顧客番号 " CUST-ID " は見つかりません"
NOT INVALID KEY
DISPLAY CUST-NAME " : " CUST-BALANCE
END-READ.
CLOSE CUSTOMER-FILE.
STOP RUN.
MOVE 100234 TO CUST-ID.… 探したいキーの値を、あらかじめRECORD KEYに指定した項目(CUST-ID)にセットしておく。これが順編成ファイルとの決定的な違いです。「何番目のレコードか」ではなく「どのキーの値を探すか」を指定します。READ CUSTOMER-FILE…CUST-IDにセットした値のレコードを探し、見つかればCUSTOMER-RECORD(CUST-NAME・CUST-BALANCEを含む)へ読み込む。INVALID KEY… 指定したキーのレコードが存在しなかった場合の処理。NOT INVALID KEY… 正常に見つかった場合の処理。
前章の AT END(ファイルの終わりに達した)と、この章の INVALID KEY(指定したキーが存在しない)は、似ているようで意味が違います。AT END は「もう読むものがない」、INVALID KEY は「指定した特定のキーが見当たらない」という違いです。
複数の顧客番号を1件ずつ検索したいときは、次のように繰り返し使えます。
01 WS-SEARCH-IDS.
05 FILLER PIC 9(6) VALUE 100234.
05 FILLER PIC 9(6) VALUE 100999.
01 WS-ID-TABLE REDEFINES WS-SEARCH-IDS.
05 WS-SEARCH-ID PIC 9(6) OCCURS 2 TIMES.
01 WS-I PIC 9(2).
PROCEDURE DIVISION.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 2
MOVE WS-SEARCH-ID(WS-I) TO CUST-ID
READ CUSTOMER-FILE
INVALID KEY
DISPLAY CUST-ID " 見つかりません"
NOT INVALID KEY
DISPLAY CUST-NAME
END-READ
END-PERFORM.
第6章のREDEFINESとOCCURS、第5章のPERFORM VARYINGが、ここで実際の場面に組み合わさっていることに気づいたでしょうか。これまで学んだ道具が、こうして実務のコードの中でつながっていきます。
試すには
「存在しないはずの顧客番号」を CUST-ID にセットしてREADしたとき、INVALID KEY の分岐に入ることを想像してみましょう。存在するキーと存在しないキー、両方のパターンを試すコードを書いてみてください。