RPG の命令でも OCCUR を使う機会は少ないので、 OCCUR には不慣れな人も多いと推測できる。
しかし、ストアド・プロシージャーを作成するときには OCCUR は必須となる。
そこでここでは OCCUR の基本的な使い方を紹介する。
OCCUR を苦手と思っていた人も簡単に使い方を理解できるはずである。
まず、 RPG での配列の定義は横方向の配列であるのに対して OCCURS は縦方向のメモリ上の配列である。
次の例では商品マスター (SHOHIN) をすべて読み取って、各レコードの内容を OCCURS の配列に
保管しておいてから 3 番目の OCCURS 、つまり 3 番目の商品コードを取り出して表示するプログラムである。
【 サンプル・ソース TESTOCR 】
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 とは縦方向の配列である、という理解でよい。
【実行結果】


