パネル・グループに対する入出力コマンドやRPGの命令は
用意されていないので、すべてAPIによる操作が必要である。
1.最初にAPI: QUIOPNDA によってパネル・グループをオープンする。
2.API:QUIDSPP によってパネルをオープンする。
3.API:QUIGETV によってパネル・グループから値を取得する
4.API:QUIPUTV によって値をパネル・グループに更新する
5.API:QUICLOA によってパネル・グループをクローズする。
というような操作が必要となる。
DSPF を処理するように RPG で記述すると下記のようになる。
[サンプルRPG : PNL001 ]
ソースはこちらから
0001.00 H DFTNAME(PNL001) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** 商品マスターの登録 **************************************** 0003.00 FSHOHIN UF A E K DISK EXTFILE('QTRFIL/SHOHIN') 0004.00 FHINSHU IF E K DISK EXTFILE('QTRFIL/HINSHU') 0005.00 F********************************************************************** 0006.00 0007.00 * CRTRPGMOD OBJ(QTEMP/PNL001) SRCFILE(QTRSRC/QRPGLESRC) 0008.00 * DBGVIEW(*SOURCE) AUT(*ALL) 0009.00 * CRTPGM PGM(QTROBJ/PNL001) MODULE(QTEMP/PNL001 ACTGRP(*NEW) 0010.00 * AUT(*ALL) 0011.00 0012.00 *-------------------------------------------------------------------* 0013.00 * 2017/05/01 : 作成 0014.00 *-------------------------------------------------------------------* 0015.00 *( 作業変数 ) 0016.00 D PNL001PNL S 20 INZ('PNL001PNL QTROBJ ') 0017.00 D AR S 1A DIM(256) 0018.00 D N S 4S 0 0019.00 D TRUE S 1A DIM(256) 0020.00 D TRUE# S 4B 0 INZ(0) 0021.00 D FALSE# S 4B 0 INZ(-1) 0022.00 D RES S 4B 0 0023.00 D HANDLE S 8A 0024.00 D DTALEN S 4B 0 INZ(1024) 0025.00 D QUOT C CONST(X'7D') 0026.00 D OE C CONST(X'0E') 0027.00 D OF C CONST(X'0F') 0028.00 D NULL C CONST(X'00') 0029.00 0030.00 *( PNLGRP 用変数 ) 0031.00 D CFKEY S 4A INZ(X'00000000') 0032.00 D PANEL S 10A 0033.00 D AGAIN S 1A INZ('Y') 0034.00 D STACK S 4A INZ(X'00000001') 0035.00 D MSGKEY S 4A 0036.00 D ERRLST S 4A 0037.00 D WAITTIME S 4A INZ(X'FFFFFFFF') 0038.00 D CF03 S 4A INZ(X'FFFFFFFC') 0039.00 D CF05 S 4A INZ(X'00000005') 0040.00 D CF06 S 4A INZ(X'00000006') 0041.00 D CF12 S 4A INZ(X'FFFFFFF8') 0042.00 D CF13 S 4A INZ(X'0000000D') 0043.00 D CF14 S 4A INZ(X'0000000E') 0044.00 D CF15 S 4A INZ(X'0000000F') 0045.00 D CF17 S 4A INZ(X'00000011') 0046.00 D CF18 S 4A INZ(X'00000012') 0047.00 0048.00 D MSGFILLIB S 20A INZ('QCPFMSG QSYS ') 0049.00 D MSGDTALEN S 4A INZ(X'00000084') 0050.00 D MSGSTK S 4A INZ(X'00000001') 0051.00 D MSGCOUNT S 10I 0 INZ(1) 0052.00 D MSGDTA S 132A 0053.00 0054.00 D APIERR DS QUALIFIED 0055.00 D GETBYT 1 4B 0 INZ(160) 0056.00 D AVLBYT 5 8B 0 INZ(0) 0057.00 D APIID 9 15 0058.00 D APIDTA 17 160 0059.00 0060.00 D DSPRCD E DS EXTNAME(SHOHIN) 0061.00 D HNSNAM 46 59 0062.00 D DSPDTA 1 1024 0063.00 D DIM(1024) 0064.00 0065.00 D*( OPEN_ のプロトタイプ宣言 ) 0066.00 D OPEN_ PR 10I 0 0067.00 D PNLGRP 20A VALUE 0068.00 0069.00 D*( DSPPNL_ のプロトタイプ宣言 ) 0070.00 D DSPPNL_ PR 0071.00 D PANEL 10A VALUE 0072.00 0073.00 D*( SNDMSG_ のプロトタイプ宣言 ) 0074.00 D SNDMSG_ PR 0075.00 D MSGDTA 132A VALUE 0076.00 D MSGTYPE 10A VALUE 0077.00 0078.00 D*( CLOSE_ のプロトタイプ宣言 ) 0079.00 D CLOSE_ PR 0080.00 D HANDLE 8A VALUE 0081.00 0082.00 D*( LRRTN_ のプロトタイプ宣言 ) 0083.00 D LRRTN_ PR 0084.00 0085.00 *( 初期画面 ) 0086.00 C START TAG 0087.00 C CALLP DSPPNL_('DSPHEAD') 0088.00 * ( CF03 )- 終了 0089.00 C *IN03 IFEQ *ON 0090.00 C CALLP LRRTN_ 0091.00 C RETURN 0092.00 C ENDIF 0093.00 C SETOFF 99 0094.00 C SHCODE CHAIN SHOHIN 99 0095.00 C EXSR CHECK 0096.00 C 99 GOTO START 0097.00 *( 明細画面 ) 0098.00 C DSPLY TAG 0099.00 C CALLP DSPPNL_('DSPDTA01') 0100.00 * ( CF03 )- 終了 0101.00 C *IN03 IFEQ *ON 0102.00 C CALLP LRRTN_ 0103.00 C RETURN 0104.00 C ENDIF 0105.00 * ( CF12 )- 戻る 0106.00 C *IN12 IFEQ *ON 0107.00 C SETOFF 12 0108.00 C GOTO START 0109.00 C ENDIF 0110.00 * ( 実行キー ) 0111.00 C EXSR CHECK 0112.00 C GOTO DSPLY 0113.00 0114.00 C****************************************************** 0115.00 C *INZSR BEGSR 0116.00 C****************************************************** 0117.00 C* 初期 CYCLE のみの実行 0118.00 C CLEAR APIERR 0119.00 C EVAL RES = OPEN_(PNL001PNL) 0120.00 C RES IFEQ FALSE# 0121.00 C SETON LR 0122.00 C RETURN 0123.00 C ENDIF 0124.00 C ENDSR 0125.00 C****************************************************** 0126.00 C CHECK BEGSR 0127.00 C****************************************************** 0128.00 C *IN99 IFEQ *ON 0129.00 C EVAL MSGDTA = ' 商品コード ' + 0130.00 C %TRIMR(SHCODE) + 0131.00 C ' が見つかりませんでした。 ' 0132.00 C CALLP SNDMSG_(MSGDTA:'*COMP') 0133.00 C ELSE 0134.00 C MOVE *BLANKS HNSNAM 0135.00 C SETOFF 99 0136.00 C SHSCOD CHAIN HINSHU 99 0137.00 C *IN99 IFEQ *ON 0138.00 C EVAL MSGDTA = ' 品種コード ' + 0139.00 C SHSCOD + ' の誤りです。 ' 0140.00 C CALLP SNDMSG_(MSGDTA:'*COMP') 0141.00 C ENDIF 0142.00 *-------------------------------------------------------------------- 0143.00 C CALL 'QUIPUTV' 0144.00 C PARM HANDLE 0145.00 C PARM DSPRCD 0146.00 C PARM DTALEN 0147.00 C PARM 'DSPRCD' VARRCD 10 0148.00 C PARM APIERR 0149.00 *-------------------------------------------------------------------- 0150.00 C ENDIF 0151.00 C ENDSR 0152.00 ********************************************************* 0153.00 P OPEN_ B EXPORT 0154.00 ********************************************************* 0155.00 D PI 10I 0 0156.00 D PNLGRPLIB 20A VALUE 0157.00 0158.00 D AREA S 4A INZ(X'FFFFFFFF') 0159.00 D EXITPG S 4A INZ(X'00000000') 0160.00 0161.00 C* ( QUIOPNDA : パネル・グループのオープン )*/ 0162.00 *-------------------------------------------------------------------- 0163.00 C CALL 'QUIOPNDA' 0164.00 C PARM HANDLE 0165.00 C PARM PNLGRPLIB 0166.00 C PARM AREA 0167.00 C PARM EXITPG 0168.00 C PARM 'N' OPNOPT 1 0169.00 C PARM APIERR 0170.00 *-------------------------------------------------------------------- 0171.00 C IF APIERR.AVLBYT <> 0 0172.00 C CALLP LRRTN_ 0173.00 C RETURN FALSE# 0174.00 C ENDIF 0175.00 C RETURN TRUE# 0176.00 P E 0177.00 ********************************************************* 0178.00 P DSPPNL_ B EXPORT 0179.00 ********************************************************* 0180.00 D PI 0181.00 D PANEL 10A VALUE 0182.00 0183.00 *-------------------------------------------------------------------- 0184.00 C CALL 'QUIDSPP' 0185.00 C PARM HANDLE 0186.00 C PARM CFKEY 0187.00 C PARM PANEL 0188.00 C PARM 'Y' AGAIN 1 0189.00 C PARM APIERR 0190.00 C PARM 'N' USRTSK 1 0191.00 C PARM STACK 0192.00 C PARM '*CALLER ' UIMMSG 10 0193.00 C PARM MSGKEY 0194.00 C PARM 'D' CSROPT 1 0195.00 C PARM 'NONE' LASLST 4 0196.00 C PARM ERRLST 0197.00 C PARM WAITTIME 0198.00 *-------------------------------------------------------------------- 0199.00 C MOVE *BLANKS MSGKEY 0200.00 C SELECT 0201.00 C WHEN CFKEY = CF03 0202.00 C SETON 03 0203.00 C WHEN CFKEY = CF12 0204.00 C SETON 12 0205.00 *( 実行キー ) 0206.00 C OTHER 0207.00 *-------------------------------------------------------------------- 0208.00 C CALL 'QUIGETV' 0209.00 C PARM HANDLE 0210.00 C PARM DSPRCD 0211.00 C PARM DTALEN 0212.00 C PARM 'DSPRCD' VARRCD 10 0213.00 C PARM APIERR 0214.00 *-------------------------------------------------------------------- 0215.00 C ENDSL 0216.00 P E 0217.00 ********************************************************* 0218.00 P CLOSE_ B EXPORT 0219.00 ********************************************************* 0220.00 D PI 0221.00 D HANDLE 8A VALUE 0222.00 0223.00 *-------------------------------------------------------------------- 0224.00 C CALL 'QUICLOA' 0225.00 C PARM HANDLE 0226.00 C PARM 'M' OPT 1 0227.00 C PARM APIERR 0228.00 *-------------------------------------------------------------------- 0229.00 P E 0230.00 ********************************************************* 0231.00 P SNDMSG_ B EXPORT 0232.00 ********************************************************* 0233.00 D PI 0234.00 D MSGDTA 132A VALUE 0235.00 D MSGTYPE 10A VALUE 0236.00 0237.00 *-------------------------------------------------------------------- 0238.00 C CALL 'QMHSNDPM' 0239.00 C PARM 'CPF9897' MSGID 7 0240.00 C PARM MSGFILLIB 0241.00 C PARM MSGDTA 0242.00 C PARM MSGDTALEN 0243.00 C PARM MSGTYPE 0244.00 C PARM '*' MSGSTK 10 0245.00 C PARM MSGCOUNT 0246.00 C PARM MSGKEY 0247.00 C PARM APIERR 0248.00 *-------------------------------------------------------------------- 0249.00 P E 0250.00 C****************************************************** 0251.00 P LRRTN_ B EXPORT 0252.00 C****************************************************** 0253.00 D PI 0254.00 C SETON LR 0255.00 C HANDLE IFNE *BLANKS 0256.00 C CALLP CLOSE_(HANDLE) 0257.00 C ENDIF 0258.00 P E
[解説]
最初に実行されるサブ・ルーチン: *INZSR で QUIOPNDA でパネル・グループを
オープンしてハンドルを取得している。
ハンドルという概念に馴染みのない人も多いと思うがハンドルとは
ジョブの中でオープンされているパネル・グループを識別するための固有の番号である。
Windowsを考えるとイメージしやすい。
Windowsでもウィンドウ・ハンドルという識別があって複数のウィンドウの中から
どれであるかを識別するための識別子である。
Windowsを操作しているとデスクトップの中にも色々なウィンドウがオープンしているのが
わかるように複数のウィンドウがあるとその中でウィンドウを特定する必要かある。
これと同じように個別のパネル・グループを特定するためにハンドルという固有識別子を
パネル・グループをオープンすると同時に取得して以降は QUICLOA で閉じるまで
そのハンドルによって操作を行う。
パネル・グループをオープンすると QUIDSPP によってパネルを表示する。
メッセージはメッセージを出力した後の MSGKEYを QUIDSPP で指定すると
メッセージを表示することができる。
パネルからのエンド・ユーザーが押した機能キーは CFKEY によって
受取ることができる。
変数値の受取りや更新は VARRCD で定義しておいた変数レコードが
入出力バッファーになるので QUIGETV や QUIPUTV で入出力を行うことができる。
画面は次のように実行される。
CALL QTROBJ/PNL001 + [実行] で
[初期画面パネル: DSPHEAD]
商品マスターの登録 商品コード . . . . . NV-CF1 登録または変更するコードを打鍵して実行キーを押してください。 F3= 終了 (C) COPYRIGHT OFFICE QUATTRO 2020.
↓
[明細画面パネル: DSPDTA01 ]
商品マスターの登録 商品コード . . . . : NV-CF1 商品名 . . . . . . : Cカセット編集ビデオ 単価 . . . . . . . : 58000 品種コード . . . . : 0002 ビデオデッキ 終わり F3= 終了 F12= 取消し
[解説]
RPG と比べて動きはどうだろう?
もし実際に実行されたのであれば RPGに比べてパフォーマンスの良さに
驚かれるはずである。
パネル・グループは RPGやCOBOLに比べると抜群の速さで実行される。
しかしパネル・グループを処理するRPGはご覧のようにDSPFを処理するRPGと
比べてみると冗長で面倒なように見えてしまう。
実はここで示したRPGはRPGプログラマーにとってわかりやすいように
あえてRPGの処理のように記述したものであり本来のパネル・グループの機能を
発揮するような記述ではない。
それではパネル・グループを処理する適切なプログラムとはどのような
ものだろうか?
実はパネル・グループの機能を生かすオブジェクト指向の開発がある。
今までの既成概念が変わってしまうような驚きのオブジェクト指向による開発を
次回に紹介しよう。