SEARCH(表引き)文

SEARCH(表引き)文は、 表を検索して、指定された条件を満足する表要素を探し出し、対応する指標名がその表要素を指すようにするために使用する。

一般形式

形式 1

形式 2

比較文字の"=" は必須であるが、他の記号と混同することを避けるために、下線を引いていないことに注意。

構文規則

すべての形式 (すべてのファイル)
  1. 一意名-1には添字または指標を付けてはならない。このデータ記述には、 OCCURS句およびINDEXED BY BY句が含まれていなければならない。形式 2 では、一意名-1のデータ記述のOCCURS句内に、KEY IS指定も含まれていなければならない。

  2. 一意名-2を指定する場合、指標データ項目(USAGE IS INDEX)または想定される小数点の右に何もない整数データ項目とする。

  3. END-SEARCH指定を書いた場合、NEXT SENTENCE指定を書いてはならない。

    END-SEARCH指定とNEXT SENTENCE指定を同時に書いてもよい。NEXT SENTENCE指定が実行されると、制御はEND-SEARCH指定の後ろに続く次の文に移されるのではなく、最も近い終止符(.)の後ろの文に移される。

  4. 無条件文-1および無条件文-2の代わりに、条件文を使用してもよい。
形式 1
  1. 条件文-1、条件文-2 などには、手続き部の章の条件式節で説明した任意の条件を書くことができる。

  2. 一意名-1(つまり表引きの対象とする表要素)は、内部浮動小数点数項目または外部浮動小数点数項目であってもよい。
形式 2
  1. 使用する条件名は、すべて単一の値をもつものとして定義しておく。条件名に関連するデータ名は、一意名-1のKEY句の中に記述しておく。データ名-1およびデータ名-2は、それぞれ修飾できる。データ名-1およびデータ名-2は、それぞれ他の必要な指標や定数とともに、一意名-1用の最初の指標名によって指標付けしておき、一意名-1のKEY句の中に記述しておく。一意名-3、一意名-4、算術式-1または算術式-2の中で使用する一意名は、一意名-1のKEY句の中に記述してあってはならず、一意名-1用の最初の指標名によって指標付けしてあってもならない。

    一意名-1のKEY句の中のデータ名を使用するとき、または一意名-1のKEY句の中のデータ名に関連する条件名を使用するとき、一意名-1のKEY句の中のそのデータ名の前にあるすべてのデータ名またはそれらに関連する条件名を使用する。

  2. 一意名-1(つまり表引きの対象とする表要素)は、浮動小数点数であってはならない。

  3. キー・データ項目であるデータ名-1およびデータ名-2は浮動小数点数であってならない。しかし、キー・データ項目と比較する対象の一意名-3、一意名-4、定数-1、定数-2は、浮動小数点数であってもよい。

一般規則

すべての形式
  1. SEARCH文の範囲は、下記のどれかによって区切られる。

    • 同じ入れ子レベルにあるEND-SEARCH指定

    • 区切り文字の終止符

    • 前のIF文に対応するELSE指定

      またはEND-IF指定

  2. 実行された無条件文-1または無条件文-2にGO TO文が含まれていなければ、制御は次の実行完結文に移される。

  3. 2次元または3次元の表を作成するためのOCCURS句が含まれるデータ項目の下位に一意名-1が属する場合、OCCURS句のINDEXED BY句を通じて、表の各次元ごとに指標名を付ける。SEARCH文が実行されると、一意名-1用の指標名(および指定されていれば一意名-2または指標名-1)だけが、値を変えられる。2次元または3次元の表の全体を表引きするためには、SEARCH文を数回実行する必要がある。指標の値を調整する必要がある場合には、SEARCH文を実行する前に、SET文を実行しておく。
