RPGによるコーディング 会話型処理(2)
前ページ 次ページ 目 次


RPGによるコーディング方法を取り上げます。随時増ページの予定です。




画面ファイルでサブファイルを使用した会話型処理

ここでは画面からの入力によって、受注ファイル(F520)を更新するケースを想定します。
レコードの追加、変更、削除の処理をまとめて更新ということにします。


シナリオ(ロジック)

会話型処理の方法はいろいろなやりかたがありますが、ここでは、第1画面、第2画面、・・・と
進行し、処理が正常に終了すれば、また第1画面に戻るというシナリオで話しをすすめます。
この方法だと、各画面の独立性が高く、処理も簡単で、デバッグをする場合などにおいて注意を配る
べき範囲を限定できるという利点があります。そのロジックは次のようになります。

終了キー(F3キー)が押されるまで以下の処理を繰り返します。

画面番号により以下の処理
1.第1画面のとき
マスターファイル更新のキー部分を取得のための画面を表示します。
第1画面から入力を取得します。
   1.1 F3キーのとき、プログラム終了します。
   1.2 F6キーのとき、処理モードを切替します。
   1.3 実行キーのとき、入力チェックをします。
      OKならサブファイルへデータをセットし、
第2画面への画面番号にします。

2.第2画面のとき
マスターのデータ部分取得のための画面を表示します。
第2画面から入力を取得します。
   2.1 F12キーのとき、第1画面への番号にします。
   2.2 実行キーのとき入力チェックをします。
      結果OKなら第3画面への画面番号にします。

3.第3画面のとき
マスターのデータ部分取得のための画面を表示します。
第3画面から入力を取得します。
   3.1 F12キーのとき、第1画面への番号にします。
   3.2 実行キーのとき入力チェックをします。
      結果OKなら更新確認状態にします。
      結果OKですでに更新確認状態であれば、ファイルを更新します。
画面番号を1にします。

ここで説明するのは、第1・第2・第3の3枚の画面のケースです。

第1画面 受注番号を入力する画面です。
第2画面 受注共通データを入力する画面です。
第3画面 受注明細データを入力する画面です。

プログラム作成の前準備

RPGプログラムを作成するまえに、プログラムが使用するファイルを作成しておく必要があ
ります。ここでは、画面ファイル(RF520S)と、受注ファイル(F520)、得意先
マスターファイル(M420)です。

第1画面

 RF520       編集                受 注 入 力              0/08/22  11:54:12 
                                                                               
  受注  000001                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
 F3= 終了  F6= 処理選択                                                        
                                                                               

第2画面

 RF520       編集                受 注 入 力              0/08/22  12:01:18  
                                                                                
  受注  000001                                                                
  得意先  11111                                              受注日   0/08/22   
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
 F12= 取消                                                                      
                                                                                


第3画面

 RF520       編集                受 注 入 力              0/08/22  12:01:38  
                                                                                
  受注  000001                                                                
  得意先  11111                                              受注日   0/08/22   
                                                                                
 NO  品目    受注数       受注単価       受注金額                             
 01  111111          1          11.00              11              
 02  222222          2          22.00              44                          
 03  333333          3          33.00              99                          
 04  444444          4          44.00             176                          
 05  555555          5          55.00             275                          
 06  666666          6          66.00             396                          
 07  777777          7          77.00             539                          
 08  888888          8          88.00             704                          
 09  999999          9          99.00             891                          
 10  111111         10         110.00           1,100                          
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
 F12= 取消                                                                      
                                                                                

画面ファイルのDDSは次のとおりです。

     A*-----------------------------------------------------------
     A* ID    : RF520S
     A* NAME  :受注入力画面
     A*画面1= FMT99 + FMT01
     A*画面2= FMT99 + FMT01 + FMT02
     A*画面3= FMT99 + FMT02 + CTL01(SFL01)
     A*-----------------------------------------------------------
     A                                       PRINT
     A                                       INDARA
     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 '受注Y'
     A            S1JUNO         6Y 0B    +1 TEXT('受注Y')
     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('得意先Y')
     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  27                                   SFLNXTCHG
     A*
     A            S4GYNO         2Y 0O  7  2TEXT('行Y')
     A            S4HNNO         6A  B    +2TEXT('品目Y')
     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            S4JUTK         9Y 2B    +2TEXT('受注@')
     A                                      EDTCDE(K)
     A  43                                   DSPATR(PC RI)
     A  28                                   DSPATR(PR)
     A            S4JUGK        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(100) SFLPAG(10)
     A  24                                  SFLDSPCTL
     A  23                                  SFLDSP
     A  22                                  SFLCLR
     A  21                                  SFLINZ
     A                                      CSRLOC(S1LIN  S1COL)
     A            S1LIN          3S 0H      TEXT('カーソル制御(行')
     A            S1COL          3S 0H      TEXT('カーソル制御(桁')
     A            RCDNBR         4S 0H      SFLRCDNBR
     A                                  6 02'NO'
     A                                  6 05'品目Y'
     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  ')

第1画面

第1画面はFMT01とFMT99の2つの様式から構成されます。
FMT01はキーデータ(受注番号)入力のための様式、FMT99はキーガイド、メッセージ
表示のための様式です。

