コマンドを作成しても、それに対するヘルプも併せて入れておけば
そのコマンドを利用する人にとってよりわかりやすくなる。
しかしコマンドの F1-ヘルプとなるパネル・グループ(PNLGRP)は
利用している人も少ないし、ヘルプを作成の都度、どこかの
パネル・グループを探し出して挿入するのも面倒な話である。
第一、コマンドのパラメータをいちいち調べてパネル・グループに
記述していくのは面倒で面白くない作業である。
となればコマンドのヘルプを作成する機会というかモチベーションが
減ってしまうためにヘルプのないコマンドが社内に横行してしまうことになる。
そこでコマンド・ソースを読んでとりあえず簡単にヘルプ・ソースを生成してくれる
仕組みを作ったのでここで紹介しよう。
小さなプログラムであるが面倒がり屋にとっては重宝してヘルプを作ろうかと
いう気にさせてくれれば幸いである。
CRTCMDHLPの最後のパラメータとして「コマンドにヘルプを追加」とあるが
このパラメータを *YES
にして実行すると既存のコマンドに、ここで作成した
ヘルプの記述を追加してくれるのである。
コマンドを再コンパイル必要もない。
したがってこの CRTCMDHLPを実行直後には、元のコマンドをF4キーで実行すると
F1キーを押すだけでもうこのヘルプが使えるというスグレモノである。
弊社でもCRTCMDHLPによってコマンドに対するヘルプの追加が大幅に進んだ。
ヘルプの追加には CRTCMDHLPは非常に役に立つ。
久しぶりに頻繁に使える便利な機能であり使えば使うほどに
便利であることを実感している。
CRTCMDHLP を使えばヘルプを作るのが楽しくなるほどである。
是非、社内用のコマンドにも CRTCMDHLP でヘルプを追加して頂きたい。
0001.00 CMD PROMPT(' コマンド用ヘルプの作成 ') 0002.00 PARM KWD(CMD) TYPE(CMD) + 0003.00 PROMPT(' コマンド ') 0004.00 CMD: QUAL TYPE(*NAME) LEN(10) SPCVAL((*NONE)) MIN(1) 0005.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0006.00 SPCVAL((*LIBL)) PROMPT(' ライブラリー ') 0007.00 PARM KWD(SRCF) TYPE(SRCF) + 0008.00 PROMPT(' ソース・ファイル ') 0009.00 SRCF: QUAL TYPE(*NAME) LEN(10) DFT(QHLPSRC) EXPR(*YES) 0010.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0011.00 SPCVAL((*LIBL) (*CURLIB)) + 0012.00 PROMPT(' ライブラリー ') 0013.00 PARM KWD(TOMBR) TYPE(*NAME) LEN(10) DFT(*CMD) + 0014.00 SPCVAL((*CMD)) + 0015.00 PROMPT(' 出力 HELP ソース・メンバー ') 0016.00 PARM KWD(MBROPT) TYPE(*INT4) RSTD(*YES) DFT(*ADD) + 0017.00 SPCVAL((*ADD 2) (*REPLACE 3)) EXPR(*YES) + 0018.00 PROMPT(' レコードの置き換えまたは追加 ') 0019.00 PARM KWD(CHGCMD) TYPE(*CHAR) LEN(4) RSTD(*YES) + 0020.00 DFT(*NO) VALUES(*YES *NO) + 0021.00 PROMPT(' コマンドにヘルプを追加 ')
0001.00 PGM PARM(&CMDOBJLIB &SRCFILLIB &TOMBR &MBROPT + 0002.00 &CHGCMD) 0003.00 /*-------------------------------------------------------------------*/ 0004.00 /* CRTCMDHLPC : コマンド用ヘルプの作成 */ 0005.00 /* */ 0006.00 /* 2016/06/24 作成 */ 0007.00 /*-------------------------------------------------------------------*/ 0008.00 DCL VAR(&CMDOBJLIB) TYPE(*CHAR) LEN(20) 0009.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20) 0012.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0013.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0015.00 DCL VAR(&TOSRCF) TYPE(*CHAR) LEN(10) 0016.00 DCL VAR(&TOSRCLIB) TYPE(*CHAR) LEN(10) 0017.00 DCL VAR(&TOMBR) TYPE(*CHAR) LEN(10) 0018.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) 0019.00 DCL VAR(&MBROPT) TYPE(*INT) LEN(4) 0020.00 DCL VAR(&REPLACE) TYPE(*CHAR) LEN(8) 0021.00 DCL VAR(&CHGCMD) TYPE(*CHAR) LEN(4) 0022.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0023.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0024.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0025.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0026.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0027.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0028.00 VALUE('*ESCAPE ') 0029.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0030.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0031.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0032.00 VALUE(X'000074') /* 2 進数 */ 0033.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0034.00 VALUE(X'00000000') 0035.00 DCL VAR(&ERRLVL) TYPE(*DEC) LEN(2 0) 0036.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0037.00 0038.00 /* 環境の取得 */ 0039.00 RTVJOBA TYPE(&TYPE) 0040.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0041.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0042.00 ENDDO /* バッチ */ 0043.00 ELSE CMD(DO) /* 対話式 */ 0044.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0045.00 ENDDO /* 対話式 */ 0046.00 0047.00 /* パラメータの取得 */ 0048.00 CHGVAR VAR(&CMD) VALUE(%SST(&CMDOBJLIB 01 10)) 0049.00 CHGVAR VAR(&OBJLIB) VALUE(%SST(&CMDOBJLIB 11 10)) 0050.00 CHGVAR VAR(&TOSRCF) VALUE(%SST(&SRCFILLIB 01 10)) 0051.00 CHGVAR VAR(&TOSRCLIB) VALUE(%SST(&SRCFILLIB 11 10)) 0052.00 IF COND(&TOMBR *EQ '*CMD ') THEN(DO) 0053.00 CHGVAR VAR(&TOMBR) VALUE(&CMD *TCAT 'H') 0054.00 ENDDO 0055.00 IF COND(&MBROPT *EQ 3) THEN(DO) 0056.00 CHGVAR VAR(&REPLACE) VALUE('*REPLACE') 0057.00 ENDDO 0058.00 ELSE CMD(DO) 0059.00 CHGVAR VAR(&REPLACE) VALUE('*ADD ') 0060.00 ENDDO 0061.00 0062.00 /*( CMD ソースの取得 )*/ 0063.00 RTVOBJD OBJ(&OBJLIB/&CMD) OBJTYPE(*CMD) + 0064.00 RTNLIB(&OBJLIB) TEXT(&TEXT) SRCF(&SRCF) + 0065.00 SRCFLIB(&SRCFLIB) SRCMBR(&SRCMBR) 0066.00 MONMSG MSGID(CPF9800) EXEC(DO) 0067.00 GOTO ERROR 0068.00 ENDDO 0069.00 0070.00 /*( 出力ソース・ファイルの検討 )*/ 0071.00 CHKOBJ OBJ(&TOSRCLIB/&TOSRCF) OBJTYPE(*FILE) 0072.00 MONMSG MSGID(CPF9800) EXEC(DO) 0073.00 GOTO ERROR 0074.00 ENDDO 0075.00 CHKOBJ OBJ(&TOSRCLIB/&TOSRCF) OBJTYPE(*FILE) + 0076.00 MBR(&TOMBR) 0077.00 MONMSG MSGID(CPF9800) EXEC(DO) 0078.00 ADDPFM FILE(&TOSRCLIB/&TOSRCF) MBR(&TOMBR) TEXT(&TEXT) 0079.00 GOTO CLRPFM 0080.00 ENDDO 0081.00 IF COND(&REPLACE *EQ '*ADD ') THEN(DO) 0082.00 CHGVAR VAR(&MSG) VALUE(' メンバー ' *CAT &TOMBR + 0083.00 *TCAT ' は既に存在しています。 ') 0084.00 GOTO SNDMSG 0085.00 ENDDO 0086.00 CLRPFM: CLRPFM FILE(&TOSRCLIB/&TOSRCF) MBR(&TOMBR) 0087.00 CHGPFM FILE(&TOSRCLIB/&TOSRCF) MBR(&TOMBR) + 0088.00 SRCTYPE(HELP) TEXT(&TEXT) 0089.00 0090.00 /*( HELP ソースの作成 )*/ 0091.00 OVRDBF FILE(QCMDSRC) TOFILE(&SRCFLIB/&SRCF) + 0092.00 MBR(&SRCMBR) SECURE(*YES) OVRSCOPE(*JOB) 0093.00 OVRDBF FILE(QPNLSRC) TOFILE(&TOSRCLIB/&TOSRCF) + 0094.00 MBR(&TOMBR) SECURE(*YES) OVRSCOPE(*JOB) 0095.00 CALL PGM(QUATTRO/CRTCMDHLP) PARM(&CMD &TOMBR &MSG + 0096.00 &ERRLVL) 0097.00 DLTOVR FILE(QCMDSRC QPNLSRC) LVL(*JOB) 0098.00 IF COND(&ERRLVL *EQ 0) THEN(DO) 0099.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ') 0100.00 ENDDO 0101.00 0102.00 /*( CMD の変更 )*/ 0103.00 IF COND(&CHGCMD *EQ '*YES') THEN(DO) 0104.00 CRTPNLGRP PNLGRP(&OBJLIB/&TOMBR) + 0105.00 SRCFILE(&TOSRCLIB/&TOSRCF) + 0106.00 SRCMBR(*PNLGRP) AUT(*ALL) 0107.00 CHGCMD CMD(&OBJLIB/&CMD) HLPPNLGRP(&OBJLIB/&TOMBR) + 0108.00 HLPID(&CMD) 0109.00 GOTO ERROR 0110.00 ENDDO 0111.00 0112.00 ENDDO 0113.00 GOTO SNDMSG 0114.00 0115.00 APIERR: 0116.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0117.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0118.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0119.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0120.00 GOTO SNDMSG 0121.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0122.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0123.00 MSGFLIB(&MSGFLIB) 0124.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0125.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0126.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0127.00 ENDDO 0128.00 ELSE CMD(DO) 0129.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0130.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0131.00 MSGTYPE(&MSGTYPE) 0132.00 ENDDO 0133.00 ENDPGM
0001.00 H DFTNAME(CRTCMDHLP) DEBUG DATEDIT(*YMD/) 0002.00 F******** コマンド用ヘルプの作成 ************************************* 0003.00 FQCMDSRC IF F 92 DISK USROPN 0004.00 F INFDS(INFDS) 0005.00 FQPNLSRC O F 92 DISK 0006.00 F********************************************************************** 0007.00 0008.00 * CRTBNDRPG ASNET.COM/CRTCMDHLP SRCFILE(R610SRC/QRPGLESRC) 0009.00 * DFTACTGRP(*NO) ACTGRP(*NEW) AUT(*ALL) 0010.00 0011.00 D AR S 1 DIM(256) 0012.00 D PNR S 80 DIM(18) CTDATA PERRCD(1) 0013.00 D PN S 4S 0 0014.00 D TITLE S 50A 0015.00 D PROMPT S 50A 0016.00 D KWD S 12A 0017.00 D N S 4S 0 0018.00 D M S 4S 0 0019.00 D LEN S 4S 0 0020.00 D L S 4S 0 0021.00 D HEAD S 80A 0022.00 D TRAIL S 80A 0023.00 D FRMSTR S 50A 0024.00 D TOSTR S 50A 0025.00 D CMPMSG C CONST(' を作成しました。 ') 0026.00 0027.00 D*( ファイル情報データ構造 ) 0028.00 D INFDS DS 0029.00 D FILREC 156 159B 0 0030.00 D CCSID# 218 219I 0 0031.00 D BRRN 397 400B 0 0032.00 0033.00 D*( WORK 日付 YYMMDD ゴーn 構造 ) 0034.00 D DATEDS DS 0035.00 D CENTURY 1 2 0 0036.00 D YYMMDD 3 8 0 0037.00 D YY 3 4 0038.00 D MM 5 6 0039.00 D DD 7 8 0040.00 D CYY 1 4 0041.00 D CYMD 1 8 0 0042.00 0043.00 D*( WORK 日付 TIME ゴーn 構造 ) 0044.00 D TIMEDS DS 0045.00 D HOUR 1 2 0046.00 D MINUTE 3 4 0047.00 D SECOND 5 6 0048.00 D TIME6 1 6 0 0049.00 0050.00 IQCMDSRC AA 01 0051.00 I 1 92 SRCDTA 0052.00 I 1 6 SRCNOA 0053.00 I 19 19 AST 0054.00 I 20 20 NOT# 0055.00 I 13 92 CMPSRC 0056.00 C*----------------------------------------------------+ 0057.00 C *ENTRY PLIST 0058.00 C PARM CMD 10 0059.00 C PARM TOMBR 10 0060.00 C PARM ERRMSG 132 0061.00 C PARM SEV 2 0 0062.00 C*----------------------------------------------------+ 0063.00 C OPEN QCMDSRC 0064.00 C DO *HIVAL 0065.00 C SETOFF 50 0066.00 C READ QCMDSRC 50 0067.00 C 50 LEAVE 0068.00 C*( PROMPT ) 0069.00 C 'PROMPT(' SCAN SRCDTA:1 N 50 0070.00 C *IN50 IFEQ *ON 0071.00 C TITLE IFEQ *BLANKS 0072.00 C EXSR TITLE_ 0073.00 C ELSE 0074.00 C EXSR PROMPT_ 0075.00 C ENDIF 0076.00 C ENDIF 0077.00 C*( PARM ) 0078.00 C 'PARM ' SCAN SRCDTA:1 N 50 0079.00 C *IN50 IFEQ *ON 0080.00 C EXSR PARM_ 0081.00 C ENDIF 0082.00 C* 0083.00 C ENDDO 0084.00 C CLOSE QCMDSRC 0085.00 C EVAL ERRMSG = %TRIMR(TOMBR) + CMPMSG 0086.00 C SETON LR 0087.00 C RETURN 0088.00 C****************************************************** 0089.00 C *INZSR BEGSR 0090.00 C****************************************************** 0091.00 C* 初期 CYCLE のみの実行 0092.00 C Z-ADD 0 SEV 0093.00 C BITOFF '06' QUOT 1 0094.00 C BITON '123457' QUOT 1 0095.00 C Z-ADD 20 CENTURY 0096.00 C MOVE UDATE YYMMDD 0097.00 C Z-ADD 1 SRCNO 6 2 0098.00 C ENDSR 0099.00 C****************************************************** 0100.00 C TITLE_ BEGSR 0101.00 C****************************************************** 0102.00 C MOVEA(P) SRCDTA AR 0103.00 C ADD 8 N 0104.00 C MOVEA(P) AR(N) TITLE 0105.00 C MOVEA(P) TITLE AR 0106.00 C QUOT SCAN TITLE:1 N 50 0107.00 C *IN50 IFEQ *ON 0108.00 C MOVEA *BLANKS AR(N) 0109.00 C MOVEA(P) AR TITLE 0110.00 C ENDIF 0111.00 C*( PNLGRP を出力する ) 0112.00 C 1 DO 10 N 0113.00 C MOVE PNR(N) PNLSRC 92 0114.00 C EXSR CHECK 0115.00 C EXSR OUTPUT 0116.00 C ENDDO 0117.00 C ENDSR 0118.00 C****************************************************** 0119.00 C PROMPT_ BEGSR 0120.00 C****************************************************** 0121.00 C MOVEA(P) SRCDTA AR 0122.00 C ADD 8 N 0123.00 C MOVEA(P) AR(N) PROMPT 0124.00 C MOVEA(P) PROMPT AR 0125.00 C QUOT SCAN PROMPT:1 N 50 0126.00 C *IN50 IFEQ *ON 0127.00 C MOVEA *BLANKS AR(N) 0128.00 C MOVEA(P) AR PROMPT 0129.00 C ENDIF 0130.00 C*( PNLGRP を出力する ) 0131.00 C 11 DO 18 N 0132.00 C MOVE PNR(N) PNLSRC 92 0133.00 C EXSR CHECK 0134.00 C EXSR OUTPUT 0135.00 C ENDDO 0136.00 C ENDSR 0137.00 C****************************************************** 0138.00 C PARM_ BEGSR 0139.00 C****************************************************** 0140.00 C 'KWD(' SCAN SRCDTA:1 N 50 0141.00 C *IN50 IFEQ *ON 0142.00 C MOVEA SRCDTA AR 0143.00 C ADD 4 N 0144.00 C MOVEA AR(N) KWD 0145.00 C MOVEA(P) KWD AR 0146.00 C ')' SCAN KWD:1 N 50 0147.00 C *IN50 IFEQ *ON 0148.00 C MOVEA KWD AR 0149.00 C MOVEA *BLANKS AR(N) 0150.00 C MOVEA AR KWD 0151.00 C ENDIF 0152.00 C ENDIF 0153.00 C ENDSR 0154.00 C****************************************************** 0155.00 C CHECK BEGSR 0156.00 C****************************************************** 0157.00 C*( TITLE ) 0158.00 C '<TITLE>' SCAN PNLSRC:1 M 50 0159.00 C *IN50 IFEQ *ON 0160.00 C MOVEL(P) '<TITLE>' FRMSTR 0161.00 C MOVEL(P) TITLE TOSTR 0162.00 C EXSR CONVERT 0163.00 C ENDIF 0164.00 C*( CMD ) 0165.00 C '<CMD>' SCAN PNLSRC:1 M 50 0166.00 C *IN50 IFEQ *ON 0167.00 C MOVEL(P) '<CMD>' FRMSTR 0168.00 C MOVEL(P) CMD TOSTR 0169.00 C EXSR CONVERT 0170.00 C ENDIF 0171.00 C*( KWD ) 0172.00 C '<KWD>' SCAN PNLSRC:1 M 50 0173.00 C *IN50 IFEQ *ON 0174.00 C MOVEL(P) '<KWD>' FRMSTR 0175.00 C MOVEL(P) KWD TOSTR 0176.00 C EXSR CONVERT 0177.00 C ENDIF 0178.00 C*( PROMPT ) 0179.00 C '<PROMPT>' SCAN PNLSRC:1 M 50 0180.00 C *IN50 IFEQ *ON 0181.00 C MOVEL(P) '<PROMPT>' FRMSTR 0182.00 C MOVEL(P) PROMPT TOSTR 0183.00 C EXSR CONVERT 0184.00 C ENDIF 0185.00 C ENDSR 0186.00 C****************************************************** 0187.00 C CONVERT BEGSR 0188.00 C****************************************************** 0189.00 C M SUB 1 LEN 0190.00 C LEN SUBST(P) PNLSRC:1 HEAD 0191.00 C ' ' CHECKR FRMSTR L 0192.00 C EVAL M = LEN + L + 1 0193.00 C MOVEA(P) PNLSRC AR 0194.00 C MOVEA(P) AR(M) TRAIL 0195.00 /FREE 0196.00 PNLSRC = %TRIMR(HEAD) + %TRIMR(TOSTR) + TRAIL; 0197.00 /END-FREE 0198.00 C ENDSR 0199.00 C****************************************************** 0200.00 C OUTPUT BEGSR 0201.00 C****************************************************** 0202.00 C*-------------------------------------------------------- 0203.00 C EXCEPT @OUTPUT 0204.00 C*-------------------------------------------------------- 0205.00 C ADD 1 SRCNO 0206.00 C ENDSR 0207.00 OQPNLSRC E @OUTPUT 0208.00 O PNLSRC 92 0209.00 O SRCNO 6 ** PNR -- 以下は配列 -- :PNLGRP HLPSHELF=LIST. .* ------------------------- .* ヘルプの定義 .* ------------------------- :HELP NAME=<CMD>.<TITLE> :P. :PC. :PC.< ここに全体の説明を入れる > :PC. :EHELP. :HELP NAME='<CMD>/<KWD>'.<PROMPT> :XH3.<PROMPT> :P. :PC. :PC.< ここにこの項目の説明を入れる > :PC. :EHELP. :EPNLGRP.
いくつか改良もしているので最新のソースは 上記のURLで弊社サイトに接続して
確認してほしい。
繰り返しになるがコマンドのヘルプを作成するのにこのように便利な機能はない。
ぜひ導入して実感してほしい。