パネル・グループに対する入出力コマンドや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の処理のように記述したものであり本来のパネル・グループの機能を
発揮するような記述ではない。
それではパネル・グループを処理する適切なプログラムとはどのような
ものだろうか?
実はパネル・グループの機能を生かすオブジェクト指向の開発がある。
今までの既成概念が変わってしまうような驚きのオブジェクト指向による開発を
次回に紹介しよう。
