最後にサブファイル・レコードの取出し方法について紹介しよう。
ここでは操作員がサブファイルにカーソルを位置づけて F4キーを押したときにその
サブファイル・レコードを DSPLY 命令によって表示するというものである。
サブファイルは複数のページを持っていて、F4キーを押した時点ではどのページが
表示されているかを RPGプログラムは ROLLキーを制御していないので知る由がない。
しかし INFDS
によって現在表示されている先頭の
サブファイル・レコードのレコード番号(RRN) を取り出すことができる。
このことによって操作員が選択したサブ・ファイル・レコードを特定することができるのである。
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 ソースを下記に紹介する。
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 を繰り返しているとしたら、サブファイルを十分に理解されていないせいである。
サブファイルの処理はスマートでやさしいものである。
美しい体系化されたサブファイル処理であれば、パフォーマンスにも優れ、何よりもソフトウェアの
品質が向上して保守も容易なものとなるはずである。
もし残念なことに複雑な処理が行われていたとしたら、是非リエンジニアリングか、せめて次回
以降の新規作成においては、正しいサブファイル処理に置き換えられることをお奨めする。
サブファイルは実に良くできた美しい構造を開発者に提供しているのである。