RPGによるコーディング 印刷処理
前ページ 次ページ 目 次


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




印刷処理

印刷処理はバッチ処理でのファイルへの出力処理とほとんど同じですが、ページ・オーバーフローのときの
処理(いわゆる改ページ処理)を割り込ませる必要があります。このためには次のようにします。

 1.明細と見出し部分の様式を持った印刷ファイルを準備する。
 2.F仕様書で、ページオーバーフロー時のための標識を定義する。
 3.明細印刷の直前で上記標識により、ページオーバーフローの判定をし、オーバーフローなら、
   見出し印刷を行い、ページ・オーバーフローの解消を行う。

印刷ファイルを準備
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     A* ID   : LM420P
     A* NAME :得意先一覧表
     A*
     A*---------------------------------------------------------------
     A          R HDR01
     A                                       SKIPB(2)
     A                                    55 '得意先一覧表'
     A                                   101 DATE  EDTCDE(Y)
     A                                   111 TIME
     A                                       SPACEA(3)
     A*
     A                                   110 'PAGE.'
     A                                    +1 PAGNBR
     A                                       SPACEA(1)
     A*
     A                                     2'得意先Y'
     A                                    +2'得意先名'
     A                                    58'読みカナ'
     A                                    80'TEL'
     A                                    94'担当営業'
     A                                   106'売上実績'
     A                                       SPACEA(1)
     A*---------------------------------------------------------------
     A          R DTL01
     A                                       SPACEB(1)
     A            P1NUM          5A        2TEXT('得意先Y  ')
     A            P1NMKJ        42O       +7TEXT('得意先名  ')
     A            P1NMKN        20A       +2TEXT('得意先カナ')
     A            P1TEL         12A       +2TEXT('TEL    ')
     A            P1SLNO         4A       +2TEXT('担当営業Y')
     A            P1UR\         11S 0     +8TEXT('売上実績  ')
     A                                       EDTCDE(K)
     A                                       SPACEA(1)

F仕様書で、ページオーバーフロー時のための標識を定義
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     FLM420P  O   E             30     PRINTER                         
     F*                         ↑.....ページ・オーバーフローのための標識

ページ・オーバーフローの判定をし、オーバーフローなら、見出し印刷
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     C* オーバーフロー処理 
     C           *IN30     IFEQ *ON                                   
     C                     WRITEHDR01                                 
     C                     SETOF                     30               
     C                     ENDIF                        

プログラム全体は次のようになります。

     **--------------------------------------------------------------- 
     ** ID   : LM420B                                                  
     ** NAME : 担当者別得意先一覧                                      
     ** FUNC : パラメータで得た営業担当bフものだけ、一覧表にする。
     **--------------------------------------------------------------- 
     H            Y-                                                   
     F*--------------------------------------------------------------- 
     FM420L02 IF  E           K        DISK                            
@@@@@FLM420P  O   E             30     PRINTER                         
     F*                         ↑.....ページオーバーフローのための標識
     C*--------------------------------------------------------------- 
     C           *ENTRY    PLIST                                       
     C                     PARM           P@SLNO  4                    
     C*--------------------------------------------------------------- 
     C* 初期処理                                                       
     C                     SETON                     30                
!!!!!C           P@SLNO    SETLLM420R                                  
!!!!!C           P@SLNO    READEM420R                    99            
     C* 本処理                                                         
     C           *IN99     DOWEQ*OFF                                   
     C                     MOVELTKNUM     P1NUM             得意先   
     C                     MOVELTKNMKJ    P1NMKJ            得意先名   
     C                     MOVELTKNMKN    P1NMKN            得意先カナ
     C                     MOVELTKTEL     P1TEL             TEL    
     C                     MOVELTKSLNO    P1SLNO            担当営業
     C                     MOVELTKUR\     P1UR\             売上実績  
     C* オーバーフロー処理 
@@@@@C           *IN30     IFEQ *ON                                   
@@@@@C                     WRITEHDR01                                 
@@@@@C                     SETOF                     30     over-flow解消
@@@@@C                     ENDIF                                      
     C*
     C                     WRITEDTL01                                 
     C*                                                               
!!!!!C           P@SLNO    READEM420R                    99           
     C                     ENDDO                                      
     C* 終了処理                                                      
     C                     SETON                     LR               
     C                     RETRN    


同一キーレコードの読取り

同一キーを読み取りするには、SETLLとREADE命令を使用します。
SETLL命令は読み取り位置の位置付けをする命令です。(実際の読取はしません。)
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     C           P@SLNO    SETLLM420R                              
     C           P@SLNO    READEM420R                    99        


