RPG

236. もう一度サブ・ファイル (1)

サブ・ファイルに関しては「101. サブファイルの誤解と使用方法 (1)」 から(7)まで解説したが
未だに十分、理解されていないようなので、ここで追加として「もう一度サブ・ファイル」シリーズを
開講したいと思う。

サブ・ファイルの機能の詳細は「サブファイルの誤解と使用方法」シリーズをじっくり読んで頂きたい。
このシリーズではサブ・ファイルのポイントだけを紹介していく。

初めは、

サブ・ファイルは出力フィールドであっても入力できる

である。
これはどういうことかというと、一般の(サブ・ファイル・レコードではない)表示レコードでは
DDSソースで下記のように出力として指定されたフィールドは、当然、READ 命令や EXFMT 命令でも
読み取ることはできない。

  A            DSPMOD         6A  O  1 72DSPATR(HI)

読者はフィールド DSPMOD は O として出力フィールドとして定義しているので
READEXFMT で読み取ることはできない、のは当たり前と思うかもしれない。
確かにその通りである。
ではサブ・ファイル・レコードで検証してみよう。

次は TONAKAI のサンプルとして使われているSMP006:商品マスターの照会画面である。

これは照会画面なのでサブ・ファイル・レコードのフィールドは次のようにすべて
出力フィールドとして定義されている。


A          R SFREC01                   SFL                    
A                                      TEXT(' SFL明細行 ') 
A*%%TS  SD  19930612  144015  QUATTRO     REL-V3R2M0  5738-PW1
A*------------------------------------------------*           
A  20                                                         
AO 99                                  SFLNXTCHG              
A            GYO            4A  O  8  2TEXT('  ')           
A  03                                  DSPATR(UL)             
A            SHCODE        10A  O  8  7TEXT(' 商品コード ')   
A            SHNAME        24O  O  8 20TEXT(' 商品名 ')       
A            SHTANK         7Y 0O  8 45TEXT(' 単価 ')         
A                                      EDTCDE(K)              
A            SHSCOD         4A  O  8 58TEXT(' 品種コード ')   
A            HNSNAM        14A  O  8 63TEXT(' 品種名 ')       

これに対するRPG : SMP006 のコンパイル・リストの一部を次に紹介する。


B000000   INPUT   レコード SFREC01 ファイル SMP006FM 様式 SFREC01 のフィールド
B000000          SFL明細行                                           
B000001                                           1   4 GYO             
B000002                                           5  14 SHCODE          
B000003                                          15  38 SHNAME          
B000004                                          39  450SHTANK          
B000005                                          46  49 SHSCOD          
B000006                                          50  63 HNSNAM          

どうだろうか ?
出力として定義したはずのサブ・ファイル・レコードのすべてが入力として定義されている。
これはサブ・ファイル・レコードである性格上、サブ・ファイル・レコードはたとえ出力であっても
サブ・ファイルの RRN による CHAIN 命令や READC 命令によって読み込むことができるように
するため IBM によって入力フィールドとして扱われているのである。

従ってサブ・ファイル・レコードのフィールドはすべてプログラムから
読み取ることができる。

EnterpriseServer では TONAKAI で DSPF を HTML に変換することができるが
同じように上記のことが考慮されており、SFLの出力フィールドは変換すると
<input type="text" .... readonly> となる読取り専用の input タグに変換される。
これによって TONAKAI で変換された HTML でも SFL の読取り機能が再現されている。