RPG

372. RPGサイクルを使わないと

商品マスターを品種コード順に分類して品種コードで改ページする一覧表を
作成してみよう。
RPGサイクルを使わずにREAD命令だけでこれを実現しようとすると
普通に誰でもが思いつくのが次のような方法である。

[PRT003: 商品マスター一覧表]

ソースはこちらから

0001.00 H DFTNAME(PRT003) 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                                                                                   
0013.00 C*----------------------------------------------------+                           
0014.00 C     SETKEY        KLIST                                                         
0015.00 C                   KFLD                    SHSCOD                                
0016.00 C                   KFLD                    SHCODE                                
0017.00 C*----------------------------------------------------+                           
0018.00 C                   MOVEA     *ALL'-'       LIN                                   
0019.00 C                   MOVE      *LOVAL        SHCODE                                
0020.00 C     *LOVAL        SETLL     SHOHINL1                                            
0021.00 C                   DO        *HIVAL                                              
0022.00 C                   SETOFF                                       50               
0023.00 C                   READ      SHOHINL1                               50           
0017.00 C*----------------------------------------------------+                         
0018.00 C                   MOVEA     *ALL'-'       LIN                                 
0019.00 C                   MOVE      *LOVAL        SHCODE                              
0020.00 C     *LOVAL        SETLL     SHOHINL1                                          
0021.00 C                   DO        *HIVAL                                            
0022.00 C                   SETOFF                                       50             
0023.00 C                   READ      SHOHINL1                               50         
0024.00 C   50              LEAVE                                                       
0025.00 C     SHSCOD        IFNE      BEFCOD                                            
0026.00 C                   MOVE      SHSCOD        BEFCOD                              
0027.00 C     *LIKE         DEFINE    SHSCOD        BEFCOD                              
0028.00 C                   SETOFF                                       40             
0029.00 C     SHSCOD        CHAIN     HINSHU                             99             
0030.00 C                   ENDIF                                                       
0031.00 C*( 明細印刷 )                                                                  
0032.00 C*-------------------------------------------------------------------------+    
0033.00 C                   SETON                                        42        |    
0034.00 C                   EXSR      OUTPUT                                       |    
0035.00 C*-------------------------------------------------------------------------+    
0036.00 C                   ADD       1             KENSU             7 0           件数
0037.00  *                                                                              
0038.00 C                   ENDDO                                                       
0039.00 C*-------------------------------------------------------------------------+    
0040.00 C                   SETON                                        LR49      |    
0041.00 C                   EXSR      OUTPUT                                       | 
0042.00 C*-------------------------------------------------------------------------+ 
0043.00 C                   RETURN                                                   
0044.00 C******************************************************                      
0045.00 C     OUTPUT        BEGSR                                                    
0046.00 C******************************************************                      
0047.00 C  N40              SETON                                        4041        
0048.00 C                   EXCEPT                                                   
0049.00 C   OF              SETOFF                                       40OF        
0050.00 C                   SETOFF                                       414243      
0051.00 C                   SETOFF                                       444546      
0052.00 C                   SETOFF                                       474849      
0053.00 C                   ENDSR                                                    
0054.00 OQPRINT    E    41                     2 06                                  
0055.00 O                       UDATE         Y      8                               
0056.00 O                                           14 ' 作成 '                      
0057.00 O                       HDR(1)              82                               
0058.00 O                                          128 'PAGE.'                       
0059.00 O                       PAGE          Z    131                               
0060.00 O          E    41                     1                                     
0061.00 O                                           12 ' 品種コード '                
0062.00 O                       SHSCOD              16                               
0063.00 O                                           24 ' 品種名 '                    
0064.00 O                       HNSNAM              38                               
0065.00 O          E    41                     1                          
0066.00 O                       LIN                132                    
0067.00 O          E    41                     1                          
0068.00 O                                           12 ' 商品コード '     
0069.00 O                                           34 ' 商品名 '         
0070.00 O                                           68 ' 単価 '           
0071.00 O          E    41                     1                          
0072.00 O                       LIN                132                    
0073.00 O          E    42                     2                          
0074.00 O                       SHCODE              11                    
0075.00 O                       SHNAME              46                    
0076.00 O                       SHTANK        J     70                    
0077.00 O          E    49                     1                          
0078.00 O                                           40 ' 処理件数 '       
0079.00 O                                           57 '. . . . . . . . .'
0080.00 O                       KENSU         2     65                    
0081.00 **  HDR              
0082.00  商品マスター一覧表  


    

実行結果

                                                    スプール・ファイルの表示                                                      
 ファイル . . . :   QPRINT                                                                            ページ/行     1/6          
 制御 . . . . . .                                                                                     桁             1 - 127      
 検索 . . . . . .                                                                                                                 
 *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+..  
 20/08/24 作成                                      商品マスター一覧表                                                      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                                                            
 20/08/24 作成                                      商品マスター一覧表                                                      PAGE  
  品種コード 0002 品種名  ビデオデッキ                                                                                            
 -------------------------------------------------------------------------------------------------------------------------------  
  商品コード                商品名                              単価                                                              
                                                                                                                          続く ...
F3= 終了    F12= 取消し    F19= 左    F20= 右    F24= キーの続き                                                                  

[解説]

これは数学の解法で言えば最も初歩的で不細工な方法である。
DO-*HIVAL で READ で回して品種コードが変わったかと調べているだけである。

0025.00 C     SHSCOD        IFNE      BEFCOD                                            
0026.00 C                   MOVE      SHSCOD        BEFCOD                              
0027.00 C     *LIKE         DEFINE    SHSCOD        BEFCOD                              
0028.00 C                   SETOFF                                       40             
0029.00 C     SHSCOD        CHAIN     HINSHU                             99             
0030.00 C                   ENDIF 

品種コードを比較するだけの単純な例であればこれでも足りるのだが
複雑な事例になればこの方法ではバグを生じる可能性がかなり高い。


 部門コード   品種コード    商品コード
  ===========  ===========   ==========================
   01           0001          SH-001
   01           0002          SH-003
   02           0002          NV-004
   :             :              :

このような場合、つまり部門コード順、品種コード順、商品コード順に並べて
品種コードで改ページするという場合は部門コードが01から02に変わっても
品種コードは 0002 から 0002 と変わっていない例が発生している。
プログラマーはこのような場合も想定したロジックを組む必要があるが
先の事例では汎用的であるとは言えない。
さらに複雑な事例になるとロジックはますます複雑なものとなってしまう。

比較ではなくREADEなどで構造化する方法もあるがロジックとして決して
やさしくはない。