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