この例は、キーが1個だけですが、複数個でも同様です。複数個のキーの場合はキーリストを使用します。
キーがブレークしたときは、標識99が*ONになります。準EOFの感覚で使用します。

同一キー読取りのサンプルプログラムを次にしめします。!!!!!を付した個所が該当の個所です。
このプログラムでは、パラメータで得た営業担当bフものだけ、一覧表にしています。

(このプログラムは前述のプログラムと同じものです。)
     **--------------------------------------------------------------- 
     ** ID   : LM420B                                                  
     ** NAME : 担当者別得意先一覧                                      
     ** FUNC : パラメータで得た営業担当bフものだけ、一覧表にする。
     **--------------------------------------------------------------- 
     H            Y-                                                   
     F*--------------------------------------------------------------- 
     FM420L02 IF  E           K        DISK                            
     FLM420P  O   E             30     PRINTER                         
     F*                         ↑.....ページオーバーフローのための標識
     C*--------------------------------------------------------------- 
     C           *ENTRY    PLIST                                       
     C                     PARM           P@SLNO  4                    
     C*--------------------------------------------------------------- 
     C* 初期処理                                                       
     C                     SETON                     30                
!!!!!C           P@SLNO    SETLLM420R                                  
!!!!!C           P@SLNO    READEM420R                    99            
     C* 本処理                                                         
     C           *IN99     DOWEQ*OFF                                   
     C                     MOVELTKNUM     P1NUM             得意先   
     C                     MOVELTKNMKJ    P1NMKJ            得意先名   
     C                     MOVELTKNMKN    P1NMKN            得意先カナ
     C                     MOVELTKTEL     P1TEL             TEL    
     C                     MOVELTKSLNO    P1SLNO            担当営業
     C                     MOVELTKUR\     P1UR\             売上実績  
     C* オーバーフロー処理 
     C           *IN30     IFEQ *ON                                   
     C                     WRITEHDR01                                 
     C                     SETOF                     30               
     C                     ENDIF                                      
     C*
     C                     WRITEDTL01                                 
     C*                                                               
!!!!!C           P@SLNO    READEM420R                    99           
     C                     ENDDO                                      
     C* 終了処理                                                      
     C                     SETON                     LR               
     C                     RETRN                                      


ファイルの更新

レコードの追加、変更、削除をまとめてファイルの更新と呼ぶことにします。


レコードの追加

レコードを追加するには、
1.F仕様書でファイルタイプ(15桁目)をOとするか、
2.66桁目をAとしてレコードが増えることを宣言しておきます。
3.WRITE命令で出力します。


レコードの変更・削除

1.レコードを変更・削除するには、F仕様書でファイルタイプ(15桁目)を、としておきます。
2.一度読込みしておいて、変更のときはUPDAT、削除のときはDELETします。
注:ファイルタイプUのものをREADすると、そのレコードにロックがかかります。(レコード単位のロック)
UPDAT/DELET完了でロック解除となります。読込みしないでUPDAT/DELETするとエラーになります。


