Index
OCCURS (表の繰り返し定義)

【用途】
レコード記述の中で、表を用いる場合に記述する句。これを極めないことにはプログラム内でテーブルの利用はできない。インデックス(指標値)をつける、つけないは用途により任意で設定を行なう。初心者には難解な項目の代表格。おいおい解説を充実させていきます。


OCCURS句


概説

表操作機能は,同じ形式のデータが複数個ある場合,それらをまとめて一つの表として扱い,以下の操作を行うことができる.

表の定義

表要素の参照

表の検索


表の定義

表は,データ記述項にOCCURS句を書くことにより定義する.

OCCURS句を指定した項目(従属する項目も含む)を表要素と呼び,その項目を繰り返し定義できる.表の大きさは,表要素の繰返し回数で決まり,この繰返し回数を反復回数と呼ぶ.反復回数は,OCCURS句で指定する.なお,OCCURS句が書かれた項目の大きさは32767バイト以内でなければならない.

表は,固定の大きさで定義でき,その次元数は各OSにより異なるが普通、3次元までは定義できる.

表の定義例
表の定義例


表要素の参照

表要素(以降,従属する項目も含む)は,その出現番号を指定して一意に参照できる.出現番号の指定は,指標名,データ名又は整数を使用して行う.

このように,出現番号により表要素を一意に参照することを添字付けと呼ぶ.


指標名による添字付け

指標名は,OCCURS句のINDEXED BY指定で定義する.指標名の領域は,コンパイラにより自動的に生成される.ただし,初期値は不定であり,使用前に必ず値を設定しなければならない.

指標名への値の設定は,SET文を実行して行う.SET文は,値の設定と,現在の値に対する加減算を行うことができる.

表要素を指標名で添字付けする場合,指標名は,他の表を定義したときの名前であってはならない.指標名の値は,SET文を実行して,指標データ項目に退避することができる.指標データ項目は,USAGE句を書き,INDEXを指定して定義する.

指標名及び指標データ項目の値は,比較条件で検査することもできる.

次に,指標名により添字付けの例を示す.

例:

Image


データ名による添字付け

データ名による添字付けの場合,添字の値は,表中の出現番号を示す.


注意事項

(a)

表中の項目を参照する場合,整数による添字付け,指標名による添字付け,2進項目による添字付け,内部10進項目による添字付け,外部10進項目による添字付けの順で,効率が良い.

(b)

添字付けで一意名を使用する場合は,4桁以下の符号付2進項目を使用した方が効率が良い.


表の検索

表の検索は,SEARCH文を実行して行う.SEARCH文を使用する場合,指標名の定義が必須である.

SEARCH文の検索方法は,表がキーを持つか否かで異なり,そのキーの値は,大小順序に従って昇順又は降順に並んでいなければならない.

表がキーを持たない場合は,ALL指定のないSEARCH文(以降,単にSEARCH文と略記する)を使用する.キーを持つ場合,ALL指定のSEARCH文(以降,SEARCH ALL文と略記する)を使用する.


キーを持たない表の検索

表の検索は,その表を定義した指標名の値で示す表要素の出現番号から始まり,条件を満足するまで,表の最後まで連続して行われる.

指標名には,検索中の表要素を参照するために,その都度出現番号を示す値が設定される.このとき,他の指標名又はデータ項目を指定して,その値も1ずつ加算することもできる.指標名は,他の表で定義した名前でもよい.

次に,SEARCH文の使用例を示す.

例:

Image


キーを持つ表の検索

表の検索は,最初の表要素から始まり,条件を満足するまで,表の最後まで連続して行われる.

表要素は,キーを持たなくてはならない.キーは,表要素自身でもよいし,それに従属する項目でもよい.

キーはOCCURS句のASCENDING KEY指定又はDESCENDING KEY指定で定義する.条件の判定は,それらのキーの値をもとに,最初に定義したキーから順番に比較しなければならない.このとき,定義したキーをすべて使用する必要はない.比較は,等しいか否かで行わなければならない.大小関係は判定できない.

以下に,SEARCH ALL文の使用例を示す.

例:

Image


可変反復データ項目と可変長項目

データ記述項に,DEPENDING ON指定を持つOCCURS句を記述することにより,表の反復回数を決めることができる.


可変長項目

集団項目に従属する項目の中に,DEPENDING ON指定を持つOCCURS句が記述されている項目(可変反復データ項目)がある場合,この集団項目の大きさは可変となる.このような項目を可変長項目と呼ぶ.

また,レコード記述中に可変反復データ項目を含む場合,そのレコード領域の長さは可変となる.これは,ファイル記述中のレコード領域だけでなく,データ部のすべてのレコード領域に対していえることである.

可変長項目の項目長は,DEPENDING ON指定の目的語(DEPENDING ON指定に記述されたデータ項目)の値によって決まる.

以下に,可変長項目の記述例を示す.

例:

Image

この例では,可変長項目はD000とD003である.D031の値が8のとき,D003の大きさは68バイト(4+(3+1*5)*8),D000の大きさは89バイト(5+6+10+68)となる.


可変長項目の大きさの決定

可変長項目の大きさは,それが参照されるときに,従属する項目中のDEPENDING ON指定の目的語の値に従って計算する.

ただし,その項目が受取り側であり,DEPENDING ON指定の目的語がそれに従属している場合は,反復数は最大値が指定されたものとみなす.


注意事項

(a)

可変長項目への転記を行う場合,その可変長項目の現在の大きさが送り側の項目より小さい場合,送り側のすべてのデータを受け取ることができない.もし,送り側のすべてのデータを受け取る必要がある場合は,DEPENDING ON指定の目的語に必要な値を設定し,領域の大きさを計算し直した後に転記を行わなければならない.
ただし,DEPENDING ON指定の目的語自身がその可変長項目内に含まれている場合には,その受取り側項目の現在の大きさは,目的語の大きさにかからわず,最大長とみなされて転記が行われる.

(b)

DEPENDING ON指定の目的語にゼロを設定すると,そのDEPENDING ON指定を含むレコード中に大きさが0バイトの可変長項目や表ができる.また,レコード領域の大きさを0バイトにすることもできる.その後,大きさが0バイトのままこれらの項目名,表及びレコード名を記述した文を実行することは避けた方がよい.


Index