RPG

106. サブファイルの誤解と使用方法 (6)

最後にサブファイル・レコードの取出し方法について紹介しよう。
ここでは操作員がサブファイルにカーソルを位置づけて F4キーを押したときにその
サブファイル・レコードを DSPLY 命令によって表示するというものである。
サブファイルは複数のページを持っていて、F4キーを押した時点ではどのページが
表示されているかを RPGプログラムは ROLLキーを制御していないので知る由がない。
しかし INFDS によって現在表示されている先頭の
サブファイル・レコードのレコード番号(RRN) を取り出すことができる。
このことによって操作員が選択したサブ・ファイル・レコードを特定することができるのである。

【 DSPF ソース】
0001.00      A                                      DSPSIZ(24 80 *DS3)         
0002.00      A                                      MSGLOC(24)                 
0003.00      A                                      PRINT                      
0004.00      A          R SFREC01                   SFL                        
0005.00      A                                      TEXT(' SFL明細行 ')     
0006.00      A            GYO            4A  O  8  2TEXT('  ')               
0007.00      A            SHCODE        10A  O  8  7TEXT(' 商品コード ')       
0008.00      A            SHNAME        24O  O  8 20TEXT(' 商品名 ')           
0009.00      A            SHTANK         7Y 0O  8 45TEXT(' 単価 ')             
0010.00      A                                      EDTCDE(K)                  
0011.00      A            SHSCOD         4A  O  8 56TEXT(' 品種コード ')       
0012.00      A                                                                 
0013.00      A          R SFCTL01                   SFLCTL(SFREC01)            
0014.00      A                                      TEXT(' SFL制御見出 ')   
0015.00      A                                      OVERLAY                    
0016.00      A* SFLPAG : 1 画面での表示行数                                    
0017.00      A* SFLSIZ : サブファイル全体の容量                                
0018.00      A                                      SFLSIZ(14)                 
0019.00      A                                      SFLPAG(13)                 
0020.00      A  41                                  SFLDSPCTL                  
0021.00      A  42                                  SFLDSP                      
0022.00      A  44                                  SFLCLR                      
0023.00      A  45                                  SFLEND(*MORE)               
0024.00      A                                      ROLLUP(14 ' 次頁 ')         
0025.00      A                                      ROLLDOWN(15 ' 前頁 ')       
0026.00      A                                      CF03(03 ' 終了 ')           
0027.00      A                                      CF04(04 ' プロンプト要求 ') 
0028.00      A                                  1 27' 商品マスター照会 '        
0029.00      A                                      DSPATR(RI)                  
0030.00      A                                      COLOR(PNK)                  
0031.00      A*( 明細行の桁見出し )                                             
0032.00      A                                  7  2'  '                      
0033.00      A                                      DSPATR(HI)                  
0034.00      A                                  7  7' 商品コード '              
0035.00      A                                      DSPATR(HI)                  
0036.00      A                                  7 20' 商品名 '                  
0037.00      A                                      DSPATR(HI)                  
0038.00      A                                  7 45' 単価 '                    
0039.00      A                                      DSPATR(HI)                  
0040.00      A                                  7 56' 品種コード '              
0041.00      A                                      DSPATR(HI)

DSPF ソースでは

0027.00      A                                      CF04(04 ' プロンプト要求 ')

を追加しただけである。

次にF4= プロンプト要求を処理する RPG ソースを下記に紹介する。

