RPG

374. RPGサイクル-合計演算と明細演算

RPGサイクルがなかなか新しい技術者に受け入れられないのは
RPGサイクルの説明者がRPGサイクルの本質を十分、理解していないからである。

インターネットを調べてみると長々とした文章や図ばかりで
明らかにIBMマニュアルの書き写しばかりである。
RPGソース・コードの例は全く見られない。
これでは読者に理解されないのも無理はない。
RPGサイクルを「暗黙の処理」とか「RPGの基本」とか抽象的な言葉だけで
読者に理解を求めるのは無理である。

若い技術者が解説を読んで理解できなくても慌てる必要はない。
書き手が理解していないまま書いているのだから
読み手が理解できるはずはない。

そこでRPGサイクルをもう少し具体的なソースを基に学習してみよう。

最初にRPGサイクルを使わない方法で集計する演算プログラムを紹介する。

[実行]

20/08/21 作成                                      商品マスター一覧表                                                      PAGE
 品種コード 0001 品種名  カラーTV                                                                                            
-------------------------------------------------------------------------------------------------------------------------------
 商品コード                商品名                              単価                                                            
-------------------------------------------------------------------------------------------------------------------------------
 A004                 TEST A004                               134,000                                                          
 RX-AZ1                液晶テレビ 80 インチ                   300,000                                                          
 TH-19VS30             コンパクトTVBS19                 120,000                                                          
 TH-21VS30             コンパクトTVBS21                 128,000                                                          
 TH-25GF10             衛星放送内蔵TV25                   168,000                                                          
 TH-25GV10             ビデオ内蔵型TV25                   255,000                                                          
 TH-25VS30             コンパクトTVBS25                  11,300                                                          
 TH-29GF10             カラーTV画王BS29                 220,000                                                          
 TH-29GV10             ビデオ内蔵型TV29                   280,000                                                          
 TH-33VS35             カラーTV画王BS33                 350,000                                                          
                                          * 小計 *          1,966,300  
                                                              :
                                                              :                                                        

[ PRT004:集計プログラム ]

ソースはこちらから

