RPG の命令でも OCCUR
を使う機会は少ないので、 OCCUR
には不慣れな人も多いと推測できる。
しかし、ストアド・プロシージャーを作成するときには OCCUR
は必須となる。
そこでここでは OCCUR
の基本的な使い方を紹介する。
OCCUR
を苦手と思っていた人も簡単に使い方を理解できるはずである。
まず、 RPG での配列の定義は横方向の配列であるのに対して OCCURS
は縦方向のメモリ上の配列である。
次の例では商品マスター (SHOHIN)
をすべて読み取って、各レコードの内容を OCCURS
の配列に
保管しておいてから 3 番目の OCCURS
、つまり 3 番目の商品コードを取り出して表示するプログラムである。
0001.00 H DFTNAME(TESTOCR) DATEDIT(*YMD/) 0002.00 F********** OCCUR のテスト ******************************************** 0003.00 FSHOHIN IF E K DISK 0004.00 F********************************************************************** 0005.00 D SHODTA E DS EXTNAME(SHOHIN) 0006.00 D OCCURS(9999) 0007.00 D RECDTA 1 512 0008.00 0009.00 D N S 4S 0 0010.00 D P S 4S 0 0011.00 0012.00 C 1 DO *HIVAL N 0013.00 C N OCCUR SHODTA 0014.00 C READ SHOHIN 0015.00 C IF %EOF 0016.00 C LEAVE 0017.00 C ENDIF 0018.00 C ENDDO 0019.00 0020.00 C* 3 番目のレコードの商品コードを表示する 0021.00 C 3 OCCUR SHODTA 0022.00 C 'SHCODE(3)=' CAT(P) SHCODE:0 DSP40 40 0023.00 C DSP40 DSPLY ANS 1 0024.00 C SETON LR
DS: SHODTA
は EXTNAME(SHOHIN)
によって定義されているように商品マスター (SHOHIN)
の
レコードそのものをバッファーとして持っている。
コンパイルすると、
5 D SHODTA E DS EXTNAME(SHOHIN) 6 D OCCURS(9999) *------------------------------------------------------------------ * データ構造 . . . . . . . : SHODTA * 外部様式 . . . . . . . . : SHOHINR : QTRFIL/SHOHIN * 様式テキスト . . . . . . : 商品マスターレコード *------------------------------------------------------------------ 7=D SHCODE 10A 8=D SHNAME 24A 9=D SHTANK 7S 0 10=D SHSCOD 4A
のように展開される。
この商品マスターの 1 レコード分のバッファーが
OCUURS(9999)
と 9999 個定義されていることになる。
次に
0012.00 C 1 DO *HIVAL N 0014.00 C READ SHOHIN 0018.00 C ENDDO
の LOOP の読取りの中で
0013.00 C N OCCUR SHODTA
の OCCUR
によって SHPDTA
の N 番目のレコードにセットしたことを意味している。
つまり、配列風に書けば SHODTA(N)
という意味である。
配列指標を N にセットしたことを意味している。
この LOOP によって商品マスターのレコード情報はすべて SHODTA
配列に保管されたので
0020.00 C* 3 番目のレコードの商品コードを表示する 0021.00 C 3 OCCUR SHODTA 0022.00 C 'SHCODE(3)=' CAT(P) SHCODE:0 DSP40 40 0023.00 C DSP40 DSPLY ANS 1
によって 3 番目のレコードの内容を取り出すことができるようになる。
これが OCCUR
の使い方であり、 OCCURS
とは縦方向の配列である、という理解でよい。