第2画面

第2画面はFMT01,FMT02,FMT99の3つの様式から構成されます。
FMT01、FMT99は上記に同じ。FMT02は受注見出データ(得意先、受注日)入力の
ための様式です。

第3画面

第3画面はFMT01,FMT02,FMT99,CTL01(SFL01を含む)の5個の
様式から構成されます。この部分は受注明細データ入力のための様式です。

更新対象ファイル

更新対象となるファイルは次のように定義されているものとします。

     A*--------------------------------------------------------------  
     A* ID   : F520                                                    
     A* NAME : 受注明細ファイル                                        
     A* KEY  : 受注 , 明細                                         
     A*--------------------------------------------------------------  
     A                                      UNIQUE                     
     A          R F520R                     TEXT(' 受注明細ファイル ') 
     A*                                                                
     A            JDJUNO         6S 0       COLHDG(' 受注 ')         
     A            JDMENO         2S 0       COLHDG(' 明細 ')         
     A            JDTKNO         5A         COLHDG(' 得意先 ')       
     A            JDHNNO         6A         COLHDG(' 品目 ')         
     A            JDJUSU         7S 0       COLHDG(' 受注数 ')         
     A            JDJUTK         9S 2       COLHDG(' 受注@ ')         
     A            JDJUDT         8S 0       COLHDG(' 受注日 ')         
     A            JDSEDT         8S 0       COLHDG(' 請求日 ')         
     A*                                                                
     A          K JDJUNO                                               
     A          K JDMENO                                               

受注データの入力に際しては、得意先マスター(M420)を参照してチェックするものとし、
そのDDSは次のとおりとします。

     A*---------------------------------------------------------------
     A* ID    : M420                                                  
     A* NAME  :  得意先マスター                                       
     A*---------------------------------------------------------------
     A                                      UNIQUE                    
     A          R M420R                                               
     A*  データ                                                       
     A            TKSTS          1          COLHDG(' 状態 ')          
     A            TKTKNO         5A         COLHDG(' 得意先 ')      
     A            TKNMKJ        42O         COLHDG(' 得意先名 ')      
     A            TKNMKN        20A         COLHDG(' 得意先カナ名 ')  
     A            TKTEL         12A         COLHDG(' TEL ')        
     A            TKSLNO         4A         COLHDG(' 担当営業 ')    
     A            TKFLAG         1A         COLHDG(' フラグ ')        
     A            TKURJS        11S 0       COLHDG(' 売上実績 ')      
     A*  キー                                                         
     A          K TKTKNO                                              

制御仕様書(H仕様書)

通常のコーディングです。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     H            Y-                                                   

ファイル仕様書

画面ファイルでは会話型の記述に加えて、サブファイルを使用するために継続の記述行に以下の
追加の記述をします。継続の行は53カラムにKを記入して示します。
1.サブファイルをハンドリングする相対レコード番号のための変数を47〜52カラムに記述
します。
2.サブファイルを使用のために、54〜59カラムにSFILEを記述します。
3.サブファイルのレコード様式名を60〜67カラムに記述します。


 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     F* 画面ファイル                                                   
     FRF520S  CF  E                    WORKSTN                         
     F                                        RRN   KSFILE SFL01       
     F* 受注ファイル                                                   
     FF520    UF  E           K        DISK                      A     
     F* 得意先マスター                                                 
     FM420    IF  E           K        DISK                            

更新対象ファイル(受注ファイル)、参照用ファイル(得意先マスター)についての説明は省略
します。

処理モード

処理モードはここでは、受注番号+行番号(明細番号)でファイルをみて、あれば変更、なければ追加とし、
削除は、同一受注番号を一括削除で行うものとしています。
明細行単位での削除はしない約束とします。

エラーメッセージ

エラーメッセージはコンパイル時配列で定義しています。

変更フラグ

1回に受注入力できる明細件数は99件までとし、プログラムのテクニック上から99件の変更
フラグの配列を用意しています。これを使用して変更時に、訂正のあった明細のみファイルに
更新をかけます。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     E                    MOD         4  6                処理モード名 
     E                    MSG     1   5 50               ERR MSG       
     E                    CHG        99  1               SFL 変更 FLG  

カーソル制御の準備

後で述べるように、カーソルのあったフィールド位置を取得するために、ワークステーション情報を
取得するためのデータ構造を記述しておきます。また、カーソル位置情報は行、カラム、各1バイト
なので、これを2バイトの2進数にするためのデータ構造も準備します。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     IWSINF       DS                                                   
     I                                      370 370 WSLIN              
     I                                      371 371 WSCOL              
     I                                    B 378 3790WSNO               
     I* ライン・カラム情報                                 
     I            DS                                       
     I I            0                     B   1   20WSLINB 
     I                                        2   2 WSLINC 
     I I            0                     B   3   40WSCOLB 
     I                                        4   4 WSCOLC 
注:43カラム目の’B’はデータタイプが2進数であることを示します。

キーリスト

更新対象のファイルをアクセスするためのキーリストを準備します。

メインの処理の流れ

