IBM iのユーティリティの大半を構成しているパネル・グループは
オブジェクト指向をベースとして開発されている。
それではパネル・グループによるオブジェクト指向の開発手法を
紹介する。
[初期画面を表示するためのコマンド: DSPPNL ]
パネル・グループ表示 (DSPPNL)
選択項目を入力して,実行キーを押してください。
パネル・グループ . . . . . . . > PNL002PNL 名前
ライブラリー . . . . . . . . > QTROBJ 名前 , *LIBL, *CURLIB
パネル名 . . . . . . . . . . . > DSPHEAD 名前
パネルを処理するプログラム . . > PNL002CL 名前
ライブラリー . . . . . . . . > QTROBJ 名前 , *LIBL, *CURLIB
[解説]
これは初期画面パネル: DSPHEAD を表示するためのコマンドである。
このコマンド:DSPPNL は指定されたバネル・グループをオープンして
パネル: DSPHEAD で実行キーが押されたときに呼び出すプログラム:
QTROBJ/PNL002CL を定義してからパネル: DSPHEADを表示する。
[コマンド: DSPPNLのソース]
ソースはこちらから
0001.00 CMD PROMPT(' パネル・グループ表示 ') 0002.00 PARM KWD(PNLGRP) TYPE(PNLGRP) + 0003.00 PROMPT(' パネル・グループ ') 0004.00 PNLGRP: QUAL TYPE(*NAME) LEN(10) MIN(1) 0005.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0006.00 SPCVAL((*LIBL) (*CURLIB)) + 0007.00 PROMPT(' ライブラリー ') 0008.00 PARM KWD(PANEL) TYPE(*NAME) LEN(10) MIN(1) + 0009.00 PROMPT(' パネル名 ') 0010.00 PARM KWD(PGM) TYPE(PGM) + 0011.00 PROMPT(' パネルを処理するプログラム ') 0012.00 PGM: QUAL TYPE(*NAME) LEN(10) MIN(1) 0013.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0014.00 SPCVAL((*LIBL) (*CURLIB)) + 0015.00 PROMPT(' ライブラリー ')
[コンパイル]
CRTCMD CMD(QUATTRO/DSPPNL) PGM(QUATTRO/DSPPNLCL) SRCFILE(R610SRC/QCMDSRC)
AUT(*ALL)
[コマンドを処理するCLP:DSPPNLCL:ソース]
ソースはこちらから
0001.00 PGM PARM(&PNLGRPLIB &PANEL &PGMOBJLIB) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* DSPPNLCL : パネル・グループ表示 */ 0004.00 /* */ 0005.00 /* 2020/01/02 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&PNLGRLIB) TYPE(*CHAR) LEN(20) 0008.00 DCL VAR(&PNLGRP) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&PNLLIB) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&PGMOBJLIB) TYPE(*CHAR) LEN(20) 0012.00 DCL VAR(&PGM) TYPE(*CHAR) LEN(10) 0013.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0015.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0016.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0017.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0018.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0019.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0020.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0021.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0022.00 VALUE('*ESCAPE ') 0023.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1) 0024.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0025.00 VALUE(X'00000000') 0026.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0027.00 VALUE(X'000074') /* 2 進数 */ 0028.00 /*( パネル・グループの変数 )*/ 0029.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* + 0030.00 摘要業務ハンドル */ 0031.00 DCL VAR(&FNCTON) TYPE(*CHAR) LEN(4) + 0032.00 VALUE(X'00000000') /* 2 進数 */ 0033.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) 0034.00 DCL VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y) 0035.00 DCL VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N) 0036.00 DCL VAR(&STACK) TYPE(*CHAR) LEN(4) + 0037.00 VALUE(X'00000001') /* 2 進数 */ 0038.00 DCL VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER) 0039.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) 0040.00 DCL VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D) 0041.00 DCL VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE) 0042.00 DCL VAR(&ERRLST) TYPE(*CHAR) LEN(4) 0043.00 DCL VAR(&WAITTIME) TYPE(*CHAR) LEN(4) + 0044.00 VALUE(X'FFFFFFFF') /* 2 進数 */ 0045.00 DCL VAR(&CF03) TYPE(*CHAR) LEN(4) + 0046.00 VALUE(X'FFFFFFFC') /* 2 進数 */ 0047.00 DCL VAR(&CF05) TYPE(*CHAR) LEN(4) + 0048.00 VALUE(X'00000005') /* 2 進数 */ 0049.00 DCL VAR(&CF06) TYPE(*CHAR) LEN(4) + 0050.00 VALUE(X'00000006') /* 2 進数 */ 0051.00 DCL VAR(&CF12) TYPE(*CHAR) LEN(4) + 0052.00 VALUE(X'FFFFFFF8') /* 2 進数 */ 0053.00 DCL VAR(&CF13) TYPE(*CHAR) LEN(4) + 0054.00 VALUE(X'0000000D') /* 2 進数 */ 0055.00 DCL VAR(&CF14) TYPE(*CHAR) LEN(4) + 0056.00 VALUE(X'0000000E') /* 2 進数 */ 0057.00 DCL VAR(&CF15) TYPE(*CHAR) LEN(4) + 0058.00 VALUE(X'0000000F') /* 2 進数 */ 0059.00 DCL VAR(&CF17) TYPE(*CHAR) LEN(4) + 0060.00 VALUE(X'00000011') /* 2 進数 */ 0061.00 DCL VAR(&CF18) TYPE(*CHAR) LEN(4) + 0062.00 VALUE(X'00000012') /* 2 進数 */ 0063.00 DCL VAR(&VARDTA) TYPE(*CHAR) LEN(1024) 0064.00 DCL VAR(&VARRCD) TYPE(*CHAR) LEN(10) 0065.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0066.00 DCL VAR(&CSRVAR) TYPE(*CHAR) LEN(10) + 0067.00 VALUE('OPT ') 0068.00 DCL VAR(&CSRPOS) TYPE(*CHAR) LEN(2) VALUE(X'0001') 0069.00 DCL VAR(&CSRLST) TYPE(*CHAR) LEN(10) + 0070.00 VALUE('SFL ') 0071.00 DCL VAR(&CSRNAME) TYPE(*CHAR) LEN(10) + 0072.00 VALUE(' ') 0073.00 DCL VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) + 0074.00 VALUE('WRKWINWTR WINDOWS ') 0075.00 DCL VAR(&AREA) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0076.00 DCL VAR(&EXITPG) TYPE(*CHAR) LEN(4) + 0077.00 VALUE(X'00000000') /* 2 進数 */ 0078.00 DCL VAR(&OPT) TYPE(*CHAR) LEN(2) VALUE(X'0000') 0079.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) 0080.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0081.00 0082.00 /*( 環境の取得 )*/ 0083.00 RTVJOBA TYPE(&TYPE) 0084.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0085.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0086.00 ENDDO /* バッチ */ 0087.00 ELSE CMD(DO) /* 対話式 */ 0088.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0089.00 ENDDO /* 対話式 */ 0090.00 0091.00 /*( パラメータの取得 )*/ 0092.00 CHGVAR VAR(&PNLGRP) VALUE(%SST(&PNLGRPLIB 01 10)) 0093.00 CHGVAR VAR(&PNLLIB) VALUE(%SST(&PNLGRPLIB 11 10)) 0094.00 CHGVAR VAR(&PGM) VALUE(%SST(&PGMOBJLIB 01 10)) 0095.00 CHGVAR VAR(&OBJLIB) VALUE(%SST(&PGMOBJLIB 11 10)) 0096.00 0097.00 /*( QUIOPNDA : パネル・グループのオープン )*/ 0098.00 START: CHGVAR VAR(&DEC08) VALUE(-1) 0099.00 CHGVAR VAR(%BIN(&AREA)) VALUE(&DEC08) 0100.00 CALL PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA + 0101.00 &EXITPG 'N' &APIERR) 0102.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0103.00 SNDPGMMSG + 0104.00 MSG('API: QUHDSPH の実行で次のエラーが発生 + 0105.00 しました。 ') MSGTYPE(*DIAG) 0106.00 GOTO APIERR 0107.00 ENDDO 0108.00 CALL PGM(QUIPUTV) PARM(&HANDLE &PGMOBJLIB &DTALEN + 0109.00 'PGMRCD ' &APIERR) 0110.00 DSPLY: 0111.00 CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL + 0112.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG + 0113.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME) 0114.00 CHGVAR VAR(&MSGKEY) VALUE(' ') 0115.00 CHGVAR VAR(&CSROPT) VALUE('D') 0116.00 /*( CF03 )= 終了 */ 0117.00 IF COND(&FNCTON *EQ &CF03) THEN(DO) 0118.00 GOTO CLOSE 0119.00 ENDDO 0120.00 /*( CF12 )= 取消し */ 0121.00 IF COND(&FNCTON *EQ &CF12) THEN(DO) 0122.00 GOTO CLOSE 0123.00 ENDDO 0124.00 /*( 実行キー )*/ 0125.00 GOTO DSPLY 0126.00 0127.00 /*( 適用業務のクローズ )*/ 0128.00 CLOSE: 0129.00 CALL PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR) 0130.00 RETURN 0131.00 0132.00 0133.00 APIERR: 0134.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0135.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0136.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0137.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0138.00 GOTO SNDMSG 0139.00 0140.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0141.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0142.00 MSGFLIB(&MSGFLIB) 0143.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0144.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0145.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0146.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0147.00 ENDDO 0148.00 ELSE CMD(DO) 0149.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0150.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0151.00 MSGTYPE(&MSGTYPE) 0152.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0153.00 ENDDO 0154.00 ENDPGM
[解説]
このCLPの動作は QUIOPNDAによってパネル・グループをオープンして
初期画面パネル: DSPHEADを表示しているだけである。
ただし
0108.00 CALL PGM(QUIPUTV) PARM(&HANDLE &PGMOBJLIB &DTALEN + 0109.00 'PGMRCD ' &APIERR)
によって実行キーが押されたときにプログラム: QTROBJ/PNL002CL を呼び出すように
指示している。
そしてこのCLPはPNL002だけでなくすべてのパネル・グループのオープンに
使用することができることに注目して欲しい。
このコマンドとCLPがあればあらゆるパネル・グループをオープンすることができる。
次に実行キーを押したときに呼び出されるプログラム: PNL002CL を紹介しよう。
[実行キーを押したときに呼び出されるCLP: PNL002CL ]
ソースはこちらから
0001.00 PGM PARM(&RCVPRM) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* PNL002CL : 商品マスター照会 */ 0004.00 /* */ 0005.00 /* 2020/01/02 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&RCVPRM) TYPE(*CHAR) LEN(70) 0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0009.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0010.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0012.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0013.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) 0014.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0015.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0016.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0017.00 VALUE('*ESCAPE ') 0018.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1) 0019.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0020.00 VALUE(X'000074') /* 2 進数 */ 0021.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0022.00 VALUE(X'00000000') 0023.00 /*( PNLGRP 変数 )*/ 0024.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* + 0025.00 摘要業務ハンドル */ 0026.00 DCL VAR(&DSPDTA) TYPE(*CHAR) LEN(1024) 0027.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) + 0028.00 VALUE(X'00000400') /* 2 進数 */ 0029.00 DCL VAR(&FNCTON) TYPE(*CHAR) LEN(4) + 0030.00 VALUE(X'00000000') /* 2 進数 */ 0031.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) + 0032.00 VALUE('DSPDTA01') 0033.00 DCL VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y) 0034.00 DCL VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N) 0035.00 DCL VAR(&STACK) TYPE(*CHAR) LEN(4) + 0036.00 VALUE(X'00000001') /* 2 進数 */ 0037.00 DCL VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER) 0038.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) 0039.00 DCL VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D) 0040.00 DCL VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE) 0041.00 DCL VAR(&ERRLST) TYPE(*CHAR) LEN(4) 0042.00 DCL VAR(&WAITTIME) TYPE(*CHAR) LEN(4) + 0043.00 VALUE(X'FFFFFFFF') /* 2 進数 */ 0044.00 DCL VAR(&CF03) TYPE(*CHAR) LEN(4) + 0045.00 VALUE(X'FFFFFFFC') /* 2 進数 */ 0046.00 DCL VAR(&CF05) TYPE(*CHAR) LEN(4) + 0047.00 VALUE(X'00000005') /* 2 進数 */ 0048.00 DCL VAR(&CF06) TYPE(*CHAR) LEN(4) + 0049.00 VALUE(X'00000006') /* 2 進数 */ 0050.00 DCL VAR(&CF12) TYPE(*CHAR) LEN(4) + 0051.00 VALUE(X'FFFFFFF8') /* 2 進数 */ 0052.00 DCL VAR(&CF13) TYPE(*CHAR) LEN(4) + 0053.00 VALUE(X'0000000D') /* 2 進数 */ 0054.00 DCL VAR(&CF14) TYPE(*CHAR) LEN(4) + 0055.00 VALUE(X'0000000E') /* 2 進数 */ 0056.00 DCL VAR(&CF15) TYPE(*CHAR) LEN(4) + 0057.00 VALUE(X'0000000F') /* 2 進数 */ 0058.00 DCL VAR(&CF17) TYPE(*CHAR) LEN(4) + 0059.00 VALUE(X'00000011') /* 2 進数 */ 0060.00 DCL VAR(&CF18) TYPE(*CHAR) LEN(4) + 0061.00 VALUE(X'00000012') /* 2 進数 */ 0062.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0063.00 0064.00 /*( 環境の取得 )*/ 0065.00 RTVJOBA TYPE(&TYPE) 0066.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0067.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0068.00 ENDDO /* バッチ */ 0069.00 ELSE CMD(DO) /* 対話式 */ 0070.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0071.00 ENDDO /* 対話式 */ 0072.00 0073.00 /*( 入力パラメータの取得 )*/ 0074.00 CHGVAR VAR(&HANDLE) VALUE(%SST(&RCVPRM 17 8)) 0075.00 0076.00 /*( 実行 )*/ 0077.00 CALL PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN + 0078.00 'DSPRCD ' &APIERR) 0079.00 CALL PGM(QTROBJ/PNL002) PARM(&DSPDTA &ERR &MSG) 0080.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ') 0081.00 CALL PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN + 0082.00 'DSPRCD ' &APIERR) 0083.00 IF COND(&MSG *NE ' ') THEN(DO) 0084.00 GOTO SNDMSG 0085.00 ENDDO 0086.00 /*( 明細画面を表示する )*/ 0087.00 DSPLY: 0088.00 CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL + 0089.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG + 0090.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME) 0091.00 CHGVAR VAR(&MSGKEY) VALUE(' ') 0092.00 CHGVAR VAR(&CSROPT) VALUE('D') 0093.00 /*( CF03 )= 終了 */ 0094.00 IF COND(&FNCTON *EQ &CF03) THEN(DO) 0095.00 RETURN 0096.00 ENDDO 0097.00 /*( CF12 )= 取消し */ 0098.00 IF COND(&FNCTON *EQ &CF12) THEN(DO) 0099.00 RETURN 0100.00 ENDDO 0101.00 /*( 実行キー )*/ 0102.00 GOTO DSPLY 0103.00 0104.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0105.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0106.00 MSGFLIB(&MSGFLIB) 0107.00 SNDMSG: 0108.00 IF COND(&MSGID *EQ ' ') THEN(DO) 0109.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0110.00 TOMSGQ(*TOPGMQ) MSGTYPE(*ESCAPE) 0111.00 ENDDO 0112.00 ELSE CMD(DO) 0113.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0114.00 MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) + 0115.00 MSGTYPE(*ESCAPE) 0116.00 ENDDO 0117.00 ENDPGM
[解説]
パネル・グループの機能キー操作によって呼び出されるプログラムは必ず
0001.00 PGM PARM(&RCVPRM) : 0007.00 DCL VAR(&RCVPRM) TYPE(*CHAR) LEN(70)
のパラメータで呼び出される。 そして
073.00 /*( 入力パラメータの取得 )*/ 0074.00 CHGVAR VAR(&HANDLE) VALUE(%SST(&RCVPRM 17 8))
で適用業務ハンドルを取り出すことができる。
そこで入出力バッファー DSPRCDを取り出して RPGプログラム PNL002 で
更新してから QUIPUTV で元のパネル・グループに更新している。
0076.00 /*( 実行 )*/ 0077.00 CALL PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN + 0078.00 'DSPRCD ' &APIERR) 0079.00 CALL PGM(QTROBJ/PNL002) PARM(&DSPDTA &ERR &MSG) 0080.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ') 0081.00 CALL PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN + 0082.00 'DSPRCD ' &APIERR)
後は明細画面のパネル: DSPDTA01 を表示するだけである。
0086.00 /*( 明細画面を表示する )*/ 0087.00 DSPLY: 0088.00 CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL + 0089.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG + 0090.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)
次にRPG: PNL002 のソースを見てみよう。
PNL002 では一体どのような処理が行われているのだろうか?
[ RPG : PNL002のソース ]
ソースはこちらから
桁 . . . . . : 6 100 編集 QTRSRC/QRPGLESRC SEU==> PNL002 *************** データの始め **************** 0001.00 H DFTNAME(PNL002) DATEDIT(*YMD/) BNDDIR('QC2LE') 200102 0002.00 F********** 商品マスターの登録 **************************************** 200102 0003.00 FSHOHIN IF E K DISK EXTFILE('QTRFIL/SHOHIN') 200102 0004.00 FHINSHU IF E K DISK EXTFILE('QTRFIL/HINSHU') 200102 0005.00 F********************************************************************** 200102 0006.00 200102 0007.00 * CRTRPGMOD OBJ(QTEMP/PNL002) SRCFILE(QTRSRC/QRPGLESRC) 200102 0008.00 * DBGVIEW(*SOURCE) AUT(*ALL) 200102 0009.00 * CRTPGM PGM(QTROBJ/PNL002) MODULE(QTEMP/PNL002 ACTGRP(*NEW) 200102 0010.00 * AUT(*ALL) 200102 0011.00 200102 0012.00 *-------------------------------------------------------------------* 200102 0013.00 * 2020/01/02 : 作成 200102 0014.00 *-------------------------------------------------------------------* 200102 0015.00 *( 作業変数 ) 200102 0016.00 D PNL001PNL S 20 INZ('PNL001PNL QTROBJ ') 200102 0017.00 D AR S 1A DIM(256) 200102 0018.00 D N S 4S 0 200102 0019.00 200102 0020.00 D DSPRCD E DS EXTNAME(SHOHIN) 200102 0021.00 D HNSNAM 46 59 200102 0022.00 D DSPDTA 1 1024 200102 0023.00 D DIM(1024) 200102 (C) COPYRIGHT IBM CORP. 1981, 2007. 0024.00 0025.00 C*-------------------------------------------------------------------------+ 0026.00 C *ENTRY PLIST | 0027.00 C PARM DSPRCD | 0028.00 C PARM ERR 1 | 0029.00 C PARM MSG 132 | 0030.00 C*-------------------------------------------------------------------------+ 0031.00 C SETOFF 99 0032.00 C SHCODE CHAIN SHOHIN 99 0033.00 C *IN99 IFEQ *ON 0034.00 C EVAL MSG = ' 商品コード ' + 0035.00 C %TRIMR(SHCODE) + 0036.00 C ' が見つかりませんでした。 ' 0037.00 C ELSE 0038.00 C SETOFF 99 0039.00 C SHSCOD CHAIN HINSHU 99 0040.00 C *IN99 IFEQ *ON 0041.00 C EVAL MSG = ' 品種コード ' + 0042.00 C SHSCOD + ' の誤りです。 ' 0043.00 C ENDIF 0044.00 C ENDIF 0045.00 C 99 EVAL ERR = 'E' 0046.00 C SETON LR 0047.00 C RETURN
[解説]
ご覧のとおりたった47ステップ数の小さなプログラムになっている。
これはこのRPGが商品マスター(SHOHIN)と品種マスター(HINSHU)に
CHAIN命令を実行しているたけの単なるバッチ処理プログラムであるからだ。
バッチ処理なので小さくて画面処理の必要がなくバグの発生可能性が低い。
先の CLP: PNL002CL も少し手を加えれば汎用的なものに変更することが
できる。
DSPPNL の部分はすべての業務で再利用できるので再開発する必要はない。
ということは別の照会業務を開発するのはこのPNL002というプログラムの
部分だけである。
つまり実行キーを押した、とかある機能キーを押した、とかの操作が
行われるようなイベントが発生したときだけの記述をそれぞれ行っていけば
よいわけである。
このようなプログラムの構造をイベント駆動とかイベント・トリガー型のように
表現する。
Windowsで言えば VisualBASICや VisualC++やJavaもイベント駆動である。
ソースが複数個のソースに分かれていることに長年RPGの開発を行ってきた人には
違和感があるかも知れない。
しかしDSPPNLやPNL002CLのモジュール・オブジェクトは一旦バグのない
品質に優れたオブジェクトとして開発してしまえば次回からは
品質の保証されたオブジェクトを組み合わせて使うことができる。
これがオブジェクト指向の本質である。
今までのRPG開発では適用業務のすべての機能を毎回、一から開発しなければ
ならなかった。
しかしパネル・グループによるオブジェクト指向の開発であれば
オブジェクトは再利用できるので品質に優れた開発を短期間のうちに
完成させることができる。
さらに進めばプログラムを共通したものだけにしてプログラムは
開発せずにパネル・グループだけで適用業務を開発することができるようになる。
これが弊社の製品:「PANEL-WORKER」である。
DFU ではチエックもないので不安だしプログラムの知識がにくても
開発できるツールとして今なお現役で活躍している。
(詳細はこちらで)
パネル・グループによるオブジェクト指向開発り理解して頂いたところで
引き続きパネル・グループによるSFL表示の適用業務について
紹介していこう。
最後にここで使用したパネル・グループ PNL002PNL を紹介する。
[パネル・グループ: PNL002PNL ]
ソースはこちらから
( http://218.44.135.18/QSYS.LIB.PGMRLIB.LIB/QPNLSRC.FILE/PNL002PNL.MBR )
0001.00 :PNLGRP. 0002.00 :COPYR .(C) COPYRIGHT OFFICE QUATTRO 2020. 0003.00 :IMPORT NAME='*' PNLGRP='QTRSRC/CMDHLP'. 0004.00 .* ------------------------- 0005.00 .* クラスの定義 0006.00 .* ------------------------- 0007.00 :CLASS NAME=PNL002CL 0008.00 BASETYPE='CHAR 20'. 0009.00 :TL. 0010.00 :TI VALUE='" "'.PNL002CL QTROBJ 0011.00 :ETL. 0012.00 :ECLASS. 0013.00 :CLASS NAME=ANSCL 0014.00 BASETYPE='CHAR 1'. 0015.00 :ECLASS. 0016.00 :CLASS NAME=PNLNAMCL 0017.00 BASETYPE='CHAR 10'. 0018.00 :ECLASS. 0019.00 :CLASS NAME=CSRLSTCL 0020.00 BASETYPE='CHAR 10'. 0021.00 :ECLASS. 0022.00 :CLASS NAME=CSRVARCL 0023.00 BASETYPE='CHAR 10'. 0024.00 :ECLASS. 0025.00 :CLASS NAME=CSRPOSCL 0026.00 BASETYPE='BIN 15'. 0027.00 :ECLASS. 0028.00 :CLASS NAME=CSREIDCL 0029.00 BASETYPE='CHAR 4'. 0030.00 :ECLASS. 0031.00 :CLASS NAME=CSRNAMECL 0032.00 BASETYPE='CHAR 10'. 0033.00 :ECLASS. 0034.00 :CLASS NAME=ADDRCDCL 0035.00 BASETYPE='ZONED 8 0'. 0036.00 :ECLASS. 0037.00 :CLASS NAME=CHGRCDCL 0038.00 BASETYPE='ZONED 8 0'. 0039.00 :ECLASS. 0040.00 :CLASS NAME=DLTRCDCL 0041.00 BASETYPE='ZONED 8 0'. 0042.00 :ECLASS. 0043.00 :CLASS NAME=CHA010 0044.00 BASETYPE='CHAR 10'. 0045.00 :ECLASS. 0046.00 :CLASS NAME=IGC024 0047.00 BASETYPE='IGC 24 OPEN'. 0048.00 :ECLASS. 0049.00 :CLASS NAME=ZON070 0050.00 BASETYPE='ZONED 7 0'. 0051.00 :ECLASS. 0052.00 :CLASS NAME=CHA004 0053.00 BASETYPE='CHAR 4'. 0054.00 :ECLASS. 0055.00 :CLASS NAME=IGC014 0056.00 BASETYPE='IGC 14 OPEN'. 0057.00 :ECLASS. 0058.00 .* ------------------------- 0059.00 .* 変数の定義 0060.00 .* ------------------------- 0061.00 :VAR NAME=PNL002 CLASS=PNL002CL. 0062.00 :VAR NAME=PNLNAM CLASS=PNLNAMCL. 0063.00 :VAR NAME=ANS CLASS=ANSCL. 0064.00 :VAR NAME=CSRLST CLASS=CSRLSTCL. 0065.00 :VAR NAME=CSRPOS CLASS=CSRPOSCL. 0066.00 :VAR NAME=CSRVAR CLASS=CSRVARCL. 0067.00 :VAR NAME=CSREID CLASS=CSREIDCL. 0068.00 :VAR NAME=CSRNAME CLASS=CSRNAMECL. 0069.00 :VAR NAME=ADDRCD CLASS=ADDRCDCL. 0070.00 :VAR NAME=CHGRCD CLASS=CHGRCDCL. 0071.00 :VAR NAME=DLTRCD CLASS=DLTRCDCL. 0072.00 .*...( ユーザー変数定義 )... 0073.00 :VAR NAME=SHCODE CLASS=CHA010. 0074.00 :VAR NAME=SHNAME CLASS=IGC024. 0075.00 :VAR NAME=SHTANK CLASS=ZON070. 0076.00 :VAR NAME=SHSCOD CLASS=CHA004. 0077.00 :VAR NAME=HNSNAM CLASS=IGC014. 0078.00 .* ------------------------- 0079.00 .* レコードの定義 0080.00 .* ------------------------- 0081.00 :VARRCD NAME=PGMRCD VARS='PNL002'. 0082.00 :VARRCD NAME=HEDRCD VARS='SHCODE'. 0083.00 :VARRCD NAME=DSPRCD VARS='SHCODE SHNAME SHTANK SHSCOD HNSNAM'. 0084.00 :VARRCD NAME=HNSRCD VARS=HNSNAM. 0085.00 .* ------------------------- 0086.00 .* 機能キーの定義 0087.00 .* ------------------------- 0088.00 :KEYL NAME=HEDKEYL. 0089.00 :KEYI KEY=ENTER 0090.00 HELP=ENTER 0091.00 ACTION=ENTER 0092.00 VARUPD=YES. 0093.00 :KEYI KEY=HELP 0094.00 HELP=HELP 0095.00 ACTION=HELP. 0096.00 :KEYI KEY=F3 0097.00 HELP=F3 0098.00 ACTION='EXIT SET' 0099.00 VARUPD=YES. 0100.00 F3= 終了 0101.00 :EKEYL. 0102.00 :KEYL NAME=DSPKEYL. 0103.00 :KEYI KEY=ENTER 0104.00 HELP=ENTER 0105.00 VARUPD=YES 0106.00 ACTION=ENTER. 0107.00 :KEYI KEY=HELP 0108.00 HELP=HELP 0109.00 ACTION=HELP. 0110.00 :KEYI KEY=F12 0111.00 HELP=F12 0112.00 ACTION='CANCEL SET' 0113.00 VARUPD=NO. 0114.00 F12= 取消し 0115.00 :KEYI KEY=PAGEUP 0116.00 HELP=PAGEUP 0117.00 ACTION=PAGEUP. 0118.00 :KEYI KEY=PAGEDOWN 0119.00 HELP=PAGEDOWN 0120.00 ACTION=PAGEDOWN. 0121.00 :EKEYL. 0122.00 :KEYL NAME=ENDKEYL. 0123.00 :KEYI KEY=ENTER 0124.00 HELP=ENTER 0125.00 ACTION=ENTER. 0126.00 :KEYI KEY=HELP 0127.00 HELP=HELP 0128.00 ACTION=HELP. 0129.00 :KEYI KEY=F3 0130.00 HELP=F3 0131.00 ACTION='EXIT SET' 0132.00 VARUPD=NO. 0133.00 F3= 終了 0134.00 :KEYI KEY=F12 0135.00 HELP=F12 0136.00 ACTION='CANCEL SET' 0137.00 VARUPD=NO. 0138.00 F12= 取消し 0139.00 :EKEYL. 0140.00 .* ------------------------- 0141.00 .* ヘルプの定義 0142.00 .* ------------------------- 0143.00 :HELP NAME=DSPHEADH. 商品マスターの登録 0144.00 :PC. 0145.00 初期画面 0146.00 :EHELP. 0147.00 :HELP NAME=DSPDTAH. 商品マスターの登録 0148.00 :PC. 0149.00 明細画面 0150.00 :EHELP. 0151.00 :HELP NAME=DSPENDH. 商品マスターの登録 0152.00 :PC. 0153.00 終了画面 0154.00 :EHELP. 0155.00 .* STRHLPDFN : DO NOT REMOVE THIS LINE 0156.00 :HELP NAME=SHCODEH. 商品コード 0157.00 :PC. 0158.00 商品コード 0159.00 :EHELP. 0160.00 :HELP NAME=SHNAMEH. 商品名 0161.00 :PC. 0162.00 商品名 0163.00 :EHELP. 0164.00 :HELP NAME=SHTANKH. 単価 0165.00 :PC. 0166.00 単価 0167.00 :EHELP. 0168.00 :HELP NAME=SHSCODH. 品種コード 0169.00 :PC. 0170.00 品種コード 0171.00 :EHELP. 0172.00 :HELP NAME=HNSNAMH. 品種名 0173.00 :PC. 0174.00 品種名 0175.00 :EHELP. 0176.00 .* ENDHLPDFN : DO NOT REMOVE THIS LINE 0177.00 .* ------------------------- 0178.00 .* 表 示 パ ネ ル 0179.00 .* ------------------------- 0180.00 .* ------------------------ 0181.00 .* DSPHEAD : 初期画面 0182.00 .* ------------------------ 0183.00 :PANEL NAME=DSPHEAD 0184.00 HELP='DSPHEADH' 0185.00 KEYL=HEDKEYL 0186.00 PANELID=PNLNAM 0187.00 ENTER='CALL PNL002' 0188.00 CSRVAR=CSRVAR 0189.00 CSRPOS=CSRPOS 0190.00 CSRLST=CSRLST 0191.00 CSREID=CSREID 0192.00 CSRNAME=CSRNAME 0193.00 TOPSEP=NONE. 0194.00 商品マスターの照会 0195.00 :DATA DEPTH=2 0196.00 HELP='DSPHEADH' 0197.00 BOTSEP=NONE. 0198.00 :DATACOL WIDTH=58. 0199.00 :DATACOL WIDTH='*'. 0200.00 :EDATA. 0201.00 :DATA DEPTH=10 0202.00 SCROLL=NO 0203.00 LAYOUT=1 0204.00 BOTSEP=SPACE. 0205.00 :DATACOL WIDTH=20. 0206.00 :DATACOL WIDTH='*'. 0207.00 .* 0208.00 :DATAGRP GRPSEP=NONE 0209.00 COMPACT. 0210.00 .* DO 0211.00 :DATAI VAR=SHCODE 0212.00 HELP=SHCODEH 0213.00 USAGE=INOUT. 0214.00 商品コード 0215.00 .* END 0216.00 :EDATAGRP. 0217.00 :BOTINST. 登録または変更するコードを打鍵して実行キーを押してください。 0218.00 :EDATA. 0219.00 :EPANEL. 0220.00 .* ------------------------ 0221.00 .* DSPDTA01 : 明細画面 0222.00 .* ------------------------ 0223.00 :PANEL NAME=DSPDTA01 0224.00 HELP='DSPDTAH' 0225.00 KEYL=DSPKEYL 0226.00 PANELID=PNLNAM 0227.00 ENTER='RETURN 27' 0228.00 CSRVAR=CSRVAR 0229.00 CSRPOS=CSRPOS 0230.00 CSRLST=CSRLST 0231.00 CSREID=CSREID 0232.00 CSRNAME=CSRNAME 0233.00 TOPSEP=NONE. 0234.00 商品マスターの照会 0235.00 :DATA DEPTH=2 0236.00 HELP='DSPHEADH' 0237.00 BOTSEP=NONE. 0238.00 :DATACOL WIDTH=58. 0239.00 :DATACOL WIDTH='*'. 0240.00 :EDATA. 0241.00 :DATA DEPTH=01 0242.00 SCROLL=NO 0243.00 LAYOUT=2 0244.00 BOTSEP=NONE 0245.00 COMPACT. 0246.00 :DATACOL WIDTH=20. 0247.00 :DATACOL WIDTH='*'. 0248.00 .* 0249.00 :DATAGRP GRPSEP=NONE 0250.00 COMPACT. 0251.00 :DATAI VAR=SHCODE 0252.00 HELP=SHCODEH 0253.00 USAGE=OUT. 0254.00 商品コード 0255.00 :EDATAGRP. 0256.00 :EDATA. 0257.00 :DATA DEPTH='*' 0258.00 SCROLL=YES 0259.00 LAYOUT=1 0260.00 BOTSEP=NONE 0261.00 COMPACT. 0262.00 :DATACOL WIDTH=20. 0263.00 :DATACOL WIDTH='*'. 0264.00 :DATAI VAR=SHNAME 0265.00 HELP=SHNAMEH 0266.00 USAGE=OUT. 0267.00 商品名 0268.00 :DATAI VAR=SHTANK 0269.00 JUSTIFY=RIGHT 0270.00 HELP=SHTANKH 0271.00 USAGE=OUT. 0272.00 単価 0273.00 :DATAI VAR=SHSCOD 0274.00 HELP=SHSCODH 0275.00 USAGE=OUT. 0276.00 品種コード 0277.00 :DATAIX VAR=HNSNAM 0278.00 USAGE=OUT. 0279.00 :EDATA. 0280.00 :EPANEL. 0281.00 0282.00 :EPNLGRP.
[解説]
初期画面パネル: DSPHEAD で
0187.00 ENTER='CALL PNL002'
のようにして実行キーが押されるとプログラム PNL002CLを呼び出すように
設定されている。
0061.00 :VAR NAME=PNL002 CLASS=PNL002CL. 0081.00 :VARRCD NAME=PGMRCD VARS='PNL002'.
で、このPGMRCD にCLP: DSPPNLCL で
0108.00 CALL PGM(QUIPUTV) PARM(&HANDLE &PGMOBJLIB &DTALEN + 0109.00 'PGMRCD ' &APIERR)
でプログラム名: PNL002CL QTROBJ をセットしている。
[オブジェクト指向のまとめ]
DSPPNL --------------------------> DSPHEAD------------------------> DSPDTA01
パネル・グループを *PNLGRP [実行キー] パネル: DSPDTA01を
表示するだけ パネル:DSPHEADを表示 表示
[オブジェクト指向とは]
・再利用可能なプログラム・オブジェクトに分割して開発
・イベント駆動型の処理構造
[利点]
・品質が保証されているオブジェクトを組み合わせることによって
短期間で高品質な適用業務の開発が可能となる。
・IBMユーティリティも含めてインターフェース・デザインや操作も
統一化を測ることができる。
再デザインしたとしても常に最適なデザイン・バランスが保たれており
誰が開発したとしても同じデザイン結果を得ることができる。