CLP で CALL MYLIB/MENU で呼び出すメニューが多いのだが、やはり GO MENU で呼び出せる正式なメニューを作成しておけば IBM ユーティリティー・メニューとも操作性の統一も図れるしプログラムがアベンドしてもメニューまで終了していまうようなことはない。
メニューまで終了してしまうと、不慣れなユーザーは AS/400 の GO MAIN メニューが表示され、見たことも無い画面でそれ以上の操作ができなくなる。
さて、ユーザー・メニューには次の 3つのタイプがある。
いずれの場合でも最終的に CRTMNU コマンドでメニューが作成される。
表示装置ファイル・メニュー(DSPF)
SDA によって作成されるメニューである。
STRSDA コマンドによって 2=メニューの設計を選択。
メニューイメージおよび、コマンドの処理=Yにして実行。
SDA 画面で画面イメージを登録したら F13=コマンド区域によってオプション毎のコマンド命令を登録。
F3で終了保管する。
SDA を使用しなくても SEU で画面作成後、 メニューと同じ名前のメッセージファイルをCRTMSGF で作成して、WRKMSGD によってメッセージ記述を登録しても良い。
メッセージ識別は オプション 1に対してUSR0001,
オプション2に対して USR0002, 以下 USR0003,USR0004 のように登録する。
メッセージの中に CALL MYLIB/MYPGM のように登録する。
その後 CRTMNU で DSPF を指定してメニューを作成することもできる。
プログラム・メニュー(PGM)
ここで紹介する CLP によるプログラム・メニューは単にプログラムの中でアプリケーション を CALL するのではなく、やはりメッセージファイルを使用している。
そのため CRTCLPGM でプログラムを作成して画面ファイルは CRTDSPF LVLCHK(*NO) で作成して CRTMNU しておけば項目が増えても CLP を修正する必要もないし、CRTMNU の必要もない。
画面を修正してメッセージファイルに項目を追加するだけで良い。
さらに別のメニューを作成するにしても変更箇所はDCLF ステートメントだけなので、新規開発が非常に楽である。
0001.00 PGM PARM(&MENU &MNULIB &RTNCOD)
0002.00 /*---------------------------------------------------------*/
0003.00 /* MN01 : テスト・メニユー */
0004.00 /*---------------------------------------------------------*/
0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0006.00 DCL VAR(&MENU) TYPE(*CHAR) LEN(10)
0007.00 DCL VAR(&MNULIB) TYPE(*CHAR) LEN(10)
0008.00 DCL VAR(&RTNCOD) TYPE(*CHAR) LEN(2) /* +
0009.00 戻りコード */
0010.00 DCLF FILE(QTROBJ/MN01)
0011.00 DCL VAR(&CALCMD) TYPE(*CHAR) LEN(512)
0012.00 DCL VAR(&MSGCMD) TYPE(*CHAR) LEN(512)
0013.00 DCL VAR(&USRNO) TYPE(*CHAR) LEN(7)
0014.00 DCL VAR(&MNUCMD) TYPE(*CHAR) LEN(124)
0015.00 DCL VAR(&WAIT) TYPE(*DEC) LEN(5 0) VALUE(0)
0016.00 DCL VAR(&MSGLEN) TYPE(*DEC) LEN(5 0) VALUE(80)
0017.00 DCL VAR(&CMDLEN) TYPE(*DEC) LEN(5 0) VALUE(557)
0018.00 DCL VAR(&KEYVAR) TYPE(*CHAR) LEN(4)
0019.00 DCL VAR(&LONGCMD) TYPE(*CHAR) LEN(1)
0020.00 DCL VAR(&CMDSTACK) TYPE(*CHAR) LEN(400)
0021.00 DCL VAR(&CMD557) TYPE(*CHAR) LEN(557)
0022.00 DCL VAR(&SX) TYPE(*DEC) LEN(4 0) VALUE(-3)
0023.00 DCL VAR(&CMDPMT) TYPE(*CHAR) LEN(153)
0024.00 DCL VAR(&FLD4) TYPE(*CHAR) LEN(4)
0025.00 DCL VAR(&CPYRGT) TYPE(*CHAR) LEN(80) +
0026.00 VALUE(' -
0027.00 (C) COPYRIGHT OFFICE QUATTRO 1994')
0028.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0029.00
0030.00 CHKOBJ OBJ(QTEMP/MSGDTAQ) OBJTYPE(*DTAQ)
0031.00 MONMSG MSGID(CPF9800) EXEC(DO)
0032.00 CRTDTAQ DTAQ(QTEMP/MSGDTAQ) MAXLEN(128) TEXT('MENU +
0033.00 MSG DTAQ') AUT(*ALL)
0034.00 RMVMSG CLEAR(*ALL)
0035.00 ENDDO
0036.00 CHKOBJ OBJ(QTEMP/CMDDTAQ) OBJTYPE(*DTAQ)
0037.00 MONMSG MSGID(CPF9800) EXEC(DO)
0038.00 CRTDTAQ DTAQ(QTEMP/CMDDTAQ) MAXLEN(557) +
0039.00 TEXT('CMD-STACK DTAQ') AUT(*ALL)
0040.00 RMVMSG CLEAR(*ALL)
0041.00 ENDDO
0042.00 CALL PGM(QRCVDTAQ) PARM('MSGDTAQ ' 'QTEMP ' +
0043.00 80 &ERRMSG &WAIT)
0044.00 IF COND(&ERRMSG *EQ ' ') THEN(CHGVAR +
0045.00 VAR(&ERRMSG) VALUE(&CPYRGT))
0046.00 CALL PGM(QRCVDTAQ) PARM('CMDDTAQ ' 'QTEMP ' +
0047.00 557 &CMD557 &WAIT)
0048.00 IF COND(%SST(&CMD557 1 4) *NE ' ') THEN(CHGVAR +
0049.00 VAR(&SX) VALUE(%SST(&CMD557 1 4)))
0050.00 CHGVAR VAR(&CMDSTACK) VALUE(%SST(&CMD557 5 400))
0051.00 CHGVAR VAR(&CMDLIN) VALUE(%SST(&CMD557 405 153))
0052.00
0053.00 OVRDSPF FILE(MN01) SHARE(*YES)
0054.00 RTVOUTQ:
0055.00 RTVJOBA OUTQ(&OUTQ)
0056.00 DSPLY:
0057.00 SNDF RCDFMT(MN01)
0058.00 DSPCMD:
0059.00 SNDRCVF RCDFMT(MENUFMT)
0060.00 CHGVAR VAR(&RTNCOD) VALUE(X'0000') /* 再表示要求 */
0061.00 CHGVAR VAR(&ERRMSG) VALUE(' ')
0062.00 /*----------------------*/
0063.00 /* 機能キー */
0064.00 /*----------------------*/
0065.00 CF03: IF COND(&IN03 *EQ '1') THEN(DO)
0066.00 CHGVAR VAR(&RTNCOD) VALUE(X'FFFF') /* 終了要求 */
0067.00 RETURN
0068.00 ENDDO
0069.00 CF04: IF COND(&IN04 *EQ '1') THEN(DO)
0070.00 CHGVAR &CALCMD VALUE('?' *CAT &CMDLIN)
0071.00 CALL PGM(QCMDCHK) PARM(&CALCMD 512)
0072.00 MONMSG MSGID(CPF6801) EXEC(DO)
0073.00 GOTO ERROR
0074.00 ENDDO
0075.00 MONMSG MSGID(CPF0006) EXEC(DO)
0076.00 GOTO ERROR
0077.00 ENDDO
0078.00 GOTO CMDEXEC
0079.00 ENDDO
0080.00 CF05: IF COND(&IN05 *EQ '1') THEN(DO)
0081.00 WRKACTJOB
0082.00 GOTO ENDPGM
0083.00 ENDDO
0084.00 CF06: IF COND(&IN06 *EQ '1') THEN(DO)
0085.00 DSPMSG
0086.00 GOTO ENDPGM
0087.00 ENDDO
0088.00 CF09: IF COND(&IN09 *EQ '1') THEN(DO)
0089.00 CHGVAR VAR(&SX) VALUE(&SX + 4)
0090.00 IF COND(&SX *GT 400) THEN(CHGVAR VAR(&SX) +
0091.00 VALUE(1))
0092.00 CHGVAR VAR(&KEYVAR) VALUE(%SST(&CMDSTACK &SX 4))
0093.00 IF COND((&SX *EQ 1) *AND (&KEYVAR *EQ ' ')) +
0094.00 THEN(GOTO ENDPGM)
0095.00 IF COND(&KEYVAR *EQ ' ') THEN(DO)
0096.00 GOTO ENDPGM
0097.00 ENDDO
0098.00 RCVMSG MSGKEY(&KEYVAR) RMV(*NO) MSG(&MSGCMD)
0099.00 CHGVAR VAR(&CALCMD) VALUE(&MSGCMD)
0100.00 CHGVAR VAR(&CMDLIN) VALUE(&CALCMD)
0101.00 IF COND(%SST(&CALCMD 154 350) *NE ' ') THEN(DO)
0102.00 CHGVAR VAR(%SST(&CMDLIN 151 3)) VALUE('...')
0103.00 CHGVAR VAR(&LONGCMD) VALUE('X')
0104.00 ENDDO
0105.00 CHGVAR VAR(&CMDPMT) VALUE(&CMDLIN)
0106.00 GOTO ENDPGM
0107.00 ENDDO
0108.00 CF10: IF COND(&IN10 *EQ '1') THEN(DO)
0109.00 CALL QCMD
0110.00 GOTO ENDPGM
0111.00 ENDDO
0112.00 CF12: IF COND(&IN12 *EQ '1') THEN(DO)
0113.00 CHGVAR VAR(&RTNCOD) VALUE(X'FFFE') /* 取消要求 */
0114.00 RETURN
0115.00 ENDDO
0116.00 HELP: IF COND(&IN19 *EQ '1') THEN(DO)
0117.00 CALL OPMENUJ
0118.00 GOTO ENDPGM
0119.00 ENDDO
0120.00 HOME: IF COND(&IN25 *EQ '1') THEN(DO)
0121.00 CHGVAR VAR(&RTNCOD) VALUE(X'FFFC') /* HOME 要求 */
0122.00 RETURN
0123.00 ENDDO
0124.00 /*----------------------*/
0125.00 /* 選択オプション */
0126.00 /*----------------------*/
0127.00 IF COND((%SST(&CMDLIN 1 1) *GE '0') *AND +
0128.00 (%SST(&CMDLIN 1 1) *LE '9')) THEN(DO)
0129.00 IF COND(%SST(&CMDLIN 1 3) *EQ '90 ') THEN(SIGNOFF)
0130.00 IF COND(%SST(&CMDLIN 2 1) *EQ ' ') THEN(DO)
0131.00 CHGVAR VAR(&USRNO) VALUE('USR000' *TCAT +
0132.00 %SST(&CMDLIN 1 1))
0133.00 ENDDO
0134.00 ELSE CMD(DO)
0135.00 CHGVAR VAR(&USRNO) VALUE('USR00' *TCAT +
0136.00 %SST(&CMDLIN 1 2))
0137.00 ENDDO
0138.00 RTVMSG MSGID(&USRNO) MSGF(MN01) MSG(&MNUCMD)
0139.00 MONMSG MSGID(CPF2400) EXEC(DO)
0140.00 SNDPGMMSG MSGID(CPD6A64) MSGF(QCPFMSG) TOPGMQ(*SAME) +
0141.00 MSGTYPE(*DIAG)
0142.00 GOTO ERROR
0143.00 ENDDO
0144.00 IF COND((%SST(&MNUCMD 1 12) *EQ ' メッセージ ') +
0145.00 *OR (%SST(&MNUCMD 1 12) = ' ')) +
0146.00 THEN(DO)
0147.00 SNDPGMMSG MSGID(CPD6A64) MSGF(QCPFMSG) TOPGMQ(*SAME) +
0148.00 MSGTYPE(*DIAG)
0149.00 GOTO ERROR
0150.00 ENDDO
0151.00 CALL PGM(QCMDEXC) PARM(&MNUCMD 124)
0152.00 GOTO ERROR
0153.00 OPTEND: ENDDO
0154.00 /*----------------------*/
0155.00 /* コマンド実行 */
0156.00 /*----------------------*/
0157.00 CHGVAR VAR(&CALCMD) VALUE(&CMDLIN)
0158.00 CMDEXEC:
0159.00 CALL PGM(QCMDEXC) PARM(&CALCMD 512)
0160.00 SNDPGMMSG MSG(&CALCMD) TOPGMQ(*SAME) MSGTYPE(*RQS)
0161.00 CHGVAR VAR(&KEYVAR) VALUE(' ')
0162.00 RCVMSG PGMQ(*SAME) MSGTYPE(*RQS) RMV(*NO) +
0163.00 KEYVAR(&KEYVAR)
0164.00 IF COND(&KEYVAR *NE ' ') THEN(DO)
0165.00 CHGVAR VAR(&CMDSTACK) VALUE(&KEYVAR *CAT &CMDSTACK)
0166.00 CHGVAR VAR(&SX) VALUE(-3)
0167.00 ENDDO
0168.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG)
0169.00 SNDMSG: SNDPGMMSG MSG(&MSG) TOPGMQ(*EXT) MSGTYPE(*DIAG)
0170.00 CALL PGM(QSNDDTAQ) PARM('MSGDTAQ ' 'QTEMP ' +
0171.00 &MSGLEN &MSG)
0172.00 ENDPGM: CHGVAR VAR(&FLD4) VALUE(&SX)
0173.00 CHGVAR VAR(&CMD557) VALUE(&FLD4 *CAT &CMDSTACK *CAT +
0174.00 &CMDPMT)
0175.00 CALL PGM(QSNDDTAQ) PARM('CMDDTAQ ' 'QTEMP ' +
0176.00 &CMDLEN &CMD557)
0177.00 ENDPGM
パネル・グループ・メニュー
ライブラリー QSYS の中のオブジェクト・タイプ*MENU を PDM で検索して欲しい。
ほとんどのメニューは 属性=UIM であることに気づくであろう。
何を隠そう UIM こそが OS/400 のインターフェースの殆どを形成しているパネル・グループである。
PANEL-WORKER のメニュー処理を使用すれば、わずか数分で IBM 提供のメニューと同じパネル・グループによるメニューを簡単に生成することができる。