JOBの一覧表を調べるAPIとして
・QUSLJOB
・QGYOLJOB
の二つがある。
QUSLJOBが多く使われるがユーザー・スペースにJOBのリストを
出力しておいてそれを QUSRTVUS API で読取るという手間もかかるし
パフォーマンスも良くない。
一方 API: QGYOLJOB はメモリに結果を戻してメモリを検索するので
パフォーマンスに優れている。
単にジョブのリストを出力したいだけならよいのだが
WRKACTJOB のようにサブ・テステム毎のジョブの一覧を出力する
ための QGYOLJOB のサンプルはどこにもない。
単に QGYOLJOB を出力するだけのサンプルが多くしかもほとんどが
RPGで書かれている。
海外の API のサンプルはほとんどがRPGが多い。
RPGだと書き手の個性が出てしまうのでわかりにくい。
CLPのほうがCOBOLのユーザーや RPGのユーザーでもCLPのほうが
わかりやすい。
ここでは WRKACTJOB と同じように サブ・システムごとに
ジョブの一覧が出力されるサンプルをCLPで作ってみたので
紹介する。
WRKACTJOBは
活動ジョブ処理 (WRKACTJOB) 選択項目を入力して,実行キーを押してください。 出力 . . . . . . . . . . . . . * *, *PRINT 追加のパラメーター 状況統計リセット . . . . . . . *NO *NO, *YES サブシステム . . . . . . . . . *ALL 名前 , *ALL 値の続きは+ CPU パーセント限界 . . . . . . *NONE .1-99.9, *NONE 応答時間限界 . . . . . . . . . *NONE .1-999.9 秒, *NONE 順序 . . . . . . . . . . . . . *SBS *SBS, *AUXIO, *CPU... ジョブ名 . . . . . . . . . . . *ALL 名前,総称* , *ALL, *SYS... 自動再表示間隔 . . . . . . . . *PRV 5-999 秒, *PRV
でありご覧のように順序が *SBS としてサブ・システム単位での
表示となっている。
ところが単に API: QGYOLJOBを実行したのではジョブ名の順になってしまう。
ここではWRKACTJOBと同じようにサブ・システム単位で表示するための
API : QGYOLJOB の使い方のサンプルを紹介する。
もちろんこれも世界で初めての紹介である。
[ TESTGYOJOB : RKACTJOBの順で表示するQGYOLJOBのサンプル ]
ソースはこちらから
0001.00 PGM 0002.00 /*---------------------------------------------------------------------------*/ 0003.00 /* TESTGYOJOB : QGYOLJOB のテスト */ 0004.00 /* */ 0005.00 /* 2022/02/18 作成 */ 0006.00 /* HTTPS://WWW.IBM.COM/DOCS/EN/I/7.4?TOPIC=SSW_IBM_I_74/APIS/QGYOLJOB.HTM */ 0007.00 /*---------------------------------------------------------------------------*/ 0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0009.00 DCL VAR(&STMMSG) TYPE(*CHAR) LEN(132) 0010.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0011.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0012.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0013.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) 0014.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0015.00 DCL VAR(&ERRDTA) TYPE(*CHAR) LEN(132) 0016.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0017.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0018.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0019.00 VALUE('*ESCAPE ') 0020.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0021.00 VALUE(X'000074') /* 2 進数 */ 0022.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1) 0023.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0024.00 VALUE(X'00000000') 0025.00 /*( QGYOJOBL に必要な変数 )*/ 0026.00 DCL VAR(&JOBL0300) TYPE(*CHAR) LEN(512) 0027.00 DCL VAR(&JBLLEN) TYPE(*CHAR) LEN(4) + 0028.00 VALUE(X'00000200') 0029.00 DCL VAR(&JOBID) TYPE(*CHAR) LEN(16) 0030.00 DCL VAR(&JOBVAR) TYPE(*CHAR) LEN(1024) 0031.00 DCL VAR(&JOBLEN) TYPE(*CHAR) LEN(4) + 0032.00 VALUE(X'00000400') 0033.00 DCL VAR(&NBRRCD) TYPE(*CHAR) LEN(4) + 0034.00 VALUE(X'FFFFFFFF') 0035.00 DCL VAR(&LISTINFO) TYPE(*CHAR) LEN(80) 0036.00 DCL VAR(&LISTSU) TYPE(*CHAR) LEN(4) + 0037.00 VALUE(X'0000000A') 0038.00 DCL VAR(&SORTINF) TYPE(*CHAR) LEN(16) 0039.00 DCL VAR(&SORT) TYPE(*CHAR) LEN(4) + 0040.00 VALUE(X'00000001') 0041.00 DCL VAR(&SELECT) TYPE(*CHAR) LEN(128) 0042.00 DCL VAR(&SELSIZ) TYPE(*CHAR) LEN(4) + 0043.00 VALUE(X'0000003C') 0044.00 DCL VAR(&KEYSU) TYPE(*CHAR) LEN(4) + 0045.00 VALUE(X'00000002') 0046.00 DCL VAR(&KEYARY) TYPE(*CHAR) LEN(8) + 0047.00 VALUE(X'0000006700000772') /* ACTIVE JOBS */ 0048.00 DCL VAR(&BIN0) TYPE(*CHAR) LEN(4) + 0049.00 VALUE(X'00000000') 0050.00 DCL VAR(&BIN1) TYPE(*CHAR) LEN(4) + 0051.00 VALUE(X'00000001') 0052.00 DCL VAR(&BIN_1) TYPE(*CHAR) LEN(4) + 0053.00 VALUE(X'FFFFFFFE') 0054.00 DCL VAR(&BIN_2) TYPE(*CHAR) LEN(4) + 0055.00 VALUE(X'FFFFFFFE') 0056.00 /*( QGYGTLE に必要な変数 )*/ 0057.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10) 0058.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10) 0059.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) 0060.00 DCL VAR(&N) TYPE(*DEC) LEN(7 0) 0061.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* + 0062.00 受取データ */ 0063.00 DCL VAR(&NBRRCDS) TYPE(*CHAR) LEN(4) + 0064.00 VALUE(X'0000000A') /* + 0065.00 受入れレコード数 =1024 */ 0066.00 DCL VAR(&BIN4) TYPE(*CHAR) LEN(4) 0067.00 DCL VAR(&RTNSU) TYPE(*DEC) LEN(5 0) 0068.00 DCL VAR(&RTNSUC) TYPE(*CHAR) LEN(5) 0069.00 DCL VAR(&OBJD) TYPE(*CHAR) LEN(10) 0070.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0071.00 DCL VAR(&OBJTYP) TYPE(*CHAR) LEN(10) 0072.00 DCL VAR(>EHND) TYPE(*CHAR) LEN(4) 0073.00 DCL VAR(&VARLEN) TYPE(*CHAR) LEN(4) + 0074.00 VALUE(X'00000400') 0075.00 DCL VAR(&STRCNV) TYPE(*CHAR) LEN(4) 0076.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) 0077.00 DCL VAR(&STSBIN) TYPE(*CHAR) LEN(4) 0078.00 DCL VAR(&COUNT) TYPE(*DEC) LEN(5 0) 0079.00 DCL VAR(&COUNTC) TYPE(*CHAR) LEN(5) 0080.00 DCL VAR(&DEVD) TYPE(*CHAR) LEN(10) 0081.00 DCL VAR(&OBJATR) TYPE(*CHAR) LEN(10) 0082.00 MONMSG MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR)) 0083.00 0084.00 /*( 環境の取得 )*/ 0085.00 RTVJOBA TYPE(&TYPE) 0086.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0087.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0088.00 ENDDO /* バッチ */ 0089.00 ELSE CMD(DO) /* 対話式 */ 0090.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0091.00 ENDDO /* 対話式 */ 0092.00 0093.00 /******************************/ 0094.00 /* すべての JOB の一覧 */ 0095.00 /******************************/ 0096.00 CHGVAR VAR(%SST(&JOBVAR 1 4)) VALUE(&BIN0) 0097.00 CHGVAR VAR(%SST(&LISTINFO 1 4)) VALUE(&LISTSU) 0098.00 CHGVAR VAR(%SST(&SORTINF 1 4)) VALUE(&BIN_2) /* -2 */ 0099.00 CHGVAR VAR(%SST(&SELECT 1 10)) VALUE('*ALL') 0100.00 CHGVAR VAR(%SST(&SELECT 11 10)) VALUE('*ALL') 0101.00 CHGVAR VAR(%SST(&SELECT 21 6)) VALUE('*ALL') 0102.00 CHGVAR VAR(%SST(&SELECT 27 1)) VALUE('*') 0103.00 /* PRIMARY JOB STATUS */ 0104.00 CHGVAR VAR(%SST(&SELECT 29 4)) VALUE(X'0000003C') 0105.00 /* CHGVAR VAR(%SST(&SELECT 33 4)) VALUE(X'00000001') */ 0106.00 CHGVAR VAR(%SST(&SELECT 33 4)) VALUE(X'00000000') 0107.00 /* CHGVAR VAR(%SST(&SELECT 61 10)) VALUE('*ACTIVE') */ 0108.00 /* ACTIVE JOB STATUS */ 0109.00 CHGVAR VAR(%SST(&SELECT 37 4)) VALUE(X'00000047') 0110.00 CHGVAR VAR(%SST(&SELECT 41 4)) VALUE(X'00000000') 0111.00 /* JOBS ON JOB QUEUE STATUS */ 0112.00 CHGVAR VAR(%SST(&SELECT 45 4)) VALUE(X'00000047') 0113.00 CHGVAR VAR(%SST(&SELECT 49 4)) VALUE(X'00000000') 0114.00 /* JOBS QUEUE NAME */ 0115.00 CHGVAR VAR(%SST(&SELECT 53 4)) VALUE(X'00000047') 0116.00 CHGVAR VAR(%SST(&SELECT 57 4)) VALUE(X'00000000') 0117.00 CALL PGM(QGYOLJOB) PARM(&JOBL0300 &JBLLEN + 0118.00 'OLJB0300' &JOBVAR &JOBLEN &LISTINFO + 0119.00 &NBRRCD &SORTINF &SELECT &SELSIZ &KEYSU + 0120.00 &KEYARY &APIERR) 0121.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0122.00 SNDPGMMSG + 0123.00 MSG('API: QGYOJOBL の実行で次のエラーが発生 + 0124.00 しました。 ') MSGTYPE(*DIAG) 0125.00 GOTO APIERR 0126.00 ENDDO 0127.00 0128.00 /*( リスト検索の開始 )*/ 0129.00 CHGVAR VAR(&BIN4) VALUE(%SST(&LISTINFO 1 4)) 0130.00 CHGVAR VAR(&RTNSU) VALUE(%BIN(&BIN4)) 0131.00 IF COND(&RTNSU *EQ 0) THEN(DO) /* + 0132.00 戻り数がない */ 0133.00 SNDPGMMSG MSG(' 活動ジョブがありません。 ') + 0134.00 MSGTYPE(*DIAG) 0135.00 GOTO ENDLIST 0136.00 ENDDO /* 戻り数がない */ 0137.00 0138.00 CHGVAR VAR(&N) VALUE(1) 0139.00 CHGVAR VAR(%BIN(&STRCNV)) VALUE(1) 0140.00 CHGVAR VAR(%BIN(&NBRRCDS)) VALUE(1) 0141.00 CHGVAR VAR(>EHND) VALUE(%SST(&LISTINFO 9 4)) 0142.00 LOOP: CALL PGM(QGYGTLE) PARM(&RCVDTA &VARLEN >EHND + 0143.00 &LISTINFO &NBRRCDS &STRCNV &APIERR) 0144.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0145.00 SNDPGMMSG + 0146.00 MSG('API: QGYGTLE の実行で次のエラーが発生 + 0147.00 しました。 ') MSGTYPE(*DIAG) 0148.00 GOTO APIERR 0149.00 ENDDO 0150.00 /*( 処理の開始 )*/ 0151.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVDTA 1 10)) 0152.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVDTA 11 10)) 0153.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVDTA 21 6)) 0154.00 CHGVAR VAR(&JOBID) VALUE(%SST(&RCVDTA 27 16)) 0155.00 SNDPGMMSG MSG(&JOB *TCAT '/' *CAT &USER *TCAT '/' + 0156.00 *CAT &JOBNBR) MSGTYPE(*DIAG) 0157.00 /*( 処理の終了 )*/ 0158.00 BYPAS: IF COND(&N < &RTNSU) THEN(DO) 0159.00 CHGVAR VAR(&N) VALUE(&N + 1) 0160.00 CHGVAR VAR(%BIN(&STRCNV)) VALUE(%BIN(&STRCNV) + 1) 0161.00 GOTO LOOP 0162.00 ENDDO 0163.00 /*( リストのクローズ )*/ 0164.00 ENDLIST: CALL PGM(QGYCLST) PARM(>EHND &APIERR) 0165.00 RETURN 0166.00 0167.00 APIERR: 0168.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0169.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0170.00 CHGVAR VAR(&MSGF) VALUE('Q' *CAT %SST(&MSGID 1 + 0171.00 3) *CAT 'MSG') 0172.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0173.00 GOTO SNDMSG 0174.00 0175.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) KEYVAR(&MSGKEY) + 0176.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0177.00 MSGFLIB(&MSGFLIB) 0178.00 IF COND(&MSGID *EQ 'CPF9999') THEN(DO) 0179.00 CHGVAR VAR(&ERRDTA) VALUE(&MSGDTA) 0180.00 RCVMSG MSGTYPE(*PRV) MSGKEY(&MSGKEY) RMV(*NO) + 0181.00 MSG(&MSG) MSGDTA(&MSGDTA) MSGID(&MSGID) + 0182.00 MSGF(&MSGF) MSGFLIB(&MSGFLIB) 0183.00 CHGVAR VAR(&STMMSG) VALUE(' プログラム ' *CAT + 0184.00 %SST(&ERRDTA 8 10) *TCAT + 0185.00 ' のステートメント ' *CAT %SST(&ERRDTA + 0186.00 24 4) *CAT ' で次のエラーが発生しました。 ') 0187.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) + 0188.00 TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG) 0189.00 ENDDO 0190.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0191.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0192.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0193.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0194.00 ENDDO 0195.00 ELSE CMD(DO) 0196.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0197.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0198.00 MSGTYPE(&MSGTYPE) 0199.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0200.00 ENDDO 0201.00 ENDPGM
[コンパイル]
[解説]API : QGYOLJOB には3つの書式(フォーマット)が指定可能であるが
サブ・システム単位で表示するためには
SORT情報のSORT数を -2 に設定しなければならない。
0054.00 DCL VAR(&BIN_2) TYPE(*CHAR) LEN(4) + 0055.00 VALUE(X'FFFFFFFE') : 0098.00 CHGVAR VAR(%SST(&SORTINF 1 4)) VALUE(&BIN_2) /* -2 */
しかし SORT数= -2 が有効であるのは 3つの書式(フォーマットのうちで
OLJB0300 だけである。
しかもこのときキー・フィールドに 1906(=サブ・システム&ジョブ名)を指定しなければならない。
0044.00 DCL VAR(&KEYSU) TYPE(*CHAR) LEN(4) + 0045.00 VALUE(X'00000002') 0046.00 DCL VAR(&KEYARY) TYPE(*CHAR) LEN(8) + 0047.00 VALUE(X'0000006700000772') /* ACTIVE JOBS */
… X’772′ = 1906
さらに OLJB0300 の場合は 選択指定はできない。
0103.00 /* PRIMARY JOB STATUS */ 0104.00 CHGVAR VAR(%SST(&SELECT 29 4)) VALUE(X'0000003C') 0105.00 /* CHGVAR VAR(%SST(&SELECT 33 4)) VALUE(X'00000001') */ 0106.00 CHGVAR VAR(%SST(&SELECT 33 4)) VALUE(X'00000000') 0107.00 /* CHGVAR VAR(%SST(&SELECT 61 10)) VALUE('*ACTIVE') */
これが WRKACTJOB SEQ(*SBS) を実現するためのテクニックである。