先の例で示したように変数値の値を取得するには QUIGETV API を使用する。
今度は QUIGETV を使ってユーザーがキー入力した値を完了メッセージとして出力する例を示す。
先のソースに
/*(QUIGETV: 変数の取得 )*/ CHGVAR VAR(%BIN(&DTALEN)) VALUE(5) CALL PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN + 'KEYRCD ' &APIERR) SNDPGMMSG MSG(&DSPDTA) MSGTYPE(*COMP)
を追加する。
0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* BNK001CL : パネル表示 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0006.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* + 0007.00 摘要業務ハンドル */ 0008.00 DCL VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) + 0009.00 VALUE('BNK001 TESTOBJ ') 0010.00 DCL VAR(&AREA) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0011.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) 0012.00 DCL VAR(&EXITPG) TYPE(*CHAR) LEN(4) + 0013.00 VALUE(X'00000000') /* 2 進数 */ 0014.00 DCL VAR(&FNCTON) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0015.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) + 0016.00 VALUE('DSPHEAD ') 0017.00 DCL VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y) 0018.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) + 0019.00 VALUE(X'00000000') /* 2 進数 */ 0020.00 DCL VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N) 0021.00 DCL VAR(&STACK) TYPE(*CHAR) LEN(4) + 0022.00 VALUE(X'00000000') /* 2 進数 */ 0023.00 DCL VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER) 0024.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) 0025.00 DCL VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D) 0026.00 DCL VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE) 0027.00 DCL VAR(&ERRLST) TYPE(*CHAR) LEN(4) 0028.00 DCL VAR(&WAITTIME) TYPE(*CHAR) LEN(4) + 0029.00 VALUE(X'FFFFFFFF') /* 2 進数 */ 0030.00 DCL VAR(&CF03) TYPE(*CHAR) LEN(4) + 0031.00 VALUE(X'00000003') /* 2 進数 */ 0032.00 DCL VAR(&ENTER) TYPE(*CHAR) LEN(4) + 0033.00 VALUE(X'0000001B') /* 2 進数 */ 0034.00 DCL VAR(&DSPDTA) TYPE(*CHAR) LEN(1024) 0035.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0036.00 /* MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */ 0037.00 0038.00 /*( QUIOPNDA : パネル・グループのオープン )*/ 0039.00 CHGVAR VAR(&DEC08) VALUE(-1) 0040.00 CHGVAR VAR(%BIN(&AREA)) VALUE(&DEC08) 0041.00 CALL PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA + 0042.00 &EXITPG 'N' &APIERR) 0043.00 /*(QUIPUTV: 変数の更新 )*/ 0044.00 CHGVAR VAR(&DSPDTA) VALUE(' 変更 ') 0045.00 CHGVAR VAR(%BIN(&DTALEN)) VALUE(6) 0046.00 CALL PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN + 0047.00 'MODRCD ' &APIERR) 0048.00 CHGVAR VAR(&DSPDTA) VALUE('0001') 0049.00 CHGVAR VAR(%BIN(&DTALEN)) VALUE(5) 0050.00 CALL PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN + 0051.00 'KEYRCD ' &APIERR) 0052.00 /*( QUIDSPP : パネル表示 )*/ 0053.00 DSPLY: CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL + 0054.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG + 0055.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME) 0056.00 MONMSG MSGID(CPF6A95) 0057.00 /*( CF03 )= 終了 */ 0058.00 IF COND(&FNCTON *EQ &CF03) THEN(DO) 0059.00 /*( QUICLOA : パネル・グループのクローズ )*/ 0060.00 CALL PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR) 0061.00 RETURN 0062.00 ENDDO 0063.00 /*( 実行キー )*/ 0064.00 IF COND(&FNCTON *EQ &ENTER) THEN(DO) 0065.00 /*(QUIGETV: 変数の取得 )*/ 0066.00 CHGVAR VAR(%BIN(&DTALEN)) VALUE(5) 0067.00 CALL PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN + 0068.00 'KEYRCD ' &APIERR) 0069.00 SNDPGMMSG MSG(&DSPDTA) MSGTYPE(*COMP) 0070.00 GOTO CMDLBL(DSPLY) 0071.00 ENDDO 0072.00 0073.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG) 0074.00 SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0075.00 ENDPGM
このケースは簡単なので解説するまでもないであろう。
ところで、これまで CLP によってPNLGRP API の使用方法を示しているが、これは RPGで行うこともできるし、COBOL や C/400でも何の問題もない。
CLP で例を示しているのは RPG, COBOL のユーザーにも共通して理解できるようにしているためであるが、RPGを書くまでもなく CLP でPNLGRPは十分扱うことができる。