RPG

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

サブファイルは Windows でのリストビューと同じである。
下記のリストビューには多くのレコードが保存されているが、実際に表示されているのは目に見える部分だけである。

サブファイルもこのような構造をしていることが理解できた時点で
サブファイルを扱うための基礎として DDS のサブファイル・キーワードについて学習しよう。

1. サブファイルの DDS仕様書への記述の方法

DDS へはサブファイルのレコードは SFL(サブファイル・レコード) と
SFLCTL (サブファイル制御レコード)を SFL → SFLCTL の順序で記述する。
SFL は、これまで解説してきたサブファイルの明細行のレコードそのものであるが、
SFLCTL (サブファイル制御レコード)とは SFLを制御(コントロール)するためのレコードである。
最も簡単なサブファイルの記述の例を下記に示す。

A          R SFREC01                   SFL                       
A                                      TEXT(' SFL明細行 ')    
A            GYO            4A  O  8  2TEXT('  ')              
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 56TEXT(' 品種コード ')      
A                                                                
A          R SFCTL01                   SFLCTL(SFREC01)           
A                                      TEXT(' SFL制御見出 ')  
A                                      OVERLAY                   
A                                      SFLSIZ(14)                
A                                      SFLPAG(13)                
A  41                                  SFLDSPCTL                 
A  42                                  SFLDSP                    
A  44                                  SFLCLR

表示レコード :SFREC01 には SFLキーワードを定義して、これがサブファイル・レコードで
あることを宣言している。
次に表示レコード : SFCTL01 では SFCTL(SFREC01) の記述によって、これが
SFREC01を制御するサブファイル制御レコードであることを宣言している。
このように SFL → SFLCTL の順序に従って記述する必要がある。

SFLDSPCTLキーワード ・・・ SFLCTLを表示するために使用する。
SFLDSPキーワード ・・・ SFLを表示するために使用する。
SFLCLRキーワード ・・・ SFLを表示するために使用する。

2. RPG プログラムによるサブファイルの表示の方法

RPG の中でサブファイル・レコードを表示するには SFLDSP の標識を *ON にして
SFLCTL を出力すればよいのであるが多くの場合は SFLSFLCTL も同時に表示
する必要があるので両方の標識を *ON にしてから SFLCTL を出力する。
つまり、

C                   SETON                                        4142
C                   WRITE     SFCTL01                                
C                   SETOFF                                       4142

のような記述によって SFL , SFLCTL が表示される。
しかし実際の使用では表示だけではなく、入出力である場合が圧倒的に多いので多くの場合は、EXFMT を使って、

C                   SETON                                        4142
C                   EXFMT     SFCTL01                                
C                   SETOFF                                       4142

と記述される。この記述がサブファイル表示の基本であることを覚えていて欲しい。

3. サブファイルは自動拡張される。

前述の例で SFLSIZ = SFLPAG +1 の値として定義されていることに注意されたい。
SFLSIZ とはサブファイル全体の容量であり、SFLPAG とは表示されて目に見える、
サブファイル・レコードの数のことである。
つまり、ここでは SFLPAG = 13 行のレコードが表示されることになる。
しかし操作員の ROLLUP要求に従って RPG 内部で次のレコードを追加していくとサブファイルの容量は最初の 14行から 28行,42行, ・・・ と OS400によって自動拡張されるのである。
よって SFLPAG キーワードによって表示行数を決定したのであればSFLSIZSFLPAG
+1 の値を定義しておけば自動拡張に依存することができる。
このことが理解されていないと SFLSIZSFLPAG を同じ値にしてしまっている誤りを
よく見かける。
PGMR は別の理由があって SFLSIZ = SFLPAG としたとしても、それはやはりサブファイルが
十分理解されていないことに起因している場合が多い。
SFLSIZ = SFLPAG +1 に定義しておいて不都合なことは、まず発生しないので
安心されたい。

4. 必ず事前にサブファイル・クリヤーを行うこと

RPG が最初に起動されたときは、サブファイルにはサブファイル・レコードは何も存在していないの
でサブファイルの消去( SFLCLR) を行う必要は必ずしも無いのであるが、他のケースにも備えて
行儀の良い信頼性の高い PGM に仕上げるためには、必ず SFLCLR を実行しておくことが必要である。
サブファイル・クリヤーは CLRPFM (物理ファイル・メンバーの消去) と同じようなものである。

  1. 操作員による明細表示の要求があった
  2. サブファイルのクリヤー ( SFLCLR )
  3. データ・レコードを読み取る ( READREADE など)
  4. サブファイルにレコードを出力 ( WRITE )
  5. サブファイルを表示 ( EXFMT )

の順序となる。初心者の多くは最初に SFLCLR が励行されていない場合がある。
先の DDS の例では SFLCLR に標識 44 が定義されていたので、サブファイル・クリヤーの
記述は下記のようになる。

C                   SETON                                        44  
C                   EXFMT     SFCTL01                                
C                   SETOFF                                       44

5. サブファイル使用の誤解 ・・・・ 消去してからレコードを追加すること

サブファイルを理解していない PGMR では、サブファイルに WRITE 命令でとにかくサブファイル・
レコードを満杯にしてから次にサブファイルをLOOP して CHAIN して、UPDATE するような使用
方法を見ることがある。
サブファイルは単なる順次ファイルであると考えればよい。
順次ファイルにレコードを追加するときは

  1. メンバーを CLRPFM で消去して初期設定しておく。
  2. WRITE によってレコードを順次、追加してゆく。

とするはずである。
レコードをすべて追加してから、改めて順次にレコードを更新する、とは行わないはずである。
サブファイルに対して複雑な記述を行っていたとしたら、それは使用方法を誤っていると思って
間違いない。

サブファイルには単純にレコードを追加するだけで十分である。