コマンドを作成しても、それに対するヘルプも併せて入れておけば
そのコマンドを利用する人にとってよりわかりやすくなる。
しかしコマンドの 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で弊社サイトに接続して
確認してほしい。
繰り返しになるがコマンドのヘルプを作成するのにこのように便利な機能はない。
ぜひ導入して実感してほしい。