RPG

223. 縦方向の配列 OCCURS

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 とは縦方向の配列である、という理解でよい。

【実行結果】

TESTTRIM