RPG

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

次にサブファイルの入力/更新用に利用する方法を紹介する。
サブファイルをデータの入力/更新用に利用するときに多くの誤解が発生してきている。

(1) 操作員が入力したのは、どのサブファイル・レコードか ?

READC によって操作員が入力/修正したレコードを簡単に取り出すことができる。
READC を使用しないと表示したレコードのデータを別の配列に保管しておいて、それと比
較する作業が必要となってしまう。
SFL を処理するのに作業用の配列を別に用意する必要はない。

(2) 更新レコードはサブファイル全体の何番目のレコードか ?

サブファイルが ROLLUP されてしまうと操作員が修正したレコードがサブファイル全体の何番
目のレコードであるかを識別できないと思ってはいないだろうか?
もしそうだとすると、そのために SFLSIZ = SFLPAG としてサブファイルを構成する必要が
あると思い込んでいたとしたら誤解である。
後で紹介する INFDS によって操作員が処理したときに表示されているサブファイルの先頭
のレコード番号を簡単に取り出すことができる。
これによって ROLL UP/DOWN がどのように行われていても心配する必要はないのである。

(3) カーソル位置によってサブファイル・レコードを特定することができるか ?

(2) で解説したように、カーソル位置と先頭のサブファイル・レコード番号を組み合わせること
によって簡単にサブファイル・レコードを特定することができる。

(4) RPG で操作員に表示するサブファイルの位置を設定することができるか ?

SFLPAG をオーバーしてスクロール可能な状態になっているときでも RPG で指示した行を
含む画面を強制的に操作員に表示させることができる。
例えば、サブファイルには 100レコードが収められているが、実行キーを押したときのエラー行
だけを表示させたい場合などがそうである。
エラー行を SFLRCDNBR(CURSOR) キーワードに設定すれば自動的にエラー行を含ん
だページが表示されてカーソルをその行に位置づけさせることができる。

(5) 行別の情報は配列に保管しておく必要があるか ?

サブファイル・レコード別に後で必要になる情報がある場合、作業用の配列に保管して
おいて、後で配列から取り出すような必要はない。
表示は一部であってもサブファイル・レコードと対応する必要な情報があればサブファイル・
レコードに非表示フィールドとして情報を埋め込んでおけば、非表示フィールドの値を
READREADC によって取り出して使用することができる。
サブファイル使用のために作業用の配列を用意する必要はないのだ。

(6) 操作員が修正せずにそのままで実行キーを押したことを把握できるか ?

これも誤解が多いケースであるが READC によって変更レコードが何も見つからなければ
操作員は全く変更を行わないで実行キーを押したことを検知することができる。
READC を知らないで CHANGE キーワードを使用していたとしたら誤解である。

それでは先の例をデータ更新用に変更したサブファイルの使用例を紹介しよう。
この例では、商品マスター・レコードをサブファイル処理によって追加/変更を行うことができる。
操作員が何も変更しないで、ただ実行キーを押しただけであれば処理は終了するように
できている。

【 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  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 の使い方に注意して欲しい。

【 RPG ソース】
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)

SAVDTASAVEDS をコピーすれば一度の MOVEA 命令だけですべてのフィールド値を
保管して復元することができる。

さて実行キーを押したときにには READC を繰り返すことによって変更レコードだけを取り出すよう
にしている。
READC はたとえ操作員が あるフィールド値を元の 100という値から同じ 100という値に変更した
としてもREADC として検知することができる。
REDAC を使用しないと CHANGE 標識や元の値との比較などの無駄な処理を強いられてしま
うことになる。
ここでは非表示として元の商品コードで CHAIN して新たらしい商品コードで更新しているので
商品コードでさえも変更することができる。
今回はサンプルであるので例外的な処理は考慮されていない。