「活動ジョブの検査」の拡張 (ILE RPG)

活動ジョブの検査」や、それを書き直した「System API の使用例 - CL から RPG への書き直し -」などでは、WRKACTJOB コマンドで見ることのできる "MSGW" とか "EOJ" とかそういった状態(を表す文字)をとってくることができませんでした。

かといって、WRKACTJOB コマンドには *OUTFILE オプションなどはありませんので、その状態をとってくる簡単な方法があるわけではありません。

調べてみると、「System API の使用例 - CL から RPG への書き直し -」などで使用していた JOBL0100 というフォーマットではなく JOBL0200 というそれが拡張されたフォーマットで API の呼び出し結果を受け取れば、その情報が取れることがわかりました。

そこで、今回は「System API の使用例 - CL から RPG への書き直し -」をさらに書き直してみることにしました。


List Job (QUSLJOB) API

オプションの引数を含むプロトタイプ定義

使用する「List Job (QUSLJOB) API」の呼び出し方は↓のようになっています。

  Required Parameter Group:

1 Qualified user space name Input Char(20)
2 Format name Input Char(8)
3 Qualified job name Input Char(26)
4 Status Input Char(10)

  Optional Parameter Group 1:

5 Error Code I/O Char(*)

  Optional Parameter Group 2:

6 Job type Input Char(1)
7 Number of fields to return Input Binary(4)
8 Key of fields to return Input Array(*) of Binary(4)

  Optional Parameter Group 3:

9 Continuation handle Input Char(48)

  Default Public Authority: *USE

  Threadsafe: Conditional; see Usage Notes.

API 呼び出しのためのプロトタイプ定義は↓のようなかんじになりますね。

     D RtvJobInf       PR                  EXTPGM('QUSLJOB')                                        
     D  pJobName                     10a   CONST                                                    
     D  pUserName                    10a   CONST                                                    
     D  pJobNumber                    6a   CONST                                                    
     D  pStatus                      10a   CONST                                                    
      * optional group 1:                                                                           
     D   ErrorCode                 8000A   options(*varsize: *nopass)                               
      * optional group 2:                                                                           
     D   JobType                      1A   const options(*nopass)                                   
     D   NbrKeyFld                   10I 0 const options(*nopass)                                   
     D   KeyFlds                     10I 0 const dim(1000)                                          
     D                                     options(*varsize: *nopass)                               
      * optional group 3:                                                                           
     D   ContHandle                  48A   const options(*nopass)                                   

KEY

今回新しく使用することになった JOBL0200 という、追加の情報が取得できるフォーマットでデータを返してもらうには、"Optional Parameter Group 2" にある "Key of fields to be returned"に、取得したい情報の"Key"を指定して QUSLJOB API を呼び出す必要があります。

Key of fields to be returned
INPUT; ARRAY(*) of BINARY(4)

The list of the fields to be returned in the JOBL0200 format. For a list of the valid fields, see Valid Keys. This parameter is used for the JOBL0200 format only. If JOBL0100 is specified for the format name, the value must be zero.

どういう "Key" を指定すれば、どういう情報が取得できるかは↑のリンクにありますが、今回使用するのは↓になります。
今回取りたいと思っていた"状態"(DSPW とか MSGW とか)は↓でいう Key '0101' になりますね。

Key Type Description
0101 CHAR(4) Active job status
1802 CHAR(1) Run priority (job)
1906 CHAR(4) Subsystem description name - qualified

プログラム

↓が全文です。特別難しいことはないと思います。

