RPG

345. 2つのプログラムでDSPFを共用するには

2つのプログラムでDSPFを共用させたい場合がある。
例えばあるプログラムでカーソルの位置をセットしておいて
別のプログラムでその位置を取得して何等かの処理をする
といった具合である。

次の例を見て欲しい。
(1) RPGプログラム: RPG001は下位のプログラムで
RPG002というプログラムを呼び出して実行させる。

(2)呼び出されたRPG002はDSPF: RPG001FM に値: NV-CF1 を
セットして親のRPG001に制御を戻す

(3)親に戻るとRPG001はそのレコードを読んで
処理を行う。

[親プログラム: RPG001 ]

ソースはこちらから

0001.00 H DFTNAME(RPG001) DATEDIT(*YMD/)                                                     
0002.00 F******** 商品マスターの登録           ***************************                   
0003.00 FRPG001FM  CF   E             WORKSTN                                                
0004.00 FSHOHIN    UF A E           K DISK                                                   
0005.00 FHINSHU    IF   E           K DISK                                                   
0006.00 F*****************************************************************                   
0007.00 D SAVDTA          S              1    DIM(1024)                             SAVE-データ
0008.00 D ERR             S              4    DIM(18)                                        
0009.00 D MSG             S              4    DIM(19)                                        
0010.00 D*   SAVE-RESTORE のための表示画面の データ・ストラクチャー                                    
0011.00 D*        表示画面 データ は DSPDTA に保存される                                       
0012.00 D SAVEDS        E DS                  EXTNAME(SHOHIN)                                
0013.00 D  DSPDTA                 1   1024                                                   
0014.00 D                                     DIM(1024)                             入力 データ
0015.00 D DDS001        E DS                  EXTNAME(HINSHU)                                
0016.00 D* LIB名付きPGM名                                              *               
0017.00 D RPG002          C                   CONST('R610OBJ/RPG002')                        
0018.00 C                   MOVE      ERR(18)       MSG(19)                                  
0019.00 C                   DO        *HIVAL                                                 
0020.00 C                   EXSR      HEAD                                                   
0021.00 C                   EXSR      DSPLY                                                  
0022.00 C                   END                                                              
0023.00 C     END           TAG                                                              
0024.00 C******************************************************                                  
0025.00 C     *INZSR        BEGSR                                                                
0026.00 C******************************************************                                  
0027.00 C*  初期 サイクル のみの実行                                                                 
0028.00 C                   SETON                                        41        DSPDTA01 出力 
0029.00 C                   Z-ADD     41            DN                2 0           画面標識     
0030.00 C                   Z-ADD     02            FRMSU             2 0           画面様式数   
0031.00 C*( DS の数字 フィールド の クリヤー )                                                           
0032.00 C                   EXSR      CLEAR                                                      
0033.00 C     INZEND        ENDSR                                                                
0034.00 C******************************************************                                  
0035.00 C     HEAD          BEGSR                                                                
0036.00 C******************************************************                                  
0037.00 C*  DSPHEAD  の チエックルーチン                                                                 
0038.00 C*----------------------------------------------------*                                  
0040.00 C                   CALL      RPG002                                                     
0041.00 C                   PARM      'DSPHEAD   '  FORMAT           10                          
0042.00 C                   READ      RPG001FM                               99    |             
0043.00 C*----------------------------------------------------*                                  
0044.00 C                   SETOFF                                       919299                  
0045.00 C*( CF03 )- 終了                                                                         
0046.00 C   03              SETON                                        LR                      
0047.00 C   LR              EXSR      LRRTN                                                      
0048.00 C   LR              RETURN                                                    
0049.00 C*( 実行キー )                                                                
0050.00 C                   EXSR      CLEAR                                           
0051.00 C*  TRNKEY: 更新する データファイル の KEY-LIST                                     
0052.00 C*----------------------------------------------------+                       
0053.00 C     TRNKEY        KLIST                                                  |  
0054.00 C                   KFLD                    SHCODE                         |  
0055.00 C*----------------------------------------------------+                       
0056.00 C     KEYGET        TAG                                                       
0057.00 C*  データファイル を検索する                                                       
0058.00 C                   SETOFF                                       90           
0059.00 C     TRNKEY        CHAIN     SHOHIN                             90           
0060.00 C   90              MOVE      ' 登録 '      DSPMSG            6               
0061.00 C  N90              MOVE      ' 変更 '      DSPMSG                            
0062.00 C  N90              EXSR      CHECK                                           
0063.00 C* DATA-SAVE FOR BACK-UP                                                      
0064.00 C  N90              MOVE      DSPDTA        SAVDTA                            
0065.00 C     HEDEND        ENDSR                                                     
0066.00 C******************************************************                       
0067.00 C     DSPLY         BEGSR                                                     
0068.00 C******************************************************                       
0069.00 C                   DO        *HIVAL                                          
0070.00 C*----------------------------------------------------+                       
0071.00 C                   EXFMT     DSPDTA01                                     |  
0072.00 C*----------------------------------------------------+                        
0073.00 C                   SETOFF                                       919299        
0074.00 C*( CF03 )- 終了                                                               
0075.00 C   03              SETON                                        LR            
0076.00 C   LR              EXSR      LRRTN                                            
0077.00 C   LR              RETURN                                                     
0078.00 C*( 実行キー )                                                                 
0079.00 C* ( 入力内容の チエック )                                                         
0080.00 C                   EXSR      CHECK                                            
0081.00 C*( CF10 )- 更新                                                               
0082.00 C     *IN10         IFEQ      *ON                                              
0083.00 C*----------------------------------------------------*                        
0084.00 C   90              WRITE     SHOHINR                                      |   
0085.00 C  N90              UPDATE    SHOHINR                                      |   
0086.00 C*----------------------------------------------------*                        
0087.00 C                   SETOFF                                       10            
0088.00 C                   LEAVE                                                      
0089.00 C                   END                                                        
0090.00 C*                                                                             
0091.00 C                   END                                                        
0092.00 C                   ENDSR                                                      
0093.00 C******************************************************                        
0094.00 C     CHECK         BEGSR                                                      
0095.00 C******************************************************                        
0096.00 C*  DSPDTA01 の チエックルーチン                                                           
0097.00 C*----------------------------------------------------*                            
0098.00 C*( SHSCOD    :  品種 コード          :( CHAIN ファイル )                            
0099.00 C*----------------------------------------------------*                            
0100.00 C*                                                                                 
0101.00 C     SHSCOD        IFNE      *BLANKS                                       IF-    
0102.00 C*----------------------------------------------------+                            
0103.00 C     CHE001        KLIST                                                  |       
0104.00 C                   KFLD                    SHSCOD                         |       
0105.00 C*----------------------------------------------------+                            
0106.00 C                   CLEAR                   DDS001                          外部 DS
0107.00 C                   SETOFF                                       99                
0108.00 C     CHE001        CHAIN     HINSHU                             99                
0109.00 C   99              SETON                                        93  99    ERRMSG  
0110.00 C   99              GOTO      END01                                                
0111.00 C                   END                                                     ENDRTN 
0112.00 C     END01         ENDSR                                                          
0113.00 C*****************************************************                             
0114.00 C     LRRTN         BEGSR                                                          
0115.00 C*****************************************************                             
0116.00 C                   ENDSR                                                          
0117.00 C*****************************************************                             
0118.00 C     CLEAR         BEGSR                                                          
0119.00 C*****************************************************                             
0120.00 C     *NOKEY        CLEAR                   SHOHINR
0121.00 C     CLREND        ENDSR     


                       

[コンパイル]
CRTBNDRPG PGM(R610OBJ/RPG001) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

[共用するDSPF: RPG001FM ]

ソースはこちらから

0001.00      A                                      DSPSIZ(24 80 *DS3)               
0002.00      A                                      MSGLOC(24)                       
0003.00      A                                      PRINT                            
0004.00      A          R DSPDTA01                                                   
0005.00      A                                      TEXT(' 明細画面 01')             
0006.00      A                                      CF03(03 ' 終了 ')                
0007.00      A                                      CF10(10 ' 更新 ')                
0008.00      A                                      CF23(23 ' 削除 ')                
0009.00      A                                      CF12(12 ' 前画面 ')              
0010.00      A                                      ROLLUP(07)                       
0011.00      A                                      ROLLDOWN(08)                     
0012.00      A                                      SETOF(99)                        
0013.00      A                                      KEEP                             
0014.00      A                                      BLINK                            
0015.00      A                                  1 27' 商品マスターの照会 '           
0016.00      A                                      DSPATR(RI)                       
0017.00      A            DSPMSG         6A  O  1 72TEXT(' 維持モード ')             
0018.00      A                                      DSPATR(HI)                       
0019.00      A                                  2  2' 商品 コード'                     
0020.00      A            SHCODE        10A  O  2 13TEXT(' 商品 コード')               
0021.00      A  91                                  ERRMSG('ロールアップ できない ' 91)   
0022.00      A  92                                  ERRMSG('ロールダウン できない ' 92)   
0023.00      A                                  5 10' 商品名 '                       
0024.00      A            SHNAME        24O  B  5 24TEXT(' 商品名 ')                     
0025.00      A                                  8 10' 単価 '                             
0026.00      A            SHTANK         7Y 0B  8 24TEXT(' 単価 ')                       
0027.00      A                                      CHECK(RB)                            
0028.00      A                                      EDTCDE(K)                            
0029.00      A                                      DSPATR(CS)                           
0030.00      A                                 11 10' 品種 コード'                         
0031.00      A            SHSCOD         4A  B 11 24TEXT(' 品種 コード')                   
0032.00      A  93                                  ERRMSG(' 品種 コード の誤りです。    - 
0033.00      A                                                                ' 93)      
0034.00      A                                 23  2'F3= 終了 '                          
0035.00      A                                 23 35'F10= 更新 '                         
0036.00      A                                 23 53'F23= 削除 '                         
0037.00      A                                 23 69'F12= 前画面 '                       
0038.00      A            HNSNAM        14   O 11 31                                     
0039.00      A          R DSPHEAD                                                        
0040.00      A                                      TEXT(' 初期画面 ')                   
0041.00      A                                      CF03(03 ' 終了 ')                    
0042.00      A                                      ROLLUP(07)                           
0043.00      A                                      ROLLDOWN(08)                         
0044.00      A                                      BLINK                                
0045.00      A                                  1 27' 商品マスターの照会 '               
0046.00      A                                      DSPATR(RI)                           
0047.00      A                                  2  2' 商品 コード'                         
0048.00      A            SHCODE        10A  B  2 13TEXT(' 商品 コード          ')    
0049.00      A                                      AUTO(RA)                        
0050.00      A  91                                  ERRMSG('ロールアップ できない ' 91)  
0051.00      A  92                                  ERRMSG('ロールダウン できない ' 92)  
0052.00      A                                 11 13' 登録または変更する コード を +  
0053.00      A                                       入れて実行 キー を押しなさい '   
0054.00      A                                      DSPATR(HI)                      
0055.00      A                                 22  2'ROLL UP/DOWN'                  
0056.00      A                                 23  2'F3= 終了 '  


                 

[コンパイル]

CRTDSPF FILE(R610OBJ/RPG001FM) SRCFILE(R610SRC/QDSPSRC) SHARE(*YES) LVLCHK(*NO) AUT(*ALL)

[子プログラム: RPG002 ]

ソースはこちらから

0001.00 H DFTNAME(RPG002) DATEDIT(*YMD/)                                            
0002.00 F******** 商品マスターの登録           ***************************          
0003.00 FRPG001FM  CF   E             WORKSTN                                       
0004.00 F*****************************************************************          
0005.00 C* 外部からの パラメーター の受取                                                
0006.00 C*----------------------------------------------------+                     
0007.00 C     *ENTRY        PLIST                                                  |
0008.00 C                   PARM                    FORMAT           10            |
0009.00 C*----------------------------------------------------+                     
0010.00 C     FORMAT        IFEQ      'DSPHEAD   '                                  
0011.00 C                   MOVEL(P)  'NV-CF1'      SHCODE                          
0012.00 C                   WRITE     DSPHEAD                                       
0013.00 C                   RETURN                                                  
0014.00 C                   END                                                     
0015.00 C                   SETON                                        LR         
0016.00 C                   RETURN    


                                                

[コンパイル]

CRTBNDRPG PGM(R610OBJ/RPG002) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO) ACTGRP(*CALLER) DBGVIEW(*SOURCE) AUT(*ALL)

[CLP: PGM001CL ]

ソースはこちらから

0001.00              PGM                                                      
0002.00 /*---------------------------------------------------------*/         
0003.00 /*   RPG001CL :   商品マスターの登録                       */         
0004.00 /*---------------------------------------------------------*/         
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                
0006.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))       
0007.00                                                                       
0008.00              OVRDSPF    FILE(RPG001FM) WAITRCD(*IMMED) SECURE(*YES) + 
0009.00                           OVRSCOPE(*JOB) SHARE(*YES)                  
0010.00              CALL       PGM(R610OBJ/RPG001)                           
0011.00              DLTOVR     FILE(RPG001FM) LVL(*JOB)                      
0012.00              RETURN                                                   
0013.00                                                                       
0014.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)             
0015.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                      
0016.00              ENDPGM      


                                             

