DDS | 画面ファイル(サブファイル) |
サブファイルとは、画面ファイルのなかにさらにそのサブとして明細を持ったものです。
AS/400においては画面は一種のファイルですが、その中の明細も一種の
ファイルとして扱っています。
これにより、明細のハンドリングが楽になり、プログラムの中で、画面からの制約を
あまり考慮しなくてもよくなるので、プログラム作成が容易になります。
サブファイルの操作は、明細を記述するサブファイルと、それの制御情報を持つサブファイル制御の記述の
セットで使用します。下記のサンプルをみて下さい。
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 A*----------------------------------------------------------- A* ID : RF520S A* NAME : 受注入力画面 A*----------------------------------------------------------- A R FMT01 OVERLAY PROTECT A CF03 CF06 A* A S1PGID 10A O 1 2 TEXT('PGM-ID') A S1MOD 6O +1 TEXT(' 処理モード ') A 1 31' 得意先マスター更新 ' A DSPATR(RI) A 1 61 DATE EDTCDE(Y) A 1 71 TIME A* A 3 2 ' 受注 ' A S1JUNO 6Y 0B +1TEXT(' 受注 ') A 31 DSPATR(PC RI) A*----------------------------------------------------------- A R FMT02 TEXT(' 第二画面 ') A OVERLAY PROTECT A CF03 CF12 A* A 4 2 ' 得意先 ' A S2TKNO 5A B +1TEXT(' 得意先 ') A 32 DSPATR(PC RI) A 28 DSPATR(PR) A S2NMKJ 42O O +1TEXT(' 得意先名 ') A 4 61 ' 受注日 ' A S2JUDT 6Y 0B +1TEXT(' 受注日 ') A EDTCDE(Y) A 33 DSPATR(PC RI) A 28 DSPATR(PR) A* A*----------------------------------------------------------- A R SFL01 A SFL A* A S4GYNO 2Y 0O 7 2TEXT(' 行 ') A S4HNNO 6A B +2TEXT(' 品目 ') A 41 DSPATR(PC RI) A 28 DSPATR(PR) A S4JUSU 7Y 0B +2TEXT(' 受注数 ') A EDTCDE(K) A 42 DSPATR(PC RI) A 28 DSPATR(PR) A S4JU@ 9Y 2B +2TEXT(' 受注@ ') A EDTCDE(K) A 28 DSPATR(PR) A 43 DSPATR(PC RI) A S4JU\ 11Y 0O +2TEXT(' 受注額 ') A EDTCDE(K) A S4SEDT 8Y 0H TEXT(' 請求日 ') A*----------------------------------------------------------- A R CTL01 A OVERLAY PROTECT A CF12 A ROLLUP(19) A ROLLDOWN(20) A SFLCTL(SFL01) A SFLSIZ(11) SFLPAG(10) A 24 SFLDSPCTL A 23 SFLDSP A 22 SFLCLR A 21 SFLINZ A @RRN 4S 0H SFLRCDNBR A 6 02'NO' A 6 05' 品目 ' A 6 15' 受注数 ' A 6 28' 受注単価 ' A 6 43' 受注金額 ' A*----------------------------------------------------------- A R FMT99 A 01 23 2 'F3= 終了 F6= 処理選択 ' A 02 23 2 'F12= 取消 ' A 03 23 2 'F12= 取消 ' A S9MSG 78A O 24 1TEXT(' MSG ')
サブファイルの記述
レコード様式名は通常のDSPFの場合と同じです。慣習的にSFLnnの形で命名されることが多いので
それにあわせています。
サブファイルの記述では、レコードレベルでサブファイルであるというSFLのキーワードと1明細分の記述を行います。
1明細分は複数行にわたっての配置も許されます。つまり、2行で1明細、3行で1明細の形も許されます。
A*----------------------------------------------------------- A R SFL01 A SFL A* A S4GYNO 2Y 0O 7 2TEXT(' 行 ') A S4HNNO 6A B +2TEXT(' 品目 ') A 41 DSPATR(PC RI) A 28 DSPATR(PR) A S4JUSU 7Y 0B +2TEXT(' 受注数 ') A EDTCDE(K) A 42 DSPATR(PC RI) A 28 DSPATR(PR) A S4JU@ 9Y 2B +2TEXT(' 受注@ ') A EDTCDE(K) A 28 DSPATR(PR) A 43 DSPATR(PC RI) A S4JU\ 11Y 0O +2TEXT(' 受注額 ') A EDTCDE(K) A S4SEDT 8Y 0H TEXT(' 請求日 ')
上記は次のような画面を想定しています。
NO 品目 受注数 受注単価 受注金額 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666- 66 BBBBBB 9,999,999- 9,999,999.99- 66,666,666,666-
- キーワードSFL
- このレコード様式がサブファイルであることの記述です。
- フィールドの記述
- 1明細分だけ記述しています。
- 標識28、DSPATR(PR)
- 削除のときフィールドを入力禁止にするためのものです。
- 標識41〜43、DSPATR(PC RI)
- エラーチェックのとき、カーソルを置き、反転表示するためのものです。
- 請求日(S4SEDT)
- 隠しフィールドとして定義しています。単に説明のために用意したものです。
サブ・ファイル制御の記述
サブ・ファイル制御は、サブ・ファイルを表示するときの制御情報を持つレコードです。
慣習的にCTLnnのように命名するケースが多いようです。
サブ・ファイル制御
A*----------------------------------------------------------- A R CTL01 A OVERLAY PROTECT A CF12
- CF12
- この画面でF12キーを有効にします。
ロールアップ、ロールダウン
A ROLLUP(19) A ROLLDOWN(20)
- ROLLUP(19)
- ROLLUPキーが押されたとき標識19がオンになってプログラムに制御が渡ります。
- ROLLDOWN(20)
- ROLLUPキーが押されたとき標識20がオンになってプログラムに制御が渡ります。
サブファイルを制御情報のパラメータ
A SFLCTL(SFL01) A SFLSIZ(11) SFLPAG(10) A 24 SFLDSPCTL A 23 SFLDSP A 22 SFLCLR A 21 SFLINZ A @RRN 4S 0H SFLRCDNBR
- SFLCTL
- 制御対象のサブファイルのレコード名を指定します。
- SFLSIZ
- サブファイルが持つレコード数です。
SFLPAGの値より+1の値を与えると、このサイズは画面がめくられる毎に1ページ分だけ自動増殖します。- SFLPAG
- 1ページ画面当たりの明細件数です。
- SFLDSPCTL
- サブファイル制御様式のレコードを表示させます。
- SFLDSP
- サブファイルを表示させます。
- SFLCLR
- サブファイルが持っているレコードを0件にします。サブファイルへはWRITE命令のみ可能です。
- SFLINZ
- サブファイルをブランクまたは0でクリアした状態にします。
- SFLRCDNBR
- このフィールドが持っている値のサブファイルの相対レコードナンバーを含むページを表示させます。
明細にエラーがあったようなときに、これを利用して、エラーのあるページを表示できます。
例えば、5ページ目の明細にエラーがあったような場合、その相対レコードナンバー(明細番号)を
セットしておけば、画面には5ページ目が表示されます。
項目見出し
サブファイルの項目の見出しを固定値で記述しています。
サブファイルのハンドリング
実際のサブファイルを使った処理ではそのロジックは次のように行います。
明細の表示のみ
- 1.サブファイルをクリアする(SFLCLR)
- クリアするには標識で制御します。サブファイルは0件状態になります。
SETON 22
WRITECTL01
SETOF 22
- 2.サブファイルへWRITE
- DBファイルから必要情報をREADし、サブファイルへWRITEする。
READ DBファイル
DO(データがある間)
RRNを+1する
編集
WRITESFL01
READ DBファイル
ENDDO
- 3.サブファイルとサブファイル制御を画面に表示
- サブファイルをサブファイル制御を使って,サブファイルとサブファイル制御を画面に表示する。
SETON 2324
WRITECTL01
SETOF 2324
注:画面への表示のあと画面からの入力を行なうときは、WRITEでなく、EXFMTを使用します。
SETON 2324
EXFMTCTL01
SETOF 2324
明細を表示し、チェック、その結果を表示
1.サブファイルをクリアする(SFLCLR)- クリアするには標識で制御します。
SETON 22
WRITECTL01
SETOF 22
2.ファイルから必要情報をREADし、サブファイルへ- ファイルから必要情報をREADし、サブファイルへWRITEする。
READ DBファイル
DO(データがある間)
RRNを+1する
編集
WRITESFL01
READ DBファイル
ENDDO
- 3.サブファイルとサブファイル制御を画面に表示
- サブファイルをサブファイルコントロールを使って,サブファイルとサブファイル制御を画面に表示する。
SETON 2324
EXFMTCTL01
SETOF 2324
- 4.変更(入力)があった明細のみを読取り
- 変更(入力)があった明細のみを読取りする。
READCSFL01 99
DO−UNTIL(EOF)
明細のエラーチェック
エラーがあれば、あるいは名称などをセットする必要があれば、
UPDATSFL01
READCSFL01
ENDDO
- 5.サブファイルとサブファイル制御を画面に表示
- サブファイルとサブファイル制御を画面に表示する。3.に同じ
注:画面で変更されたサブファイル・レコードのみ読み取るというREADC(read changed)命令があります。
READC命令を使うと一見よさそうなのですが、何度にもわけて明細の訂正を行う場合、最後の実行キーを
押したときに変更があった明細だけしかよみ込みされません。つまり、いざファイルを更新しようとしたとき、
それ以前に訂正を行った明細がよみ込みされないことになります。
これを解消するためには、訂正のあった明細の番号を記録しておき、READCでなく、変更のあった明細を
CHAINで読とるような工夫が必要です。(下図参照)
RRN ← 0 DO−WHILE(データがある間) RRNを+1 IF 訂正のあった明細か RRNでCHAINSFL01 DBファイルへ編集 UPDATDBファイル ENDIF ENDDO
前ページ 次ページ 印刷・画面 目次
(C)COPYRIGHT ISHIOKA KATSUHIDE 2000-2009