Tools

20. これは便利なS/36コマンド

今では S/36 の使用経験のある人も少なくなっていると思うがS/36 では、Systemi5 の WRKACTJOBWRKOUTQ など、日常で頻繁に使用するコマンドで非常に便利なコマンドが用意されていた。
S/36 から S/38, AS400, iSeries そして Systemi5 に変わった現在でも筆者は S/36 コマンドを作成して、毎日、使用している。
これはコマンド名が一文字だけの「D」というコマンドであって、パラメータによって動作が変わる。

D U + [実行]WRKACTJOB を実行
D P + [実行]WRKOUTQ QPRINT を実行
D xxxxx + [実行]WRKOUTQ xxxxxx を実行
D S + [実行]WRKSYSSTS を実行
D J + [実行]WRKJOBQ QBATCH を実行
D L + [実行]WRKCFGSTS *LIN を実行
D C + [実行]WRKCFGSTS *CTL を実行

という具合である。恐らくこのような簡略化するためのコマンドを各々の会社で独自に開発して
用意しているところもあると思うが、打鍵の少なさではD コマンド は、至極便利な部類に入る
のではないだろうか ?
このようなユーティリティー・コマンドはライブラリー QGPL に入れておけばどのような環境からも
利用することができる。

【 CMD: D 】
             CMD        PROMPT('S/36 表示コマンド ')                 
             PARM       KWD(CMD) TYPE(*CHAR) LEN(20) SPCVAL((P +     
                          'WRKOUTQ QPRINT') (U WRKACTJOB) (S +       
                          WRKSYSSTS) (J 'WRKOUTQ QBATCH') (Q +       
                          'DSPMSG QSYSOPR') (D 'WRKOUTQ QEZDEBUG') + 
                          (L 'WRKCFGSTS *LIN') (C 'WRKCFGSTS +       
                          *CTL')) PROMPT(' 操作 ')
【 コンパイル 】
CRTCMD QGPL/D PGM(MYLIB.DCL) SRCFILE(MYSRCLIB/QCMDSRC)   AUT(*ALL)
【 CLP : DCL 】
             PGM        PARM(&CMD)                                    
/*---------------------------------------------------------*/         
/*   D           :   S/36 表示コマンド                     */         
/*---------------------------------------------------------*/         
             DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                 
             DCL        VAR(&CMD) TYPE(*CHAR) LEN(20)                 
             DCL        VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) VALUE(20)   
             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))       
                                                                      
             IF         COND(&CMD *EQ ' ') THEN(CHGVAR VAR(&CMD) +    
                          VALUE('WRKOUTQ'))                           
             CALL       PGM(QCMDEXC) PARM(&CMD &CMDLEN)               
                                                                      
 ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                            
 SNDMSG:     SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                      
             ENDPGM
【 コンパイル 】
CRTCLPGM MYLIB/DCL SRCFILE(MYSRCILB/QCLSRC) AUT(*ALL)
【 解説 】

実行CLP が、非常に簡単なものであることに気づかれたことと思う。
この例はコマンドの使い方として、興味深いテクニックを用いている。
文字 D に続くパラメータの P, U, ... を CLP で処理するのではなく、コマンド側で CLP に渡す
前に変型しているのである。
コマンドの SPCVAL パラーメータにおいて

PWRKOUTQ PRINT
UWRKACTJOB
SWRKSYSSTS
JWRKOUTQ QBATCH
QDSPMSG QSYSOPR
DWRKOUTQ QEZDEBUG
LWRKCFGSTS *LIN
CWRKCFGSTS *CTL

のように変型してから CLP に渡しているので、CLP ではパラメータをQCMDEXC によって
実行しているだけのシンブルなものとなる。
さて、ここで読者に宿題であるが、この D コマンド

D M + [実行]

とすれば DSPMSG を実行するように、このコマンドを改良して頂きたい。

実に簡単に機能を追加することができることが、おわかりであると思う。
このように拡張性に富んだ作成がどのような場合でも大切である。