次にサブファイルの入力/更新用に利用する方法を紹介する。
サブファイルをデータの入力/更新用に利用するときに多くの誤解が発生してきている。
(1) 操作員が入力したのは、どのサブファイル・レコードか ?
READC
によって操作員が入力/修正したレコードを簡単に取り出すことができる。
READC
を使用しないと表示したレコードのデータを別の配列に保管しておいて、それと比
較する作業が必要となってしまう。
SFL
を処理するのに作業用の配列を別に用意する必要はない。
(2) 更新レコードはサブファイル全体の何番目のレコードか ?
サブファイルが ROLLUP されてしまうと操作員が修正したレコードがサブファイル全体の何番
目のレコードであるかを識別できないと思ってはいないだろうか?
もしそうだとすると、そのために SFLSIZ = SFLPAG
としてサブファイルを構成する必要が
あると思い込んでいたとしたら誤解である。
後で紹介する INFDS
によって操作員が処理したときに表示されているサブファイルの先頭
のレコード番号を簡単に取り出すことができる。
これによって ROLL UP/DOWN がどのように行われていても心配する必要はないのである。
(3) カーソル位置によってサブファイル・レコードを特定することができるか ?
(2) で解説したように、カーソル位置と先頭のサブファイル・レコード番号を組み合わせること
によって簡単にサブファイル・レコードを特定することができる。
(4) RPG で操作員に表示するサブファイルの位置を設定することができるか ?
SFLPAG
をオーバーしてスクロール可能な状態になっているときでも RPG で指示した行を
含む画面を強制的に操作員に表示させることができる。
例えば、サブファイルには 100レコードが収められているが、実行キーを押したときのエラー行
だけを表示させたい場合などがそうである。
エラー行を SFLRCDNBR(CURSOR)
キーワードに設定すれば自動的にエラー行を含ん
だページが表示されてカーソルをその行に位置づけさせることができる。
(5) 行別の情報は配列に保管しておく必要があるか ?
サブファイル・レコード別に後で必要になる情報がある場合、作業用の配列に保管して
おいて、後で配列から取り出すような必要はない。
表示は一部であってもサブファイル・レコードと対応する必要な情報があればサブファイル・
レコードに非表示フィールドとして情報を埋め込んでおけば、非表示フィールドの値を
READ
や READC
によって取り出して使用することができる。
サブファイル使用のために作業用の配列を用意する必要はないのだ。
(6) 操作員が修正せずにそのままで実行キーを押したことを把握できるか ?
これも誤解が多いケースであるが READC
によって変更レコードが何も見つからなければ
操作員は全く変更を行わないで実行キーを押したことを検知することができる。
READC
を知らないで CHANGE キーワードを使用していたとしたら誤解である。
それでは先の例をデータ更新用に変更したサブファイルの使用例を紹介しよう。
この例では、商品マスター・レコードをサブファイル処理によって追加/変更を行うことができる。
操作員が何も変更しないで、ただ実行キーを押しただけであれば処理は終了するように
できている。
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 B 8 7TEXT(' 商品コード ') 0008.00 A SHNAME 24O B 8 20TEXT(' 商品名 ') 0009.00 A SHTANK 7Y 0B 8 45TEXT(' 単価 ') 0010.00 A EDTCDE(K) 0011.00 A SHSCOD 4A B 8 56TEXT(' 品種コード ') 0012.00 A SHCODE_B 10A H 0013.00 A 0014.00 A R SFCTL01 SFLCTL(SFREC01) 0015.00 A TEXT(' SFL制御見出 ') 0016.00 A OVERLAY 0017.00 A* SFLPAG : 1 画面での表示行数 0018.00 A* SFLSIZ : サブファイル全体の容量 0019.00 A SFLSIZ(14) 0020.00 A SFLPAG(13) 0021.00 A 41 SFLDSPCTL 0022.00 A 42 SFLDSP 0023.00 A 44 SFLCLR 0024.00 A 45 SFLEND(*MORE) 0025.00 A ROLLUP(14 ' 次頁 ') 0026.00 A ROLLDOWN(15 ' 前頁 ') 0027.00 A CF03(03 ' 終了 ') 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)
サブファイルの明細行は入出力に変更されたのと同時に、非表示フィールド SHCODE_B
が
追加されている。
これはキーである商品コードも変更可能にするために商品マスターを読んだときの元の商品コード
を保存するためである。
次に RPG は次のとおりである。READC
の使い方に注意して欲しい。
0001.00 H DFTNAME(SFL003) DATEDIT(*YMD/) 0002.00 F********** 商品マスター更新 ************************************ 0003.00 FSFL003FM CF E WORKSTN 0004.00 F SFILE(SFREC01:RRN1) 0005.00 FSHOHIN UF A E K DISK 0006.00 F***************************************************************** 0007.00 D* 作業変数の定義 0008.00 D SAVEDS E DS EXTNAME(SHOHIN) 0009.00 D SAVDTA S 1 DIM(1024) 0010.00 D RRN1 S 4S 0 INZ 0011.00 D SFLPAG S 4S 0 INZ(13) 0012.00 D STRRRN S 4S 0 INZ(1) 0013.00 D ENDRRN S 4S 0 INZ 0014.00 C *LOVAL SETLL SHOHIN 0015.00 C EXSR SFLCLR 0016.00 C* : ファイルの読み取り 0017.00 C EXSR READ 0018.00 C*( サブ・ファイルの表示 ) 0019.00 C*----------------------------------------------------+ 0020.00 C DSPLY TAG 0021.00 C SETON 4142 0022.00 C EXFMT SFCTL01 0023.00 C SETOFF 4142 0024.00 C*----------------------------------------------------+ 0025.00 C*( CF03 )- 終了 0026.00 C *IN03 IFEQ *ON 0027.00 C SETON LR 0028.00 C LR RETURN 0029.00 C END 0030.00 C*( ROLL-UP ) 0031.00 C *IN14 IFEQ *ON 0032.00 C EXSR READ 0033.00 C END 0034.00 C*( 実行キー ) 0035.00 C SETOFF 51 0036.00 C DO *HIVAL 0037.00 C SETOFF 50 0038.00 C READC SFREC01 50 0039.00 C 50 LEAVE 0040.00 C SETON 51 0041.00 C MOVEA SAVEDS SAVDTA 0042.00 C SETOFF 90 0043.00 C SHCODE_B CHAIN SHOHIN 90 0044.00 C MOVEA SAVDTA SAVEDS 0045.00 C*----------------------------------------------------+ 0046.00 C 90 WRITE SHOHINR 0047.00 C N90 UPDATE SHOHINR 0048.00 C*----------------------------------------------------+ 0049.00 C END 0050.00 C* 51= 修正があった 0051.00 C *IN51 IFEQ *ON 0052.00 C GOTO DSPLY 0053.00 C ELSE 0054.00 C SETON LR 0055.00 C LR RETURN 0056.00 C END 0057.00 C END TAG 0058.00 C****************************************************** 0059.00 C READ BEGSR 0060.00 C****************************************************** 0061.00 C STRRRN ADD 13 ENDRRN 0062.00 C STRRRN DO ENDRRN RRN1 0063.00 C SETOFF 50 0064.00 C READ SHOHIN 50 0065.00 C 50 SETOFF 45 0066.00 C 50 LEAVE 0067.00 C MOVE RRN1 GYO 0068.00 C MOVE SHCODE SHCODE_B 0069.00 C*----------------------------------------------------+ 0070.00 C WRITE SFREC01 0071.00 C*----------------------------------------------------+ 0072.00 C END 0073.00 C ADD SFLPAG STRRRN 0074.00 C REDEND ENDSR 0075.00 C****************************************************** 0076.00 C SFLCLR BEGSR 0077.00 C****************************************************** 0078.00 C SETON 4445 0079.00 C WRITE SFCTL01 0080.00 C SETOFF 44 0081.00 C ENDSR
ファイル仕様書が更新用に変更されたのは当然であるが
0007.00 D* 作業変数の定義 0008.00 D SAVEDS E DS EXTNAME(SHOHIN) 0009.00 D SAVDTA S 1 DIM(1024)
も追加された。DSPF では商品マスターのフィールド名と同じ名前のフィールド名を DSPF でも
そのまま流用しているので意図的なフィールド名の重複がある。
しかし
0008.00 D SAVEDS E DS EXTNAME(SHOHIN)
によって商品マスター・レコードのバッファーはすべて SAVEDS
に保管されることになる。
そこで
0009.00 D SAVDTA S 1 DIM(1024)
の SAVDTA
に SAVEDS
をコピーすれば一度の MOVEA
命令だけですべてのフィールド値を
保管して復元することができる。
さて実行キーを押したときにには READC
を繰り返すことによって変更レコードだけを取り出すよう
にしている。
READC
はたとえ操作員が あるフィールド値を元の 100という値から同じ 100という値に変更した
としてもREADC
として検知することができる。
REDAC
を使用しないと CHANGE
標識や元の値との比較などの無駄な処理を強いられてしま
うことになる。
ここでは非表示として元の商品コードで CHAIN
して新たらしい商品コードで更新しているので
商品コードでさえも変更することができる。
今回はサンプルであるので例外的な処理は考慮されていない。