例:通し番号の採番プログラム(追加・変更の例)
事務作業の中で、受注b笂`票bネど、通し番号を一元的に発行することがあります。
ここでは、それをプログラムGF910で,一元的に発行管理しようとするものです。

プログラムの説明

このプログラムは業務ID(10桁)により、業務IDごとに通し番号を採ります。
最新番号はファイルに業務IDをキーとして記録し管理します。また、通し番号の上限、下限も記録し、通し番号が
上限に達したなら、下限の番号に戻って採番するものとします。
業務IDごとの管理レコードは別のタイミングで設定されるものとします。もしその設定済の管理レコードがない時は、
省略時解釈として、下限000001、上限999999の管理レコードを、自動的に追加するものとします。


サンプル・プログラム
     H*---------------------------------------------------------------
     H* ID   : GF910
     H* NAME :通し番号採番
     H* FUNC :パラメータで与えられた業務IDにより、採番ファイルを
     H*       よみ、通し番号を採番しパラメータで返す.
     H*       採番ファイルに該当の業務IDのレコードが無いときは、
     H*       同レコードを追加して採番する。
     H*---------------------------------------------------------------
     H            Y-
     F*---------------------------------------------------------------
     F*採番管理ファイル
     FF910    UF  E           K        DISK                      A
     E*---------------------------------------------------------------
     E                    MSG    01  01 40
     C*---------------------------------------------------------------
     C           *ENTRY    PLIST
     C                     PARM           P@GYID 10
     C                     PARM           P@SEQ   60
     C*---------------------------------------------------------------
     C*読取確認
     C           P@GYID    CHAINF910R                99     読取り
     C*該当の業務IDがなければ自動追加
+----C           *IN99     IFEQ *ON
|    C                     MOVELP@GYID    NOGYID            業務ID
|    C                     Z-ADD000000    NOCRNO            CUR
|    C                     Z-ADD000001    NOFRNO            FROM
|    C                     Z-ADD999999    NOTONO            TO
|    C                     MOVELMSG,1     NOTEXT            テキスト
|    C                     WRITEF910R                       レコード追加
|    C           P@GYID    CHAINF910R                99     読取り
+----C                     ENDIF
     C*採番(上限いかなら+1そうでなければ下限から)
+----C           NOCRNO    IFLT NOTONO
|    C                     ADD  001       NOCRNO            採番済
+----C                     ELSE
|    C                     Z-ADDNOFRNO    NOCRNO            採番済
+----C                     ENDIF
     C*戻しへセットと更新
     C                     Z-ADDNOCRNO    P@SEQ             採番済
     C                     UPDATF910R
     C*終了処理
     C                     SETON                     LR
     C                     RETRN
     C*
** MSG **
プログラムによって自動的に追加された。


採番管理ファイルF910

次のように定義されているものとします。
     A*--------------------------------------------------------------
     A* ID   : F910                                                  
     A* NAME : 採番管理ファイル                                      
     A*--------------------------------------------------------------
     A                                      UNIQUE                   
     A          R F910R                                              
     A*
     A            NOGYID        10A         COLHDG(' 業務ID ')     
     A            NOCRNO         6S 0       COLHDG(' 現在 ')       
     A            NOFRNO         6S 0       COLHDG(' 開始 ')       
     A            NOTONO         6S 0       COLHDG(' 終了 ')       
     A            NOTEXT        50O         COLHDG(' テキスト ')     
     A*
     A          K NOGYID    

説明

1.ファイル定義
採番管理ファイル:タイプが,レコード追加ありなのでとなっています。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     F*採番管理ファイル
     FF910    UF  E           K        DISK                      A


2.読取り確認
パラメータでわたされた、業務IDをキーとしてCHAINしています。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     C*読取確認
     C           P@GYID    CHAINF910R                99     読取り


3.新レコード追加と再度CHAIN
  該当業務IDの管理用レコードがないときは、自動追加し、それを直後に読み取りします。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
|    C                     WRITEF910R                       レコード追加
|    C           P@GYID    CHAINF910R                99     読取り


4.パラメータへのセットと更新
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     C*戻しパラメータへセットと更新
     C                     Z-ADDNOCRNO    P@SEQ             採番済
     C                     UPDATF910R


例:落帳処理(削除の例)

トランザクションデータをシステム上に、どの位の期間とっておけばよいのかはシステム設計上、非常に
重要なことです。
この期間が過ぎれば、バックアップとして保管し、不要なデータは削除となるわけですが、この作業を落帳
いいます。
ここではパラメータで与えられた日付を基準日として、受注データの落帳を行なっています。
     H*--------------------------------------------------------------- 
     H* ID   : DF520                                                   
     H* NAME : 落丁処理                                                
     H* FUNC : パラメータで与えられた日付を基準としてそれ以前の        
     H*        受注日のデータを削除する。                              
     F*--------------------------------------------------------------- 
     F* 受注明細ファイル                                               
     FF520    UF  E           K        DISK                            
     C*--------------------------------------------------------------- 
     C           *ENTRY    PLIST                                       
     C                     PARM           P@RKDT  80        落帳基準日 
     C*                                                                
     C                     READ F520R                    99            
     C* 読取りできる間                                                     
+----C           *IN99     DOWEQ*OFF                                   
|+---C           JDJUDT    IFLT P@RKDT                      基準日以前 
||   C                     DELETF520R                       削除       
|+---C                     ENDIF                                       
|    C                     READ F520R                    99            
+----C                     ENDDO                                       
     C* 終了処理                                         
     C                     SETON                     LR  
     C                     RETRN                         


受注明細ファイル(F520)
     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            JDJU@          9S 2       COLHDG(' 受注@ ')         
     A            JDJUDT         8S 0       COLHDG(' 受注日 ')         
     A            JDSEDT         8S 0       COLHDG(' 請求日 ')         
     A*                                                                
     A          K JDJUNO                                               
     A          K JDMENO             


説明:

1.削除(DELET)を行うためには、ファイルのタイプをとします。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     F* 受注明細ファイル                                               
     FF520    UF  E           K        DISK   


2.削除(DELET)は読取をしたものしか削除できません。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
     C                     DELETF520R                       削除    






前ページ 次ページ 目 次

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000