V5R4 CL で API とポインタを使う - CHKACTJOB の書き直し [異版] -

V5R4 CL で API とポインタを使う (CHKACTJOB の書き直し)」をさらに「System API プログラミングの基礎 (3) - ユーザースペース使用用の汎用プロシージャの作成 -」で紹介したユーティリティを使って書き直してみました。

こちらがプログラムの全文です。

             PGM        PARM(&PARM1 &STS)              
                         
     /* 引数の定義*/                                                                 
             DCL        VAR(&PARM1) TYPE(*CHAR) LEN(26)                         
             DCL        VAR(&JOBPARM) TYPE(*CHAR) LEN(26)                       
             DCL        VAR(&JOB) TYPE(*CHAR) STG(*DEFINED) LEN(10) +           
                          DEFVAR(&PARM1 1)                                      
             DCL        VAR(&USR) TYPE(*CHAR) STG(*DEFINED) LEN(10) +           
                          DEFVAR(&PARM1 11)                                     
             DCL        VAR(&NBR) TYPE(*CHAR) STG(*DEFINED) LEN(6) +            
                          DEFVAR(&PARM1 21)                                     
             DCL        VAR(&STS) TYPE(*CHAR) LEN(10)                           
     /* ユーザースペース*/                                                              
             DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +                      
                          VALUE('CHKACTJOB QTEMP     ')                         
             DCL        VAR(&USOBJ) TYPE(*CHAR) STG(*DEFINED) +                 
                          LEN(10) DEFVAR(&USRSPC 1)                             
             DCL        VAR(&USLIB) TYPE(*CHAR) STG(*DEFINED) +                 
                          LEN(10) DEFVAR(&USRSPC 11)                            
     /* ヘッダ項目 */                                                                
             DCL        VAR(&DMY) TYPE(*CHAR) LEN(1)                            
             DCL        VAR(&HDRP) TYPE(*PTR) ADDRESS(&DMY)                     
             DCL        VAR(&HDR) TYPE(*CHAR) STG(*BASED) LEN(192) +            
                          BASPTR(&HDRP)                                         
             DCL        VAR(&ENTRY) TYPE(*UINT) STG(*DEFINED) LEN(4) +          
                          DEFVAR(&HDR 133)                                      
             DCL        VAR(&OFFSET) TYPE(*UINT) STG(*DEFINED) +                
                          LEN(4) DEFVAR(&HDR 125)                               
             DCL        VAR(&ENTLEN) TYPE(*UINT) STG(*DEFINED) +                
                          LEN(4) DEFVAR(&HDR 137)                               
     /* リスト項目 */                                                                
             DCL        VAR(&LSTJOBEP) TYPE(*PTR) ADDRESS(&DMY)                 
             DCL        VAR(&LSTJOBE) TYPE(*CHAR) STG(*BASED) +                 
                          LEN(52) BASPTR(&LSTJOBEP)                             
             DCL        VAR(&JOBNAME) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&LSTJOBE 1)                            
             DCL        VAR(&USRNAME) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&LSTJOBE 11)                           
             DCL        VAR(&JOBNBR) TYPE(*CHAR) STG(*DEFINED) +                
                          LEN(6) DEFVAR(&LSTJOBE 21)                            
             DCL        VAR(&JOBSTS) TYPE(*CHAR) STG(*DEFINED) +                
                          LEN(10) DEFVAR(&LSTJOBE 43)                           
     /* カウンタ */                                                                 
             DCL        VAR(&I) TYPE(*INT) LEN(2)                               
     /* 引数のチェック*/                                                               
             IF         COND(&JOB = '          ') THEN(CHGVAR +                 
                          VAR(&JOB) VALUE('*ALL     '))                         
             IF         COND(&USR = '          ') THEN(CHGVAR +                 
                          VAR(&USR) VALUE('*ALL     '))                         
             IF         COND(&NBR = '      ') THEN(CHGVAR VAR(&NBR) +           
                          VALUE('*ALL  '))                                      
             IF         COND(&STS = '          ') THEN(CHGVAR +                 
                          VAR(&STS) VALUE('*ALL     '))                         
     /* 初期化*/                                                                   
             CALLPRC    PRC(CRTUSRSPCP) PARM((&USRSPC *BYREF)) +                 
                          RTNVAL(&HDRP)                                                                        
             CLRPFM     FILE(QCHKACTJ)                                          
     /* ジョブ情報の取得*/                                                              
             CHGVAR     VAR(%SST(&JOBPARM 1 10)) VALUE(&JOB)                    
             CHGVAR     VAR(%SST(&JOBPARM 11 10)) VALUE(&USR)                   
             CHGVAR     VAR(%SST(&JOBPARM 21 6)) VALUE(&NBR)                    
             CALL       PGM(QUSLJOB) PARM(&USRSPC 'JOBL0100' +                  
                          &JOBPARM &STS)                                        
     /* ジョブ情報項目の取得*/                                                            
             IF         COND(&ENTRY = 0) THEN(GOTO CMDLBL(NOJOB))               
             CHGVAR     VAR(&LSTJOBEP) VALUE(&HDRP)                             
             CHGVAR     VAR(%OFFSET(&LSTJOBEP)) +                               
                          VALUE(%OFFSET(&LSTJOBEP) + &OFFSET)                   
     /* ループ*/                                                                   
             DOFOR      VAR(&I) FROM(1) TO(&ENTRY) BY(1)                        
             CALLPRC    PRC(WRITEFILE) PARM(&JOBNAME &USRNAME +                 
                          &JOBNBR &JOBSTS)                                      
             CHGVAR     VAR(%OFFSET(&LSTJOBEP)) +                               
                          VALUE(%OFFSET(&LSTJOBEP) + &ENTLEN)                   
             ENDDO 
 NOJOB:      ENDPGM

前提として、以前紹介したユーザースペース作成用のユーティリティプログラム (CRTUSRSPCP) が APITEST というライブラリーに存在しているものとします。(ライブラリーは別にどこでもかまいません。CRTPGM コマンド実行時の MODULE パラメータで指定します)

処理の簡略化

これを使うと、

             CHKOBJ     OBJ(&USLIB/&USOBJ) OBJTYPE(*USRSPC)                     
             MONMSG     MSGID(CPF9801) EXEC(+                                   
             CALL       PGM(QUSCRTUS) PARM(&USRSPC 'CHKACTJOB ' +               
                          X'00000100' ' ' '*ALL      ' 'CHKACTJOB +             
                          TEMPORARY USER SPACE'))                                         
             CALL       PGM(QUSPTRUS) PARM(&USRSPC &HDRP)   

と「V5R4 CL で API とポインタを使う - CHKACTJOB の書き直し -」では記述していた処理が

             CALLPRC    PRC(CRTUSRSPCP) PARM((&USRSPC *BYREF)) +                 
                          RTNVAL(&HDRP)                                                                        

の一行ですんでしまうわけですね。

作成

CRTCLMOD コマンドでモジュールを作成し、WRITEFILE とこの CRTUSRSPCP の在り処を指定して CRTPGM コマンドを実行することによって実行可能モジュールを作成します。

活動ジョブの検査」でのモジュールと組み合わせて使う場合には、コマンドの実行プログラムも変更します。

[Top Pageに戻る]

Ads by TOK2