Index
SEARCH

【用途】
項目検索。テーブル内を検索し同一のアイテムを検索します。これもよく利用されますね。憶えたほうがよいでしょう。

【使用例】
・WK-TABLE内を検索する。XX-SIMEICDと同一の氏名コードのデータが存在する場合にはOKをFLGに、
存在しない場合にはNGを転送する。

SEARCH WK-TABLE
 WHEN WK-SIMEICD(IDX) = XX-SIMEICD
      MOVE "ON" TO FLG
 AT END
      MOVE "NG" TO FLG
END-SEARCH.

SEARCH文


機能

SEARCH(表引き)文は,指定した条件を満足する表要素を探し,対応する指標の値がその表要素を指すようにする.


一般形式

【書き方1】
Image

【書き方2】
Image


構文規則

(1)

一意名-1は,添字や部分参照子を付けてはならない.その一意名-1の記述には,INDEXED BY指定を持つOCCURS句がなければならない.更に,書き方2における一意名-1の記述には,OCCURS句の中にKEY IS(キーは)指定が入っていなければならない.

(2)

一意名-2は,指標データ項目又は整数項目でなければならない.一意名-1に関係付けられたOCCURS句中のINDEXED BY指定で記述した最初の(又は唯一の)指標名によって一意名-2に添字を付けてはならない.

(3)

書き方1の条件-1は,どのような条件式であってもよい.

(4)

書き方2では,条件名は,単一の値だけをもつように定義しておかなければならない. そして,条件名に関連付けられたデータ名は,一意名-1のOCCURS句中のKEY IS指定の中に書いていなければならない.データ名-1,データ名-2は,修飾してもよい.データ名-1,データ名-2は,必要なら他の添字とともに,一意名-1用の最初の指標名で添字付けしなければならない.更に,これらのデータ名は,一意名-1のOCCURS句中のKEY IS指定の中に書いてなければならない.一意名-3若しくは一意名-4又は算術式-1若しくは算術式-2の中の一意名などは,一意名-1のOCCURS句のKEY IS指定の中に書いてあってはならない.また,これらは,一意名-1用の最初の指標名で添字付けしてあってはならない.
書き方2で,一意名-1のOCCURS句のKEY IS指定中の,あるデータ名又はそのデータ名に関連付けられている条件名を書いた場合,一意名-1のOCCURS句のKEY IS指定中でそのデータ名より前のデータ名又はそれに関連付けられている条件名を,すべて書かなければならない.

例:
SEARCH文の書き方2におけるWHEN指定の例

次の表がデータ部で定義されているとする.

Image

このとき,手続き部での正しいWHEN指定は,次のようになる.

Image

(5)

END-SEARCH(SEARCH文の終わり)指定を書いた場合は,NEXT SENTENCE(次の完結文)指定を書いてはならない.

(6)

データ名-1,データ名-2,一意名-3,一意名-4,定数-1及び定数-2の項類は,ブールであってはならない.


3.6.22.4 一般規則

(1)

SEARCH文の範囲は,次のいずれかで終わる.
(a)

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

(b)

分離符の終止符

(c)

直前のIF文に対応するELSE指定又はEND-IF指定.

(2)

書き方1のSEARCH文は,そのときの指標の値から始める遂次表引き操作を行う.
(a)

SEARCH文の実行を始めた時,一意名-1用の指標名に一意名-1の最高の出現番号より大きい値が入っていると,表引きは直ちに終わりとなる.AT END(終了)指定があればその無条件文-1を実行し,なければ制御はSEARCH文の終わりに移る.

(b)

SEARCH文の実行を始めたとき,一意名-1用の指標名に一意名-1の最高の出現番号以下の値が入っていると,SEARCH文は,以下の動作を行う.
(i)

SEARCH文は,書いてある順に条件を検査する.検査される項目の番号として,そのときの指標名の値を用いる.

(ii)

どの条件も満足されないときは,一意名-1用の指標名の値を増やして次の要素がみられるようにする.

(iii)

指標名の新しい値を使って,上の処理を繰り返す.

(iv)

一意名-1用の指標名の新しい値が表の範囲外の出現番号になると,上の(a)で述べたような終わり方をする.

(v)

条件を検査していて,条件の一つが満足されると,表引きはすぐ終わりとなり,その条件にともなう無条件文に制御を移す.NEXT SENTENCEであれば次の実行完結文に移る.指標名には,この条件を満足させたときの出現番号の値が残る.

(3)

書き方2のSEARCH文では,SEARCH ALL(非遂次表引き)の操作結果は,次の条件を満足するときだけ規定する.
(a)

表の中のデータは,一意名-1のOCCURS句のKEY IS指定の記述に従って,昇順又は降順に並んでいること.

(b)

WHEN指定に書かれたキーの内容が,表要素を一意に識別していること.

(4)

書き方2のSEARCH文は,非遂次表引き操作を行う.
(a)

一意名-1用の指標名の当初の値が無視される.その指標名の値は,コンパイラの決めた表引き方法に従って変化する.

(b)

(a)を実行中,その指標名の値は,表の最後の要素の番号の値より大きくはならない.また,表の最初の要素の番号の値より小さくなることもない.

(c)

上記の範囲内のどの指標の値をとっても,WHEN指定のいずれかの条件も満足されないとき,制御はAT END指定があれば無条件文-1に移り,なければSEARCH文の終わりに移る.

(d)

(c)の場合には,指標の最後の値は規定しない.

(e)

すべての条件が満足されたときは,指票に条件を満足させた要素の番号の値が入って,制御は無条件文-2に移る.NEXT SENTENCEであれば,制御は次の実行完結文に移る.

(5)

無条件文-1又は無条件文-2がGO TO(飛越し)文で終わっていないとき,その無条件文を実行した後,制御はSEARCH文の終わりに移る.

(6)

書き方2で,表引き操作に使われる指標名は,一意名-1のOCCURS句中のINDEXED BY指定で最初に書かれた指標名だけであり,その他の指標名の値は変更されない.

(7)

書き方1で, VARYING(変更)指定を書かないと,一意名-1のOCCURS句中のINDEXED BY指定に書いた最初の指標名だけが,表引き操作に用いられる.一意名-1用の他の指標名の値は変更されない.

(8)

書き方1で,VARYING指定を書き,その指定の指標名-1が,一意名-1のOCCURS句中のINDEXED BY指定に書いてある場合,この表引きにその指標名を使う.そうでない場合又はVARYING指定に一意名-2を書く場合,一意名-1のOCCURS句中のINDEXED BY指定で与えた最初の指標名だけを表引きに使う.この場合,更に次の操作も行う.
(a)

VARYING指定で指標名-1を書き,その指標名-1が別の表のOCCURS句中のINDEXED BY指定に書いてある場合,指標名-1の表す出現番号は,一意名-1用の指標名の表す出現番号と同じだけ同時に増加する.

(b)

VARYING指定で一意名-2を書き,その一意名-2が指標データ項目の場合,その指標データ項目は,一意名-1の指標と同じだけ同時に増加する.一意名-2が指標データ項目でない場合,そのデータ項目の値は,一意名-1用の指標が増加する時に,1だけ増加する.

(9)

END-SEARCH指定は,SEARCH文の範囲を区切る.

(10)

書き方1のSEARCH文でWHEN指定が二つある場合の表引き操作の流れ図を,図3.11に示す.

図3.11 WHEN指定が二つある場合の表引き操作の流れ図
WHEN指定が二つある場合の表引き操作の流れ図


Index