SEARCH 文

SEARCH 文は、表を検索して、指定された条件を満たす表要素を検出し、関連付けられた指標名がその表要素を指すように調整するために使用する。

書き方 1 の一般形式


SEARCH

書き方 2 の一般形式


SEARCH - Format 2

すべての書き方に関する構文規則 (すべてのファイル)

  1. identifier-1 には添え字または指標を付けてはならない。このデータ記述には、OCCURS 句と INDEXED BY 句が含まれていなければならない。書き方 2 では、identifier-1 のデータ記述の OCCURS 句内に、KEY IS 指定も含まれていなければならない。
  2. identifier-2 を指定する場合、指標データ項目 (USAGE IS INDEX) または想定小数点の右に何もない整数データ項目とする。
  3. ANS85 END-SEARCH 指定を書いた場合、NEXT SENTENCE 指定を書いてはならない。

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

  4. MF imperative-statement-1 および imperative-statement-2 の代わりに、条件文を使用してもよい。

書き方 1 の構文規則

  1. condition-1、condition-2 などには、「手続き部」の章にある「条件式」のセクションで説明した任意の条件を書ける。
  2. OSVSVSC2MF identifier-1 (つまり表引きの対象とする表要素) は、内部浮動小数点数項目または外部浮動小数点数項目であってもよい。

書き方 2 の構文規則

  1. 使用する条件名は、すべて単一の値を持つものとして定義しておく。条件名に関連するデータ名は、identifier-1 の KEY 句の中に記述しておく。data-name-1、data-name-2 はそれぞれ修飾できる。data-name-1、data-name-2 は、それぞれ他の必要な指標や定数とともに、identifier-1 用の最初の指標名によって指標付けしておき、identifier-1 の KEY 句の中に記述しておく。identifier-3、identifier-4、または arithmetic-expression-1、arithmetic-expression-2 の中で使用する一意名は、identifier-1 の KEY 句の中に記述してあってはならず、identifier-1 用の最初の指標名によって指標付けしてあってもならない。

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

  2. OSVSVSC2MF identifier-1 (つまり表引きの対象とする表要素) は、浮動小数点数であってはならない。
  3. OSVSVSC2MF キー データ項目である data-name-1 および data-name-2 は浮動小数点数であってはならない。しかし、キー データ項目と比較する対象の identifier-3、identifier-4、literal-1、または literal-2 は、浮動小数点数であってもよい。

すべての書き方に関する一般規則

  1. SEARCH 文の範囲は、下記のいずれかによって区切られる。
    • ANS85 同じ入れ子レベルにある END-SEARCH 指定
    • 区切り文字の終止符
    • ELSE

      ANS85 または END-IF

      (前の IF 文に対応するもの)

  2. 実行された imperative-statement-1 または imperative-statement-2 に GO TO 文が含まれていなければ、制御は次の実行完結文に移される。
  3. 2 次元または 3 次元の表を作成するための OCCURS 句が含まれるデータ項目の下位に identifier-1 が属する場合、OCCURS 句の INDEXED BY 指定を通じて、表の各次元ごとに指標名を付ける。SEARCH 文 が実行されると、identifier-1 用の指標名 (および指定されていれば identifier-2 または index-name-1) だけが、値を変えられる。2 次元または 3 次元の表の全体を表引きするためには、SEARCH 文を数回実行する必要がある。指標の値を調整する必要がある場合には、SEARCH 文を実行する前に、SET 文を実行しておく。