メインの処理の流れは、サブファイルを使用しない場合とまったく同じ考えです。
この要領で画面の枚数が増えたとしても、単純にプログラムを拡張できます。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     C           KEY99     KLIST                                       
     C                     KFLD           JDJUNO            受注     
     C*                                                                
     C           KEY99A    KLIST                                       
     C                     KFLD           JDJUNO            受注     
     C                     KFLD           JDMENO            明細     


     C* 初期処理                                                      
     C                     EXSR SBINZ                                 
     C* 主処理                                                        
     C                     EXSR SBMAIN                                
     C* 終了処理                                                      
     C                     EXSR SBEND                                 
     C*                                                               
     C*---------------------------------------------------------------
     C*          SBMAIN    主処理                                     
     C*---------------------------------------------------------------
     C           SBMAIN    BEGSR                                      
     C*                                                               
+----C           *INKC     DOWEQ*OFF                                  
|+---C           W@FMT     CASEQ01        SB1000            第一画面  
|+---C           W@FMT     CASEQ02        SB2000            第二画面  
|+---C           W@FMT     CASEQ03        SB3000            第三画面  
|+---C                     ENDCS                                      
|    C*                                                               
+----C                     ENDDO                                      


第1画面の処理

第1画面は受注番号の入力が目的です。

前準備

標識の01,02,03番を1,0,0とセットします。これは画面ファイルで記述した第1第2
第3画面のキーガイドを標識によって、表示/非表示操作をするためです。
命令がMOVEAであることに注意してください。

     C* 第1画面のためのセット                                            
     C                     MOVEA'100'     *IN,01                    

第一画面の表示

得意先マスターメンテナンスのプログラムの場合と同様です。説明を略します。

データ入力後の処理

得意先マスターメンテナンスのプログラムの場合と同様です。説明を略します。

第一画面処理のコーディングは次のようになります。

     C*          SB1000    第一画面処理                                
     C*--------------------------------------------------------------- 
     C           SB1000    BEGSR                                       
     C*                                                                
     C* 第一画面へセット                                               
     C                     MOVEA'100'     *IN,01                       
     C*                                                                
+----C           W@FMT     DOWEQ01                                     
|    C* 第一画面表示                                                   
|    C                     WRITEFMT99                                  
|    C                     EXFMTFMT01                                  
|    C                     MOVE *BLANK    S9MSG                        
|    C*                                                                
|    C                     SELEC                                       
|    C* F3                                                             
|    C           *INKC     WHEQ *ON                                    
|    C                     Z-ADD00        W@FMT             終了要求   
|    C* F6                                                             
|    C           *INKF     WHEQ *ON                                    
|    C                     EXSR SB1220                      処理変更   
|    C* ENTER                                                          
|    C                     OTHER                                       
|    C                     EXSR SB1230                      実行キー   
|    C* NO-ERROR なら第二画面へセット                                  
|+---C           *IN30     IFEQ *OFF                                   
||   C                     EXSR SB1250                      画面へ セット 
|+---C                     ENDIF                                       
|    C*                                                                
|    C                     ENDSL                                       
+----C                     ENDDO                                       
     C*                                                                
     C                     ENDSR                            

受注ナンバーのチェックと明細の準備

第1画面で受注ナンバーの存在チェックをしなければなりません。
従ってこのタイミングを利用して、削除まはた変更の場合に、明細に表示するサブファイルを
準備します。すなわち、受注レコードがあったときは、同一受注ナンバーについて、レコードを
全件読取りし、それをサブファイルに出力します。その手順は次のとおりです。

1.サブファイルの「初期化」
2.サブファイルへのレコード出力

この方法以外に、サブファイルの「クリア」とWRITE命令を組み合せる方法もあります。
初期化(SFLINZ)とクリア(SFLCLR)の違いは,初期化が全レコードをブランクまたは0の
レコードで埋めるのに対し、クリアはレコードを0件にします。

サブファイルの初期化

サブファイルの初期化は画面ファイルに定義したSFLINZパラメータを標識でアクティブに
しておいて、それを含むレコード様式(CTL01)をWRITEする方式で行います。

画面ファイル
     A          R CTL01                                               
     A          ・・・
     A  21                                  SFLINZ  

     C* サブファイルを初期化                                         
     C                     SETON                     21    SFLINZ    
     C                     WRITECTL01                                
     C                     SETOF                     21              

サブファイルへの出力

「初期化」したのでサブファイルへの出力は、読取りと書戻しで行ないます。
同一受注bノついての読取りを行うので、SETLLとREADEを使用します。
サブファイルのレコードの読取りは相対レコードbナCHAINで行います。

     C           KEY99     SETLLF520R                                
     C           KEY99     READEF520R                    99          
