サブファイルは 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
を出力すればよいのであるが多くの場合は SFL
と SFLCTL
も同時に表示
する必要があるので両方の標識を *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
キーワードによって表示行数を決定したのであればSFLSIZ
は SFLPAG
の
+1 の値を定義しておけば自動拡張に依存することができる。
このことが理解されていないと SFLSIZ
と SFLPAG
を同じ値にしてしまっている誤りを
よく見かける。
PGMR
は別の理由があって SFLSIZ = SFLPAG
としたとしても、それはやはりサブファイルが
十分理解されていないことに起因している場合が多い。
SFLSIZ = SFLPAG +1
に定義しておいて不都合なことは、まず発生しないので
安心されたい。
4. 必ず事前にサブファイル・クリヤーを行うこと
RPG が最初に起動されたときは、サブファイルにはサブファイル・レコードは何も存在していないの
でサブファイルの消去( SFLCLR)
を行う必要は必ずしも無いのであるが、他のケースにも備えて
行儀の良い信頼性の高い PGM に仕上げるためには、必ず SFLCLR
を実行しておくことが必要である。
サブファイル・クリヤーは CLRPFM
(物理ファイル・メンバーの消去) と同じようなものである。
- 操作員による明細表示の要求があった
- サブファイルのクリヤー (
SFLCLR
)
- データ・レコードを読み取る (
READ
やREADE
など)
- サブファイルにレコードを出力 (
WRITE
)
- サブファイルを表示 (
EXFMT
)
の順序となる。初心者の多くは最初に SFLCLR
が励行されていない場合がある。
先の DDS の例では SFLCLR
に標識 44 が定義されていたので、サブファイル・クリヤーの
記述は下記のようになる。
C SETON 44 C EXFMT SFCTL01 C SETOFF 44
5. サブファイル使用の誤解 ・・・・ 消去してからレコードを追加すること
サブファイルを理解していない PGMR では、サブファイルに WRITE 命令でとにかくサブファイル・
レコードを満杯にしてから次にサブファイルをLOOP して CHAIN して、UPDATE するような使用
方法を見ることがある。
サブファイルは単なる順次ファイルであると考えればよい。
順次ファイルにレコードを追加するときは
- メンバーを
CLRPFM
で消去して初期設定しておく。 WRITE
によってレコードを順次、追加してゆく。
とするはずである。
レコードをすべて追加してから、改めて順次にレコードを更新する、とは行わないはずである。
サブファイルに対して複雑な記述を行っていたとしたら、それは使用方法を誤っていると思って
間違いない。
サブファイルには単純にレコードを追加するだけで十分である。