0001.00 H DFTNAME(PRT004) DATEDIT(*YMD/)                                                      
0002.00 F**********  商品マスター一覧表 ( 集計 )**************************                    
0003.00 FSHOHINL1  IF   E           K DISK                                                    
0004.00 FHINSHU    IF   E           K DISK                                                    
0005.00 FQPRINT    O    F  132        PRINTER OFLIND(*INOF)                                   
0006.00 F                                     FORMLEN(66)                                     
0007.00 F                                     FORMOFL(62)                                     
0008.00 F*****************************************************************                    
0009.00                                                                                       
0010.00 D HDR             S             32    DIM(1) CTDATA PERRCD(1)               見出し    
0011.00 D LIN             S              1    DIM(132)                                        
0012.00 D SHOKEI          S              9P 0                                                 
0013.00 D GOKEI           S              9P 0                                                 
0014.00                                                                                       
0015.00 C*----------------------------------------------------+                               
0016.00 C     SETKEY        KLIST                                                             
0017.00 C                   KFLD                    SHSCOD                                    
0018.00 C                   KFLD                    SHCODE                                    
0019.00 C*----------------------------------------------------+                               
0020.00 C                   MOVEA     *ALL'-'       LIN                                       
0021.00 C                   MOVE      *LOVAL        SHCODE                                    
0022.00 C     *LOVAL        SETLL     SHOHINL1                                                
0023.00 C                   DO        *HIVAL                                                  
0024.00 C                   SETOFF                                       50               
0025.00 C                   READ      SHOHINL1                               50           
0026.00 C   50              LEAVE                                                         
0027.00 C     SHSCOD        IFNE      BEFCOD                                              
0028.00 C     BEFCOD        IFNE      *BLANKS                                             
0029.00 C*-------------------------------------------------------------------------+      
0030.00 C                   SETON                                        43        |      
0031.00 C                   EXSR      OUTPUT                                       |      
0032.00 C*-------------------------------------------------------------------------+      
0033.00 C                   ADD       SHOKEI        GOKEI                                 
0034.00 C                   Z-ADD     0             SHOKEI                                
0035.00 C                   ENDIF                                                         
0036.00 C                   MOVE      SHSCOD        BEFCOD                                
0037.00 C     *LIKE         DEFINE    SHSCOD        BEFCOD                                
0038.00 C                   SETOFF                                       40               
0039.00 C     SHSCOD        CHAIN     HINSHU                             99               
0040.00 C                   ENDIF                                                         
0041.00 C*( 明細印刷 )                                                                    
0042.00 C*-------------------------------------------------------------------------+      
0043.00 C                   SETON                                        42        |      
0044.00 C                   EXSR      OUTPUT                                       |      
0045.00 C*-------------------------------------------------------------------------+      
0046.00 C                   ADD       1             KENSU             7 0           件数  
0047.00 C                   ADD       SHTANK        SHOKEI                                
0048.00  *                                                                          
0049.00 C                   ENDDO                                                   
0050.00 C*-------------------------------------------------------------------------+
0051.00 C                   SETON                                        LR4943    |
0052.00 C                   EXSR      OUTPUT                                       |
0053.00 C*-------------------------------------------------------------------------+
0054.00 C                   RETURN                                                  
0055.00 C******************************************************                     
0056.00 C     OUTPUT        BEGSR                                                   
0057.00 C******************************************************                     
0058.00 C  N40              SETON                                        4041       
0059.00 C                   EXCEPT                                                  
0060.00 C   OF              SETOFF                                       40OF       
0061.00 C                   SETOFF                                       414243     
0062.00 C                   SETOFF                                       444546     
0063.00 C                   SETOFF                                       474849     
0064.00 C                   ENDSR                                                   
0065.00 OQPRINT    E    41                     2 06                                 
0066.00 O                       UDATE         Y      8                              
0067.00 O                                           14 ' 作成 '                     
0068.00 O                       HDR(1)              82                              
0069.00 O                                          128 'PAGE.'                      
0070.00 O                       PAGE          Z    131                              
0071.00 O          E    41                     1                                    
0072.00 O                                           12 ' 品種コード '         
0073.00 O                       SHSCOD              16                        
0074.00 O                                           24 ' 品種名 '             
0075.00 O                       HNSNAM              38                        
0076.00 O          E    41                     1                              
0077.00 O                       LIN                132                        
0078.00 O          E    41                     1                              
0079.00 O                                           12 ' 商品コード '         
0080.00 O                                           34 ' 商品名 '             
0081.00 O                                           68 ' 単価 '               
0082.00 O          E    41                     1                              
0083.00 O                       LIN                132                        
0084.00 O          E    42                     2                              
0085.00 O                       SHCODE              11                        
0086.00 O                       SHNAME              46                        
0087.00 O                       SHTANK        J     70                        
0088.00 O          E    43                     2                              
0089.00 O                                           50 '* 小計 *'             
0090.00 O                       SHOKEI        J     70                        
0091.00 O          E    49                     1                              
0092.00 O                                           51 '** 合計 **'           
0093.00 O                       GOKEI         J     70                        
0094.00 O          E    49                     1                              
0095.00 O                                           40 ' 処理件数 '           
0096.00 O                                           57 '. . . . . . . . .'
0097.00 O                       KENSU         2     65                    
0098.00 **  HDR            
0099.00  商品マスター一覧表


     

[解説]

小計: SHOKEI と合計: GOKEI に単価を集計していて品種コードが変わると小計を出力して
最後には合計も出力している。
これをRPGサイクルを使って記述すると次のようになる。

[PRT005:集計プログラム ]

ソースはこちらから

