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