[解説]

RPG001では

0038.00 C*----------------------------------------------------*                                  
0040.00 C                   CALL      RPG002                                                     
0041.00 C                   PARM      'DSPHEAD   '  FORMAT           10                          
0042.00 C                   READ      RPG001FM                               99    |             
0043.00 C*----------------------------------------------------*                      

の部分で画面レコード: DSPHEADを自分では出力せずに
RPG002を呼び出している。
呼び出されたRPG002 では

0011.00 C                   MOVEL(P)  'NV-CF1'      SHCODE   
0012.00 C                   WRITE     DSPHEAD                
0013.00 C                   RETURN                           

として画面レコードに NV-CF1をセットして WRITEしてからRPG001に
戻している。
実行してみると次のような画面になる。

                           商品マスターの照会                     
  商品 コード NV-CF1                                                
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
             登録または変更する コード を入れて実行 キー を押しなさい 
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
                                                                  
 ROLL UP/DOWN                                                     
 F3= 終了                                                         

[解説]

この処理のキー・ポイントは呼び出されるRPG002 を ACTGRP(*CALLER) として
コンパイルしている点にある。
ACTGRP(*NEW)でコンパイルすると RPG002が終了した時点でDSPF: PGM001FM が
閉じられてしまうので戻った時点で RPG001は画面レコード: DSPHEADを
読めなくなってしまう。

次回はこのDSPFの共用をさらに発展させた応用事例を紹介しよう。