0001.00 H DFTNAME(PRT005) DATEDIT(*YMD/)                                                  
0002.00 F**********  商品マスター一覧表 ( 集計 )**************************                
0003.00 FSHOHINL1  IP   E           K DISK                                                
0004.00 FHINSHU    IF   E           K DISK                                                
0005.00 FQPRINT    O    F  132        PRINTER OFLIND(*INOF)                               
0006.00 F                                     FORMLEN(66)                                 
0007.00 F                                     FORMOFL(62)                                 
0008.00 F*****************************************************************                
0009.00                                                                                   
0010.00 D HDR             S             32    DIM(1) CTDATA PERRCD(1)               見出し
0011.00 D LIN             S              1    DIM(132)                                    
0012.00 D SHOKEI          S              9P 0                                             
0013.00 D GOKEI           S              9P 0                                             
0014.00                                                                                   
0015.00 ISHOHINR       01                                                                 
0016.00 I                                          SHSCOD        L1                       
0017.00                                                                                   
0018.00 C                   ADD       1             KENSU             7 0           件数  
0019.00 C                   ADD       SHTANK        SHOKEI                                
0020.00 CL1                 ADD       SHOKEI        GOKEI                                 
0021.00 C******************************************************                           
0022.00 C     *INZSR        BEGSR                                                         
0023.00 C******************************************************                           
0024.00 C                   MOVEA     *ALL'-'       LIN                   
0025.00 C                   ENDSR                                         
0026.00 OQPRINT    H    L1                     2 06                       
0027.00 O         OR    OF                                                
0028.00 O                       UDATE         Y      8                    
0029.00 O                                           14 ' 作成 '           
0030.00 O                       HDR(1)              82                    
0031.00 O                                          128 'PAGE.'            
0032.00 O                       PAGE          Z    131                    
0033.00 O          H    L1                     1                          
0034.00 O         OR    OF                                                
0035.00 O                                           12 ' 品種コード '     
0036.00 O                       SHSCOD              16                    
0037.00 O                                           24 ' 品種名 '         
0038.00 O                       HNSNAM              38                    
0039.00 O          H    L1                     1                          
0040.00 O         OR    OF                                                
0041.00 O                       LIN                132                    
0042.00 O          H    L1                     1                          
0043.00 O         OR    OF                                                
0044.00 O                                           12 ' 商品コード '     
0045.00 O                                           34 ' 商品名 '         
0046.00 O                                           68 ' 単価 '           
0047.00 O          H    L1                     1                          
0048.00 O         OR    OF                                                 
0049.00 O                       LIN                132                     
0050.00 O          D    01                     2                           
0051.00 O                       SHCODE              11                     
0052.00 O                       SHNAME              46                     
0053.00 O                       SHTANK        J     70                     
0054.00 O          T    L1                     2                           
0055.00 O                                           50 '* 小計 *'          
0056.00 O                       SHOKEI        JB    70                     
0057.00 O          T    LR                     1                           
0058.00 O                                           51 '** 合計 **'        
0059.00 O                       GOKEI         J     70                     
0060.00 O          T    LR                     1                           
0061.00 O                                           40 ' 処理件数 '        
0062.00 O                                           57 '. . . . . . . . .' 
0063.00 O                       KENSU         2     65                     
0064.00 **  HDR            
0065.00  商品マスター一覧表


     

[解説]

RPGサイクルを使って集計すると驚くほど簡単なソースで出来上がってしまう。

0019.00 C                   ADD       SHTANK        SHOKEI                                
0020.00 CL1                 ADD       SHOKEI        GOKEI

 

のたった2行だけで集計処理は完結する。
CL1 というのは合計演算と呼ばれており L1 の標識がオンになると
次の明細行:

0018.00 C                   ADD       1             KENSU             7 0           件数  
0019.00 C                   ADD       SHTANK        SHOKEI  

を実行する前に合計演算

0020.00 CL1                 ADD       SHOKEI        GOKEI 

が実行されるという仕組みである。
このような処理がユーザーが書いたプログラムの背景で行われている。
つまり(どの処理を行うかという)前後関係をユーザーが記述しなくても
合計演算は明細演算より先に行われる。
 しかもデータが読み込まれる前である。
データが読み込まれる前なのでフィールド値は変わっていない。
レコードをREADなどで読取っていないのに品種コードの値が変化したことを
検知することはユーザー(私達)がいくら工夫してもできない。
これは OS内部の処理であるからこそ可能になることなのだ。

RPGのマニュアルには文章としてこのような内部で行われる処理を
長々と説明されているのだが文章だけ読んでも恐らく読者は容易には
理解できない。
このようにしてRPGサイクルを使わない例とRPGサイクルを使った例を
比較して初めて理解できるというものである。

今回の例でRPGサイクルをどこよりも理解できたと思う。
これはRPGサイクルの利用のまだ入り口にしか過ぎないのだが
多くの紹介サイトではRPGサイクルは RPGの基礎であると称しながら
適切なサンブル・ソースを全く示していない。
ほとんどがIBMマニュアルからの書き写しに過ぎない。
書き手も理解していないので読み手はもっと理解できない。
今後は古くて新しいRPGサイクルを使ったテクニックもこのサイトで
紹介していきたい。

 今回、初めてRPGサイクルをご覧になった方はぜひ自分のファイルで
上記のサンプル・プログラムを改造して動作させて欲しい。
RPGサイクルは理論で学習するよりも試して体感して
身につくし実感できるものである。

 最後に読者へのクイズとして
小計: SHOKEI の値を消去している演算命令がここには見つからない。
これは小職の書き忘れではない。
小計: SHOKEI は正しく消去されている。
それで一体、どこで消去されているのだろうか?
RPGソースをよく眺めて考えて欲しい。