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の共用をさらに発展させた応用事例を紹介しよう。