CL

152. WRKACTJOBの順で表示するQGYOLJOBのサンプル

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(&GTEHND &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) を実現するためのテクニックである。