+----C           *IN99     DOWEQ*OFF                                 
|    C                     ADD  001       RRN                        
|    C                     Z-ADDRRN       W@KEN             件数     
|    C           RRN       CHAINSFL01                09             
|    C* (ファイル( --> (サブファイル(                                         
|    C                     Z-ADDRRN       S4GYNO            行     
|    C                     MOVELJDHNNO    S4HNNO            品目   
|    C                     Z-ADDJDJUSU    S4JUSU            受注数   
|    C                     Z-ADDJDJUTK    S4JUTK            受注@   
|    C           JDJUSU    MULT JDJUTK    S4JUGK            受注額   
|    C                     Z-ADDJDSEDT    S4SEDT            請求日   
|    C*                                                              
|    C                     UPDATSFL01                                
|    C           KEY99     READEF520R                    99          
+----C                     ENDDO                                     

1ページ目の表示

特定の画面ページを表示するためにはSFLRCDNBRパラメータで記述したフィールドにその
相対レコードナンバーをセットします。これは後で、明細が複数ページあったとき、エラーのあった
ページを表示させるために使います。最初は1ページ目が表示されればいいので、1番のレコード
bセットします。

画面ファイル
     A            RCDNBR         4S 0H      SFLRCDNBR                 

RPG
     C                     Z-ADD001       RCDNBR            SFLRCDNBR 

注:サブファイルにデータをセットしたのみでは画面に表示されません。サブファイル制御様式を使って
画面に送り出しが必要です。



第2画面

第2画面では受注の見出し項目として、得意先コードと受注日を入力します。

前準備

標識の01,02,03番を0,1,0とセットします。第2画面のキーガイドを標識によって、
表示するためです。
また、削除モードのときは、各フィールドをプロテクト状態にするため標識をオンにします。

第2画面の表示

FMT01,FMT99をWRITEしFMT02でEXFMT命令を実行します。

入力後の処理

省略します。

コーディングは次のようになります。

     C*          SB2000    第2画面処理                                
     C*--------------------------------------------------------------- 
     C           SB2000    BEGSR                                       
     C*                                                                
     C* 第二画面準備                                                   
     C                     MOVEA'010'     *IN,01            Fキー用   
+----C           W@MOD     IFEQ 04                          削除 MODE  
|    C                     SETON                     28     プロテクト  
+----C                     ELSE                                        
|    C                     SETOF                     28     NON プロテクト 
+----C                     ENDIF                                       
     C* 第二画面繰返し                                                 
+----C           W@FMT     DOWEQ02                          第二画面   
|    C* 画面表示                                                       
|    C                     WRITEFMT99                                  
|    C                     WRITEFMT01                                  
|    C                     EXFMTFMT02                                  
|    C                     MOVE *BLANK    S9MSG                        
|    C*                                                                
|    C                     SELEC                                       
|    C           *INKL     WHEQ *ON                         取消キー   
|    C                     Z-ADD01        W@FMT                       
|    C                     OTHER                                      
|    C                     EXSR SB2230                      入力 チェック 
|    C                     ENDSL                                      
+----C                     ENDDO                                      
     C*                                                               
     C                     ENDSR                                      

第3画面の処理

第3画面の処理の役目は、正しい(エラーのない)明細データを入手することです。
画面のリクエスト番号が3である間、繰り返し処理をします。

前準備

標識の01、02、03番を0,0,1とセットします。これは画面ファイルで記述した第3画
面のキーガイドを標識で、表示するためです。
また、削除の場合はダブルアクションでなく、ただちに削除確認のメッセージを表示する必要があるので
メッセージをセットします。

     C* 第2画面へセット                                                     
     C                     MOVEA'01'      *IN,01                       
+----C           W@MOD     IFEQ 04                          削除      
|    C                     MOVELMSG,5     S9MSG             更新確認  
+----C                     ENDIF                                      


第3画面の表示

第3画面はFMT99とFMT01,FMT02,CTL01,SFL01なので、FMT99,
FMT01,FMT02をWRITE,CTL01はEXFMTで入出力します。
SFL01はCTL01によって間接的に出力されます。
このとき、SFLDSPとSFLCTLDSPを有効とするため、標識23,24をオンにします。

画面からの入力による処理

第3画面からの入力による処理は、F12の前画面に戻るか、データのチェックを行いエラーが
なければファイル更新をするのどちらかです。

コーディングは次のようになります。

     C*          SB3000    第3画面処理                                 
     C*---------------------------------------------------------------  
     C           SB3000    BEGSR                                        
     C*                                                                 
     C* 第二画面準備                                                    
     C                     MOVEA'001'     *IN,01            Fキー用    
     C                     MOVE *BLANK    S9MSG             ERR-MSG     
     C                     MOVE *ZERO     CHG               CHANGE-FLAG 
+----C           W@MOD     IFEQ 04                          削除        
|    C                     MOVELMSG,5     S9MSG             更新確認    
+----C                     ENDIF                                        
     C* 第二画面繰返し                                                  
+----C           W@FMT     DOWEQ03                          第二画面    
|    C* 画面表示                                                        
|    C                     WRITEFMT99                                   
|    C                     WRITEFMT01                                   
|    C                     WRITEFMT02                                   
|    C                     SETON                     2324               
|    C                     EXFMTCTL01                                   
|    C                     SETOF                     2324               
|    C                     MOVE *BLANK    S9MSG                         
|    C*                                                                
|    C                     SELEC                                       
|    C           *INKL     WHEQ *ON                         取消キー   
|    C                     Z-ADD02        W@FMT                        
|    C                     OTHER                                       
|    C* 入力チェックと更新
|    C                     EXSR SB3260                      入力 チェック  
|    C                     ENDSL                                       
+----C                     ENDDO                                       
     C*                                                                
     C                     ENDSR                                       

サブファイルの読取り

サブファイルは入力のあったもののみ読み取りします。このためにはREADC命令を使用します。
入力があるということは、フィールドが何らかの変更がなされたという意味で、正式にはモディ
ファイされたということです。ブランクを入力しても、123から123に変更しても、モディ
ファイされたことになります。
READC命令で読み取りされたときは、相対レコードb燗ッ時に取得されています。
これによって、あとでファイル更新のときのために、該当レコードbフ変更フラグをONにして
おきます。

|    C                     Z-ADDRRN       N                 行       
|    C                     MOVE '1'       CHG,N             変更フラグ 


またチェックの結果はサブファイルに書き戻ししておきます。

|    C                     EXSR SB3CHK                      CHECK-ERR 
|    C                     UPDATSFL01                                 


入力チェック

入力された明細レコード1件1件についてチェックを行います。
ここではフィールドに入力がなかったとき、エラーとしています。

エラーのときのカーソルの位置づけ

サブファイルの場合、表示属性(DSPATR)のPC(Put Cursor)はうまく働きません。
サブファイルのエラーがあったフィールドにカーソルを位置付けするには、自前でカーソル
位置を求め、そこにCSRLOCパラメータを利用して位置付けします。
画面ファイルのS1LIN,S1COLはカーソル位置付けだけが目的で、画面に表示はしない
ので、非表示の’H’を指定します。

     A                                      CSRLOC(S1LIN  S1COL)       
     A            S1LIN          3S 0H      TEXT(' カーソル制御(行 ') 
     A            S1COL          3S 0H      TEXT(' カーソル制御(桁 ') 

カーソルの行番号は、明細の始まる行と相対レコード番号から計算で求めます。

     C* カーソルのある行位置取得                                       
     C                     Z-ADDRRN       S4GYNO            行       
     C           RRN       DIV  WSPAG     W@WRK   70                   
     C                     MVR            WSLINE  70                   
     C                     ADD  006       WSLINE            行位置     

カラム位置は、各フィールドの開始位置たとえば(品目コードなら6カラム)を与えます。

     C* 品目                                                        
     C           S4HNNO    IFEQ *BLANK                                
     C                     SETON                     3041             
     C                     MOVELMSG,3     S9MSG                       
     C                     Z-ADD006       S1COL            COL 位置   
     C                     SETON                     27     SFLNXTCHG  
     C                     ENDIF                                      

エラーページの表示

明細が多いとき、エラーのあるページを表示させるにはSFLRCDNBRパラメータで指定した
フィールドにエラーのあったレコードの番号(RRN)をセットします。
たとえば明細が80件(画面8ページ分)入力されたとして、明細番号(レコード番号)53にエラーがあったと
すると、この53をSFLRCDNBRで指定したフィールドにセットしておくと、画面5ページ目が表示されます。

     C* エラーへ位置づけ                                              
     C           *IN30     IFEQ *ON                                   
     C                     Z-ADDWSLINE    S1LIN             行位置    
     C                     Z-ADDRRN       RCDNBR                      
     C                     ENDIF                                      

注:サンプルのソースでは最後にセットされたレコードのある画面が表示されることになります。
最初にエラーのあるレコードの画面を表示するには、どうすればよいか考えてみてください。

サブファイルネクストチェンジ

仮にあるフィールドにエラーがあったとしても、画面で訂正をしないで次回読取りをすると、
READC命令で読み取りされません。これを防ぐためには、画面ファイルでSFLNXTCHGパラメータを
記述し、エラーがあったレコードについては、SFLNXTCHGに関連づけた標識を*ONにしサブファイルに
出力します。
こうすると、画面でフィールドを変更しないでも、変更されたと同じ扱いになり、READCで読取りされます。
エラーデータが無視されてしまうようなことが防げます。
SFLNXTCHGパラメータはレコードレベルのパラメータでサブファイルの様式の中に記述します。

     A          R SFL01                                               
     A                                       SFL                      
     A  27                                   SFLNXTCHG                

ファイル更新

ファイル更新は、エラーなし状態となって、さらに変更なし(ということはエラーもなし)の
ときに行います。結果的には、確認→更新の2段アクションになります。
エラーなしは*IN30=*OFF、変更なしは*IN29=*OFFです。

     C* ファイル更新                                                  
+----C           *IN30     IFEQ *OFF                        NO-ERROR  
|+---C           *IN29     IFEQ *OFF                        NO-CHANGE 
||   C                     EXSR SBUPD                       ファイル 更新 
||   C                     Z-ADD01        W@FMT                       
|+---C                     ELSE                             CHANGED   
||   C                     MOVELMSG,5     S9MSG             更新確認  
|+---C                     ENDIF                                      
+----C                     ENDIF                                      

ファイル更新は受注aE行bナすべてのサブファイルを読み(CHAIN),変更のあった相対
レコードbフ明細のみ更新します。
このとき、明細レコードがファイルにあれば、変更、なければ追加とします。
削除モードのときは、該当受注bフ明細をすべて削除します。
明細を個別に削除するような仕様にするためには、さらにそのためのロジックの追加が必要です。

RPGの全ソースリストは次のとおりです。

     **---------------------------------------------------------------
     ** ID   : RF520
     ** NAME : 受注入力
     **
     ** NOTE :
     **  行だけの削除はできない。
     **   *IN28 削除時プロテクト    *ON: PROTECT
     **   *IN29 モディファイフラグ  *ON: MODIFIED
     **   *IN30 エラーフラグ        *ON: ERROR   *OFF:OK
     **---------------------------------------------------------------
     H            Y-
     F*---------------------------------------------------------------
     FRF520S  CF  E                    WORKSTN
     F                                              KINFDS WSINF
     F                                        RRN   KSFILE SFL01
     F*受注ファイル
     FF520    UF  E           K        DISK                      A
     F*得意先マスター
     FM420    IF  E           K        DISK
     E*---------------------------------------------------------------
     E                    MOD         4  6               処理モード名
     E                    MSG     1   5 50               ERR MSG
     E                    CHG        99  1               SFL変更FLG
     I*---------------------------------------------------------------
     I*
     IWSINF       DS
     I                                      370 370 WSLIN
     I                                      371 371 WSCOL
     I                                    B 378 3790WSNO
     I*
     I            DS
     I I            0                     B   1   20WSLINB
     I                                        2   2 WSLINC
     I I            0                     B   3   40WSCOLB
     I                                        4   4 WSCOLC
     I*ページサイズ
     I            DS
     I I            10                        1   50WSPAG
     I*画面番号
     I            DS
     I I            01                        1   20W@FMT
     I*処理モード
     I            DS
     I                                        1  24 MOD
     I I            '      '                  1   6 W@ADD
     I I            '編集'                  7  12 W@EDT
     I I            '      '                 13  18 W@DUM
     I I            '削除'                 19  24 W@DEL
     C*---------------------------------------------------------------
     C*キーリスト
     C           KEY99     KLIST
     C                     KFLD           JDJUNO           受注Y
     C*
     C           KEY99A    KLIST
     C                     KFLD           JDJUNO           受注Y
     C                     KFLD           JDMENO           明細Y
     C*---------------------------------------------------------------
     C*初期処理
     C                     EXSR SBINZ
     C*主処理
     C                     EXSR SBMAIN
     C*終了処理
     C                     EXSR SBEND
     C*
     C*---------------------------------------------------------------
     C*          SBMAIN   主処理
     C*---------------------------------------------------------------
     C           SBMAIN    BEGSR
     C*
+----C           *INKC     DOWEQ*OFF
|+---C           W@FMT     CASEQ01        SB1000           第一画面
|+---C           W@FMT     CASEQ02        SB2000           第二画面
|+---C           W@FMT     CASEQ03        SB3000           第三画面
|+---C                     ENDCS
|    C*
+----C                     ENDDO
     C*
     C                     ENDSR                            .SBMAIN
     C*---------------------------------------------------------------
     C*          SBINZ    初期処理
     C*---------------------------------------------------------------
     C           SBINZ     BEGSR                           .INZ
     C*
     C                     Z-ADD00        N       70        INDEX
     C                     Z-ADD00        X       70        INDEX
     C                     Z-ADD04        W@MOD   70       処理モード
     C                     Z-ADD000       W@KEN   70        SFL件数
     C                     SETOF                     30     SET NO-ERR
     C*
     C                     MOVEL'RF520'   S1PGID            PGM-ID
     C*最初の処理モード決定
     C                     EXSR SB1220                     処理選択
     C*
     C                     ENDSR                            .SBINZ
     C*---------------------------------------------------------------
     C*          SB1000   第一画面処理
     C*---------------------------------------------------------------
     C           SB1000    BEGSR
     C*
     C*第一画面へセット
     C                     MOVEA'100'     *IN,01
     C*
+----C           W@FMT     DOWEQ01
|    C*第一画面表示
|    C                     WRITEFMT99
|    C                     EXFMTFMT01
|    C                     MOVE *BLANK    S9MSG
|    C*
|    C                     SELEC
|    C* F3
|    C           *INKC     WHEQ *ON
|    C                     Z-ADD00        W@FMT            終了要求
|    C* F6
|    C           *INKF     WHEQ *ON
|    C                     EXSR SB1220                     処理変更
|    C* ENTER
|    C                     OTHER
|    C                     EXSR SB1230                     実行キー
|    C* NO-ERRORなら第二画面へセット
|+---C           *IN30     IFEQ *OFF
||   C                     EXSR SB1250                     画面へセット
|+---C                     ENDIF
|    C*
|    C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR                            .SB1000
     C*---------------------------------------------------------------
     C*          SB1220   処理モード決定    ADD ->CHG ->DEL
     C*---------------------------------------------------------------
     C           SB1220    BEGSR
     C*
     C                     SELEC
     C           W@MOD     WHEQ 04
     C                     Z-ADD02        W@MOD            編集
     C           W@MOD     WHEQ 02
     C                     Z-ADD04        W@MOD            削除
     C                     ENDSL
     C*
+----C           W@MOD     IFEQ 04
|    C                     SETON                     28
+----C                     ELSE
|    C                     SETOF                     28
+----C                     ENDIF
     C                     MOVELMOD,W@MOD S1MOD            モード名
     C*
     C                     ENDSR                            .SB1220
     C*---------------------------------------------------------------
     C*          SB1230   実行キーが押されたときの処理
     C*---------------------------------------------------------------
     C           SB1230    BEGSR
     C*
     C                     SETOF                     3031   ERR-OFF
     C*該当受注チェック
     C                     CLEARF520R
     C                     Z-ADDS1JUNO    JDJUNO           受注Y
     C           KEY99     SETLLF520R
     C           KEY99     READEF520R                    99
+----C           *IN99     IFEQ *OFF
|    C                     MOVELJDTKNO    S2TKNO           得意先Y
|    C                     Z-ADDJDJUDT    S2JUDT           受注日
+----C                     ELSE
|+---C           W@MOD     IFEQ 04                          DEL
||   C                     MOVELMSG,1     S9MSG            該当なし
||   C                     SETON                     3031
|+---C                     ENDIF
+----C                     ENDIF
     C*OKなら第二画面へ
+----C           *IN30     IFEQ *OFF
|    C                     Z-ADD02        W@FMT
+----C                     ENDIF
     C*
     C                     ENDSR                            .SB1230
     C*---------------------------------------------------------------
     C*          SB1250   ファイルから第2第3画面へセット
     C*---------------------------------------------------------------
     C           SB1250    BEGSR
     C*
     C*サブファイルを初期化
     C                     SETON                     21    INZSFL
     C                     WRITECTL01
     C                     SETOF                     21
     C*
     C                     Z-ADD0000      RRN     40
     C                     Z-ADD001       RCDNBR            SFLRCDNBR
     C                     Z-ADD0000      S4GYNO
     C*
     C           KEY99     SETLLF520R
     C           KEY99     READEF520R                    99
+----C           *IN99     DOWEQ*OFF
|    C                     ADD  001       RRN
|    C                     Z-ADDRRN       W@KEN            件数
|    C           RRN       CHAINSFL01                09
|    C* (ファイル( --> (サブファイル(
|    C                     Z-ADDRRN       S4GYNO           行Y
|    C                     MOVELJDHNNO    S4HNNO           品目Y
|    C                     Z-ADDJDJUSU    S4JUSU           受注数
|    C                     Z-ADDJDJUTK    S4JUTK           受注@
|    C           JDJUSU    MULT JDJUTK    S4JUGK           受注額
|    C                     Z-ADDJDSEDT    S4SEDT           請求日
|    C*
|    C                     UPDATSFL01
|    C           KEY99     READEF520R                    99
+----C                     ENDDO
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB2000   第2画面処理
     C*---------------------------------------------------------------
     C           SB2000    BEGSR
     C*
     C*第二画面準備
     C                     MOVEA'010'     *IN,01           Fキー用
+----C           W@MOD     IFEQ 04                         削除
|    C                     SETON                     28     プロテクト
+----C                     ELSE
|    C                     SETOF                     28     NONプロテクト
+----C                     ENDIF
     C*第二画面繰返し
+----C           W@FMT     DOWEQ02                         第二画面
|    C*画面表示
|    C                     WRITEFMT99
|    C                     WRITEFMT01
|    C                     EXFMTFMT02
|    C                     MOVE *BLANK    S9MSG
|    C*
|    C                     SELEC
|    C           *INKL     WHEQ *ON                        取消キー
|    C                     Z-ADD01        W@FMT
|    C                     OTHER
|    C                     EXSR SB2230                     入力oォg
|    C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB2230   実行キーが押されたときの処理
     C*---------------------------------------------------------------
     C           SB2230    BEGSR
     C*
     C                     SETOF                     303233 ERR-OFF
     C*日付チェック
     C*
     C*得意先チェック
     C           S2TKNO    CHAINM420R                98
+----C           *IN98     IFEQ *ON
|    C                     MOVELMSG,2     S9MSG            該当なし
|    C                     SETON                     3032
+----C                     ENDIF
     C*OKなら第3画面へ
+----C           *IN30     IFEQ *OFF
|    C                     Z-ADD03        W@FMT
+----C                     ENDIF
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB3000   第3画面処理
     C*---------------------------------------------------------------
     C           SB3000    BEGSR
     C*
     C*第二画面準備
     C                     MOVEA'001'     *IN,01           Fキー用
     C                     MOVE *BLANK    S9MSG             ERR-MSG
     C                     MOVE *ZERO     CHG               CHANGE-FLAG
+----C           W@MOD     IFEQ 04                         削除
|    C                     MOVELMSG,5     S9MSG            更新確認
+----C                     ENDIF
     C*第二画面繰返し
+----C           W@FMT     DOWEQ03                         第二画面
|    C*画面表示
|    C                     WRITEFMT99
|    C                     WRITEFMT01
|    C                     WRITEFMT02
|    C                     SETON                     2324
|    C                     EXFMTCTL01
|    C                     SETOF                     2324
|    C                     MOVE *BLANK    S9MSG
|    C*
|    C                     SELEC
|    C           *INKL     WHEQ *ON                        取消キー
|    C                     Z-ADD02        W@FMT
|    C                     OTHER
|    C                     EXSR SB3260                     実行キー
|    C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB3260   第3画面のチェック
     C*---------------------------------------------------------------
     C           SB3260    BEGSR
     C*
     C*カーソル位置の獲得
     C                     MOVELWSLIN     WSLINC           行
     C                     MOVELWSCOL     WSCOLC           桁
     C*属性の取得(名前などの取得)
     C*   (必要あれば)
     C*エラーチェック
     C                     SETOF                     2930
     C                     SETOF                     414243
     C*入力あったサブファイルについて
     C                     READCSFL01                    09
+----C           *IN09     DOWEQ*OFF
|    C                     Z-ADDRRN       N                行Y
|    C                     MOVE '1'       CHG,N            変更フラグ
|    C                     SETON                     29
|    C                     EXSR SB3CHK                      CHECK-ERR
|    C                     UPDATSFL01
|    C                     READCSFL01                    09
+----C                     ENDDO
     C*
+----C           *IN30     IFEQ *OFF                        NO-ERROR
|+---C           *IN29     IFEQ *OFF                        NO-CHANGE
||   C                     EXSR SBUPD                       ハィay更新
||   C                     Z-ADD01        W@FMT
|+---C                     ELSE                             CHANGED
||   C                     MOVELMSG,5     S9MSG            更新確認
|+---C                     ENDIF
+----C                     ENDIF
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB3CHK   入力チェック(第3画面)
     C*---------------------------------------------------------------
     C           SB3CHK    BEGSR
     C*
     C*カーソルのある行位置取得
     C                     Z-ADDRRN       S4GYNO           行Y
     C           RRN       DIV  WSPAG     W@WRK   70
     C                     MVR            WSLINE  70
     C                     ADD  006       WSLINE           行位置
     C*
     C*属性の取得(必要あれば名前などの取得)
     C           S4JUSU    MULT S4JUTK    S4JUGK           受注額
     C*チェック
     C                     SETOF                     414243
     C                     SETOF                     27     SFLNXTCHG
     C*品目Y
     C           S4HNNO    IFEQ *BLANK
     C                     SETON                     3041
     C                     MOVELMSG,3     S9MSG
     C                     Z-ADD006       S1COL            ewヨ位置
     C                     SETON                     27     SFLNXTCHG
     C                     ENDIF
     C*受注数
     C           S4JUSU    IFEQ *ZERO
     C                     SETON                     3042
     C                     MOVELMSG,3     S9MSG
     C                     Z-ADD014       S1COL            ewヨ位置
     C                     SETON                     27     SFLNXTCHG
     C                     ENDIF
     C*受注@
     C           S4JUTK    IFEQ *ZERO
     C                     SETON                     3043
     C                     MOVELMSG,3     S9MSG
     C                     Z-ADD026       S1COL            ewヨ位置
     C                     SETON                     27     SFLNXTCHG
     C                     ENDIF
     C*エラーへ位置づけ
     C           *IN30     IFEQ *ON
     C                     Z-ADDWSLINE    S1LIN            行位置
     C                     Z-ADDRRN       RCDNBR
     C                     ENDIF
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SBUPD    ファイル更新
     C*---------------------------------------------------------------
     C           SBUPD     BEGSR
     C*
+----C                     SELEC
+----C           W@MOD     WHEQ 02
|    C* ファイルへ編集
|+---C           01        DO   99        RRN
||+--C           CHG,RRN   IFEQ '1'                         CHG
|||  C           RRN       CHAINSFL01                30
|||  C                     Z-ADDS1JUNO    JDJUNO           受注Y
|||  C                     Z-ADDS4GYNO    JDMENO           行Y
|||  C           KEY99A    CHAINF520R                99
|||  C                     EXSR SB0100                     編集処理
|||+-C           *IN99     IFEQ *OFF
|||| C                     UPDATF520R
|||+-C                     ELSE
|||| C                     WRITEF520R
|||+-C                     ENDIF
||+--C                     ENDIF
|+---C                     ENDDO
+----C           W@MOD     WHEQ 04
|    C*削除モードのとき明細削除
|    C                     Z-ADDS1JUNO    JDJUNO           受注Y
|    C           KEY99     SETLLF520R
|    C           KEY99     READEF520R                    99
|+---C           *IN99     DOWEQ*OFF
||   C                     DELETF520R
||   C           KEY99     READEF520R                    99
|+---C                     ENDDO
|    C*
+----C                     ENDSL
     C*
     C                     CLEARS2TKNO
     C                     MOVE *ZERO     CHG
     C                     Z-ADD01        W@FMT            第一画面へ
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB0100   編集処理
     C*---------------------------------------------------------------
     C           SB0100    BEGSR
     C*
     C                     MOVELS2TKNO    JDTKNO           得意先Y
     C                     MOVELS4HNNO    JDHNNO           品目Y
     C                     Z-ADDS4JUSU    JDJUSU           受注数
     C                     Z-ADDS4JUTK    JDJUTK           受注@
     C                     Z-ADDS2JUDT    JDJUDT           受注日
     C                     Z-ADDS4SEDT    JDSEDT           請求日
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SBEND    終了処理
     C*---------------------------------------------------------------
     C           SBEND     BEGSR
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C                     ENDSR
** MSG **
 該当受注Yありません。
 該当得意先Yありません。
 入力が必要です。
 日付が正しくありません。
 更新確認してください。


1〜5カラムにあるネスト表示は自作のネスト構造解析プログラムでソースに付加したものです。




前ページ 次ページ 目 次

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003