【 RPG ソース】
0001.00 H DFTNAME(SFL004) DATEDIT(*YMD/)                                     
0002.00 F**********  商品マスター照会 ************************************   
0003.00 FSFL004FM  CF   E             WORKSTN                                
0004.00 F                                     SFILE(SFREC01:RRN1)            
0005.00 F                                     INFDS(INFDS)                   
0006.00 FSHOHIN    IF   E           K DISK                                   
0007.00 F*****************************************************************   
0008.00 D*  TOPRRN: 今表示している サブ・ファイル の先頭の RRN                     
0009.00 D INFDS           DS                                                 
0010.00 D  LINE                 370    371B 0                                
0011.00 D  BRRN                 376    377B 0                                
0012.00 D  TOPRRN               378    379B 0                                
0013.00                                                                      
0014.00 D* 作業変数の定義                                                    
0015.00 D RRN1            S              4S 0 INZ                            
0016.00 D SFLPAG          S              4S 0 INZ(13)                        
0017.00 D STRRRN          S              4S 0 INZ(1)                         
0018.00 D ENDRRN          S              4S 0 INZ                            
0019.00 C     *LOVAL        SETLL     SHOHIN                                 
0020.00 C                   EXSR      SFLCLR                                 
0021.00 C*   : ファイルの読み取り                                               
0022.00 C                   EXSR      READ                                      
0023.00 C*( サブ・ファイルの表示 )                                              
0024.00 C*----------------------------------------------------+                 
0025.00 C     DSPLY         TAG                                                 
0026.00 C                   SETON                                        4142   
0027.00 C                   EXFMT     SFCTL01                                   
0028.00 C                   SETOFF                                       4142   
0029.00 C*----------------------------------------------------+                 
0030.00 C*( CF03 )- 終了                                                        
0031.00 C     *IN03         IFEQ      *ON                                       
0032.00 C                   SETON                                        LR     
0033.00 C   LR              RETURN                                              
0034.00 C                   END                                                 
0035.00 C*( CF04 )- プロンプト要求                                              
0036.00 C     *IN04         IFEQ      *ON                                       
0037.00 C     LINE          DIV       256           LIN               3 0       
0038.00 C                   MVR                     POS               3 0       
0039.00 C     LIN           SUB       8             RRN1                        
0040.00 C                   ADD       TOPRRN        RRN1                        
0041.00 C                   SETOFF                                       90     
0042.00 C     RRN1          CHAIN     SFREC01                            90     
0043.00 C     *IN90         IFEQ      *OFF                                      
0044.00 C     SHCODE        DSPLY                                               
0045.00 C                   END                                                 
0046.00 C                   END                                                 
0047.00 C*( ROLL-UP )                                                           
0048.00 C     *IN14         IFEQ      *ON                                       
0049.00 C                   EXSR      READ                                      
0050.00 C                   END                                                 
0051.00 C*( 実行キー )                                                          
0052.00 C                   GOTO      DSPLY                                     
0053.00 C     END           TAG                                                 
0054.00 C******************************************************                 
0055.00 C     READ          BEGSR                                               
0056.00 C******************************************************                 
0057.00 C     STRRRN        ADD       13            ENDRRN                      
0058.00 C     STRRRN        DO        ENDRRN        RRN1                        
0059.00 C                   SETOFF                                       50     
0060.00 C                   READ      SHOHIN                                 50 
0061.00 C   50              SETOFF                                       45     
0062.00 C   50              LEAVE                                               
0063.00 C                   MOVE      RRN1          GYO                         
0064.00 C*----------------------------------------------------+                 
0065.00 C                   WRITE     SFREC01                                   
0066.00 C*----------------------------------------------------+                 
0067.00 C                   END                                                 
0068.00 C                   ADD       SFLPAG        STRRRN                      
0069.00 C     REDEND        ENDSR                                               
0070.00 C******************************************************                 
0071.00 C     SFLCLR        BEGSR                                               
0072.00 C******************************************************                 
0073.00 C                   SETON                                        4445   
0074.00 C                   WRITE     SFCTL01                                   
0075.00 C                   SETOFF                                       44     
0076.00 C                   ENDSR

ファイル仕様書では

0003.00 FSFL004FM  CF   E             WORKSTN                                
0004.00 F                                     SFILE(SFREC01:RRN1)            
0005.00 F                                     INFDS(INFDS)

として INFDS という名前の INFDS があることが宣言されていて

0008.00 D*  TOPRRN: 今表示している サブ・ファイル の先頭の RRN                     
0009.00 D INFDS           DS                                                 
0010.00 D  LINE                 370    371B 0                                
0011.00 D  BRRN                 376    377B 0                                
0012.00 D  TOPRRN               378    379B 0

が追加されている。BRRN は定義だけで使用していないが、入出力されたサブファイル・レコード
の RRN を取り出すことができる。

F4=プロンプト要求の処理は

0035.00 C*( CF04 )- プロンプト要求                                              
0036.00 C     *IN04         IFEQ      *ON                                       
0037.00 C     LINE          DIV       256           LIN               3 0       
0038.00 C                   MVR                     POS               3 0       
0039.00 C     LIN           SUB       8             RRN1                        
0040.00 C                   ADD       TOPRRN        RRN1                        
0041.00 C                   SETOFF                                       90     
0042.00 C     RRN1          CHAIN     SFREC01                            90     
0043.00 C     *IN90         IFEQ      *OFF                                      
0044.00 C     SHCODE        DSPLY                                               
0045.00 C                   END                                                 
0046.00 C                   END

で示されるように LINE /256 によってカーソルが位置づけられた行数が LIN, 桁数が POS として
取得することができる。
サブファイル・レコードは DSPF ソースを見ておわかりのように 8行目から開始されているので

RRN1 = カーソルの行数(LIN) - 開始行(8) + サブファイルが表示されている先頭のRRN (TOPRRN)

によってサブファィル・レコードの RRN1 を特定して

0042.00 C     RRN1          CHAIN     SFREC01                            90

によってレコードを取り出している。

■ サブファイル学習のまとめ

いかがであったであろうか?サブファイルが好きになれない人やサブファイルに対してLOOP で
CHAIN や UPDATE を繰り返しているとしたら、サブファイルを十分に理解されていないせいである。
サブファイルの処理はスマートでやさしいものである。
美しい体系化されたサブファイル処理であれば、パフォーマンスにも優れ、何よりもソフトウェアの
品質が向上して保守も容易なものとなるはずである。
もし残念なことに複雑な処理が行われていたとしたら、是非リエンジニアリングか、せめて次回
以降の新規作成においては、正しいサブファイル処理に置き換えられることをお奨めする。
サブファイルは実に良くできた美しい構造を開発者に提供しているのである。