逐次表引き書き方 1 の一般規則

  1. 書き方 1 の SEARCH 文を用いると、逐次表引き処理が行われる。このときの指標の値が、その開始点となる。
    1. SEARCH 文の実行が開始される時点で、identifier-1 用の指標データ項目の値が出現番号の最大値よりも大きいと、その SEARCH 文の実行は直ちに停止される。identifier-1 の出現番号の最大値の詳細については、OCCURS 句に説明してある (「データ部 - ファイル記述項およびデータ記述項」の章の「OCCURS 句」のセクションを参照)。このとき、AT END 指定が書いてあれば、imperative-statement-1 が実行される。AT END 指定が書いてなければ、制御は次の実行完結文に移される。
    2. SEARCH 文の実行が開始される時点で、identifier-1 用の指標データ項目の値が出現番号の最大値を超えないと、その SEARCH 文の処理が進められる (identifier-1 の出現番号の最大値の詳細については、「OCCURS 句」に説明してある)。まず、条件が書かれている順に評価される。この際、指定されていれば、検査の対象となる要素の出現番号を判定するために、指標データ項目の値が使用される。条件が満足されていない場合は、指標データ項目の値が増やされて、次の要素が参照できるようにされる。この処理が順次繰り返される。identifier-1 用の指標データ項目の値が出現番号の最大値を超えると、上記の一般規則 4a に示すとおり、その表引き処理は終了する。この間にどこかの時点で条件が満足されると、表引き処理は直ちに停止され、その条件に付随する無条件文が実行される。このとき、その指標データ項目には、条件を満足させた要素の出現番号が記録されている。
  2. VARYING 指定を書かなかった場合、表引き処理に使用される指標名は、identifier-1 の INDEXED BY 指定の中の最初の (または唯一の) 指標名だけである。identifier-1 用のその他の指標名の指標データ項目の内容は変わらない。
  3. VARYING index-name-1 指定を書いた場合、identifier-1 の INDEXED BY 指定の中に index-name-1 が書いてあれば、その指標名がこの表引き処理に使用される。そうでない場合、または VARYING identifier-2 指定を書いた場合、identifier-1 の INDEXED BY 指定の中の最初の (または唯一の) 指標名が表引きに使用される。この場合、さらに下記の処理も行われる。
    1. VARYING 指定で index-name-1 を書いた場合、この index-name-1 が別の表の INDEXED BY 指定に書いてあると、index-name-1 の指標データ項目が表す出現番号は、identifier-1 用の指標名の指標データ項目が表す出現番号と、同時に同じだけ増加される。
    2. VARYING 指定で identifier-2 を書いた場合、この identifier-2 が指標データ項目であると、この指標データ項目が表す出現番号は、identifier-1 用の指標名の指標データ項目が表す出現番号と、同時に同じだけ増加される。identifier-2 が指標データ項目でないと、この値は identifier-1 用の指標が増加されるときに、1 だけ増加される。

非逐次表引き書き方 2 の一般規則

  1. SEARCH 文で、SEARCH ALL の処理結果が正しく得られるためには、下記の条件がともに満たされる必要がある。
    1. 表の中のデータは、identifier-1 のデータ記述の ASCENDING KEY 句または DESCENDING KEY 句に指定された順番に並んでいること。
    2. WHEN 句中に書いたキーの内容が、表の要素を一意に識別するのに十分であること。
  2. 書き方 2 の SEARCH 文を用いると、非逐次表引き処理が行われる。このとき、identifier-1 用の指標データ項目の初期値は無視され、表引き処理につれて指標データ項目の値は変化する。ただし、その値が許される最大値よりも大きくなることも、許される最小値よりも小さくなることもない。表の大きさについては、「OCCURS 句」に説明してある。許容範囲内のどの指標値に関しても WHEN 句に指定された条件のうちで満たされないものがある場合、AT END 指定が書いてあれば、その imperative-statement-1 に制御が移される。AT END 指定が書いてなければ、次の実行完結文に制御が移される。どちらの場合も、指標データ項目の最後の値はどうなるかわからない。すべての条件が満たされたときは、そのときの要素の出現番号が指標データ項目に記録され、制御は imperative-statement-2 に移される。
  3. 書き方 2 では、表引き処理に使用される指標名は、identifier-1 の INDEXED BY 指定の中の最初の (または唯一の) 指標名だけである。identifier-1 用のその他の指標名の指標データ項目の内容は変わらない。
  4. OSVSVSC2MF imperative-statement-2 も NEXT SENTENCE 指定も必要ない。これらが指定されていないと、SEARCH 文は表の中の条件に一致した値に指標を設定する。

説明:

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

図 1. WHEN 指定が 2 つ含まれる表引き処理の流れ図
Flowchart of SEARCH Operation Showing Two WHEN Phrases
1 これらの処理は、SEARCH 文中に指定されたときにだけ行われる。
2 各無条件文に GO TO 文が含まれていなければ、制御は次の実行完結文に移される。