取得情報が増えたので出力用のファイルのレイアウトも変わってしまいます。
そのために DDS を直して、書き出し用の RPG も直して、というのがなんとなく面倒だったので、SQL を使う方法に変えてしまいました。

      *                                                                                             
      *   CREATE TABLE APITEST/CHKACTJOB2                                                           
      *   (JOBNAME   CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    USERNAME  CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    JOBNUMBER CHAR ( 6)   NOT NULL WITH DEFAULT,                                             
      *    JOBSTATUS CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    ACTSTATUS CHAR ( 4)   NOT NULL WITH DEFAULT,                                             
      *    RUNPTY    DEC  ( 2,0) ,                                             
      *    SBSD      CHAR ( 20)  NOT NULL WITH DEFAULT,                                             
      *    INSERT_TIME TIMESTAMP )                                                                  
      *                                                                                             
      *   CRTSQLRPGI OBJ(APITEST/CHKACTJOB2) SRCFILE(APITEST/QRPGLESRC)                             
      *   COMMIT(*NONE) OBJTYPE(*MODULE) DBGVIEW(*SOURCE)                                           
      *                                                                                             
      *   CRTPGM PGM(APITEST/CHKACTJOB2) MODULE(APITEST/CHKACTJOB2 APITEST/CRTUSRSPCP)              
      *                                                                                             
     D ChkActJob2      PR                                                                           
     D  QualJobName                  26a                                                            
     D  Status                       10a                                                            
      *                                                                                             
     D ChkActJob2      PI                                                                           
     D  pQualJobName                 26a                                                            
     D  pStatus                      10a                                                            
      *                                                                                             
     D QualJobName     DS            26    Qualified                                                
     D  JobName                      10a                                                            
     D  UserName                     10a                                                            
     D  JobNumber                     6a                                                            
      *                                                                                             
     D CrtUsrspcP      PR              *                                                            
     D  Name                         20a                                                            
      *                                                                                             
     D RtvJobInf       PR                  EXTPGM('QUSLJOB')                                        
     D  pJobName                     10a   CONST                                                    
     D  pUserName                    10a   CONST                                                    
     D  pJobNumber                    6a   CONST                                                    
     D  pStatus                      10a   CONST                                                    
      * optional group 1:                                                                           
     D   ErrorCode                 8000A   options(*varsize: *nopass)                               
      * optional group 2:                                                                           
     D   JobType                      1A   const options(*nopass)                                   
     D   NbrKeyFld                   10I 0 const options(*nopass)                                   
     D   KeyFlds                     10I 0 const dim(1000)                                          
     D                                     options(*varsize: *nopass)                               
      * optional group 3:                                                                           
     D   ContHandle                  48A   const options(*nopass)                                   
      *                                                                                             
     D GenericHeader   DS                  Qualified Based(usPtr)                                   
     D  userarea                     64a                                                            
     D  size                         10i 0                                                          
     D  releaselevel                  4                                                             
     D  formatname                    8                                                             
     D  APIused                      10                                                             
     D  DateCreated                  13                                                             
     D  InforSts                      1                                                             
     D  sizeUsed                     10i 0                                                          
     D  offsetInput                  10i 0                                                          
     D  sizeInput                    10i 0                                                          
     D  offsetHeader                 10i 0                                                          
     D  sizeHeader                   10i 0                                                          
     D  offsetList                   10i 0                                                          
     D  sizeList                     10i 0                                                          
     D  numberList                   10i 0                                                          
     D  sizeEntry                    10i 0                                                          
     D  CCSID                        10i 0                                                          
     D  cntryID                       2                                                             
     D  langID                        3                                                             
     D  subsetInd                     1                                                             
     D  rsvd                         42                                                             
      *                                                                                             
     D jlStr           S               *                                                            
     D jlPtr           S               *                                                            
     D JOBL0200        ds                  Qualified Based(jlPtr)                                   
     D  JobName                      10a                                                            
     D  UsrName                      10a                                                            
     D  JobNbr                        6a                                                            
     D  InternalJobID                16a                                                            
     D  JobSts                       10a                                                            
     D  JobType                       1a                                                            
     D  JobSubtype                    1a                                                            
     D  rsvd2                         2a                                                            
     D  JobInfoSts                    1a                                                            
     D  rsvd3                         3a                                                            
     D  NbrKeyRtn                    10I 0                                                          
     D  KeyStart                      1a                                                            
      *                                                                                             
     D KEY_ACTSTATUS   C                   0101                                                     
     D KEY_RUNPTY      C                   1802                                                     
     D KEY_SBSD        C                   1906                                                     
      *                                                                                             
     D kfPtr           s               *                                                            
     D KeyFld          ds                  Qualified based(kfPtr)                                   
     D   FldLen                      10I 0                                                          
     D   Key                         10I 0                                                          
     D   DataType                     1A                                                            
     D   rsvd4                        3A                                                            
     D   DataLen                     10I 0                                                          
     D   KeyData                     20A                                                            
     D   KeyDataInt                  10I 0 overlay(KeyData)                                         
      *                                                                                             
     D ActSts          s              4A                                                            
     D RunPty          s             10I 0                                                          
     D SbsD            s             20A                                                            
      *                                                                                             
     D pName           S             20a                                                            
     D usPtr           S               *                                                            
      *                                                                                             
     D APIErr          DS                  Qualified                                                
     D  ErrSize                      10i 0 inz(%size(APIErr))                                       
     D  ErrLen                       10i 0 inz(0)                                                   
     D  ErrID                         7a                                                            
     D  rsvd                          1a                                                            
     D  ErrData                   32767a                                                            
      *                                                                                             
     D i               S             10u 0                                                          
     D j               S             10u 0                                                          
      *                                                                                             
     D ReqKeys         s             10I 0 dim(3)                                                   
      *                                                                                             
     D RcvSize         S             10  0 INZ(16776704)                                            
      *                                                                                             
     D HandleErr       PR                                                                           
      *                                                                                             
      /Free                                                                                         
                                                                                                    
             QualJobName = pQualJobName ;                                                           
                                                                                                    
               if QualJobName.JobName = *blanks ;                                                   
                  QualJobName.JobName = '*ALL'  ;                                                   
               endif ;                                                                              
                                                                                                    
               if QualJobName.UserName = *blanks ;                                                  
                  QualJobName.UserName = '*ALL'  ;                                                  
               endif ;                                                                              
                                                                                                    
               if QualJobName.JobNumber = *blanks ;                                                 
                  QualJobName.JobNumber = '*ALL'  ;                                                 
               endif ;                                                                              
                                                                                                    
               if pStatus = *blanks ;                                                               
                  pStatus = '*ALL'  ;                                                               
               endif ;                                                                              
                                                                                                    
             pName =    'CHKACTJOB QTEMP     ' ;                                                    
             usPtr = CrtUsrspcP  (pName ) ;                                                         
                                                                                                    
             ReqKeys(1) = KEY_ACTSTATUS ;                                                           
             ReqKeys(2) = KEY_RUNPTY ;                                                              
             ReqKeys(3) = KEY_SBSD ;                                                                
                                                                                                    
             RtvJobInf ( pName                                                                      
                        :'JOBL0200'                                                                 
                        :QualJobName                                                                
                        :pStatus                                                                    
                        :APIErr                                                                     
                        :'*'                                                                        
                        :%elem(ReqKeys)                                                             
                        :ReqKeys ) ;                                                                
                                                                                                    
             If APIErr.ErrLEN <> 0 ;                                                                
                HandleErr() ;                                                                       
                return ;                                                                            
             endif ;                                                                                
                                                                                                    
             If GenericHeader.numberList = 0 ;                                                      
                return ;                                                                            
             endif ;                                                                                
                                                                                                    
             exec sql                                                                               
             DELETE FROM APITEST/CHKACTJOB2 ;                                                       
                                                                                                    
             jlStr = usPtr + GenericHeader.offsetList ;                                             
                                                                                                    
             for i = 0 to (GenericHeader.numberList - 1) ;                                          
                jlPtr =  jlStr                                                                      
                         + (GenericHeader.sizeEntry * i) ;                                          
                kfPtr = %addr(JOBL0200.KeyStart) ;                                                  
                                                                                                    
                for j = 0 to (JOBL0200.NbrKeyRtn - 1) ;                                             
                   kfPtr = %addr(JOBL0200.KeyStart)                                                 
                           + (KeyFld.FldLen * j) ;                                                  
                   select ;                                                                         
                      when KeyFld.Key = KEY_ACTSTATUS ;                                             
                         ActSts = %subst(KeyFld.KeyData:1:4) ;                                   
                      when KeyFld.Key = KEY_RUNPTY ;                                                
                         RunPty = KeyFld.KeyDataInt ;                                               
                      when KeyFld.Key = KEY_SBSD ;                                                  
                         Sbsd = KeyFld.KeyData ;                                                    
                   endsl ;                                                                          
                                                                                                    
                endfor ;                                                                            
                                                                                                    
                exec sql                                                                            
                INSERT INTO APITEST/CHKACTJOB2                                                      
                   VALUES(                                                                          
                         :JOBL0200.JobName ,                                                        
                         :JOBL0200.UsrName ,                                                        
                         :JOBL0200.JobNbr  ,                                                        
                         :JOBL0200.JobSts  ,                                                        
                         :ActSts           ,                                                        
                         :RunPty           ,                                                        
                         :SbsD             ,                                                        
                         CURRENT_TIMESTAMP                                                          
                         ) ;                                                                        
                                                                                                    
             endfor ;                                                                               
                                                                                                    
             *inLR = *on ;                                                                          
             return ;                                                                               
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
      *                                                                                             
     P HandleErr       B                                                                            
     D HandleErr       PI                                                                           
      *                                                                                             
      /Free                                                                                         
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
     P HandleErr       E

実行結果

実行結果は↓のようなかんじになります。

SBSD が入っていないのは、システムジョブが大半なので "入っていない"ということが予定どおり、なわけです。

[Top Pageに戻る]

Ads by TOK2