本文へスキップ
BecomeCoder

COBOLコース · 第8章 索引編成ファイルとランダムアクセス · レッスン42

キー指定での読み込み ― READ / INVALID KEY

ローカル実施

導入

索引編成ファイルの定義ができたので、実際にキーを指定して読み込む処理を書いてみましょう。順編成ファイルの 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-FILECUST-ID にセットした値のレコードを探し、見つかれば CUSTOMER-RECORDCUST-NAMECUST-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 の分岐に入ることを想像してみましょう。存在するキーと存在しないキー、両方のパターンを試すコードを書いてみてください。