形式 1
  1. 形式 1 のSEARCH文を用いると、逐次表引き処理が行われる。このときの指標の値が、その開始点となる。

    1. SEARCH文の実行が開始される時点で、一意名-1用の指標データ項目の値が出現番号の最大値よりも大きいと、そのSEARCH文の実行は直ちに停止される。一意名-1の出現番号の最大値の詳細については、OCCURS句に説明してある。(データ部 - ファイルおよびデータ記述の章のOCCURS(反復)句節を参照。) このとき、AT END指定が書いてあれば、無条件文-1が実行される。AT END指定が書いてなければ、制御は次の実行完結文に移される。

    2. SEARCH文の実行が開始される時点で、一意名-1用の指標データ項目の値が出現番号の最大値を超えないと、そのSEARCH文の処理が進められる。(一意名-1の出現番号の最大値の詳細については、データ部 - ファイルおよびデータ記述の章のOCCURS(反復)句節で説明。) まず、条件が書かれている順に評価される。この際、指定されていれば、検査の対象となる要素の出現番号を判定するために、指標データ項目の値が使用される。条件が満足されていない場合は、指標データ項目の値が増やされて、次の要素が参照できるようにされる。この処理が順次繰り返される。一意名-1用の指標データ項目の値が出現番号の最大値を超えると、上記の一般規則1a に示すとおり、その表引き処理は終了する。この間にどこかの時点で条件が満足されると、表引き処理は直ちに停止され、その条件に付随する無条件文が実行される。このとき、その指標データ項目には、条件を満足させた要素の出現番号が記録されている。

  2. VARYING指定を書かなかった場合、表引き処理に使用される指標名は、一意名-1のINDEXED BY句の中の最初の(または唯一の)指標名だけである。一意名-1用のその他の指標名の指標データ項目の内容は変わらない。

  3. VARYING指標名-1指定を書いた場合、一意名-1のINDEXED BY句の中に指標名-1が書いてあれば、その指標名がこの表引き処理に使用される。そうでない場合、またはVARYING一意名-2指定を書いた場合、一意名-1のINDEXED BY句の中の最初の(または唯一の)指標名が表引きに使用される。この場合、さらに下記の処理も行われる。

    1. VARYING指定で指標名-1を書いた場合、この指標名-1が別の表のINDEXED BY指定に書いてあると、指標名-1の指標データ項目が表わす出現番号は、一意名-1用の指標名の指標データ項目が表わす出現番号と、同時に同じだけ増加される。

    2. VARYING指定で一意名-2を書いた場合、この一意名-2が指標データ項目であると、この指標データ項目が表わす出現番号は、一意名-1用の指標名の指標データ項目が表わす出現番号と、同時に同じだけ増加される。一意名-2が指標データ項目でないと、この値は一意名-1用の指標が増加されるときに、1だけ増加される。
形式 2
  1. SEARCH文で、SEARCH ALLの処理結果が正しく得られるためには、下記の条件が共に満たされる必要がある。

    1. 表の中のデータは、一意名-1のデータ記述のASCENDING KEY句またはDESCENDING KEY句に指定された順番に並んでいること。

    2. WHEN句中に書いたキーの内容が、表の要素を一意に識別するのに十分であること。

  2. 形式 2 のSEARCH文を用いると、非逐次表引き処理が行われる。このとき、データ名-1用の指標データ項目の初期値は無視され、表引き処理につれて指標データ項目の値は変化する。ただし、その値が許される最大値よりも大きくなることも、許される最小値よりも小さくなることもない。(表の大きさについては、データ部 - ファイルおよびデータ記述の章のOCCURS(反復)句節で説明。)許容範囲内のどの指標値に関してもWHEN句に指定された条件のうちで満たされないものがある場合、AT END指定が書いてあれば、その無条件文-1に制御が移される。AT END指定が書いてなければ、次の実行完結文に制御が移される。どちらの場合も、指標データ項目の最後の値はどうなるかわからない。すべての条件が満たされたときは、そのときの要素の出現番号が指標データ項目に記録され、制御は無条件文-2に移される。

  3. 表引き処理に使用される指標名は、一意名-1のINDEXED BY句の中の最初の(または唯一の)指標名だけである。一意名-1用のその他の指標名の指標データ項目の内容は変わらない。

  4. 無条件文-2もNEXT SENTENCE指定も必要ない。これらが指定されていないと、SEARCH文は表の中の条件に一致した値に指標を設定する。

図 16-1に、WHEN指定が2つ含まれる形式 1の表引き処理の流れ図を示す。



図 16-1:WHEN 指定が2つ含まれる表引き処理の流れ図

1 これらの処理は、SEARCH文中に指定されたときにだけ行われる。
2 各無条件文にGO TO文が含まれていなければ、制御は次の実行完結文に移される。