ジョブ・スケジュール項目の内容を System API を使ってファイルに落とす (V5R4)

ジョブ・スケジュール項目をファイルに落とすためのプログラムを API を使って作ってみました。

ジョブ・スケジュール名を指定、もしくはすべてのジョブ・スケジュールを対象にして、WRKJOBSCDE コマンドで表示できる情報を取得することができます。

あくまで概略を記述したものですので、こまかいことは↓のインフォメーション・センターに載っている情報を参照してください。

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/apis/qwclscde.htm

こちらがプログラム例になります。
System API プログラミングの基礎 (3) - ユーザースペース使用用の汎用プロシージャの作成 -」で作成した CRTUSRSPCP というプロシージャを使用しています。

      *                                                                                             
      *   CREATE TABLE APITEST/RTVJOBSCDE                                                           
      *   (JOBNAME   CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    ENTRYNO   CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    SCDDATE   CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    SCDDAY    CHAR ( 70)  NOT NULL WITH DEFAULT,                                             
      *    SCDTIME   CHAR ( 6)   NOT NULL WITH DEFAULT,                                             
      *    FRQ       CHAR ( 10)  NOT NULL WITH DEFAULT,                                             
      *    CMD    VARCHAR (512)  NOT NULL WITH DEFAULT,                                             
      *    INSERT_TIME TIMESTAMP )                                                                  
      *                                                                                             
      *   CRTSQLRPGI OBJ(APITEST/RTVJOBSCDE) SRCFILE(APITEST/QRPGLESRC)                             
      *   COMMIT(*NONE) OBJTYPE(*MODULE) DBGVIEW(*SOURCE)                                           
      *                                                                                             
      *   CRTPGM PGM(APITEST/RTVJOBSCDE) MODULE(APITEST/RTVJOBSCDE APITEST/CRTUSRSPCP)              
      *                                                                                             
     D RtvJobScd3      PR                                                                           
     D  JobScdEName                  10a                                                            
      *                                                                                             
     D RtvJobScd3      PI                                                                           
     D  JobScdEName                  10a                                                            
      *                                                                                             
     D CrtUsrspcP      PR              *                                                            
     D  Name                         20a                                                            
      *                                                                                             
     D LstJobScdE      PR                  EXTPGM('QWCLSCDE')                                       
     D  pUsrspcName                  20a   Const                                                    
     D  pFormatName                   8a   Const                                                    
     D  pEntryName                   10a   Const                                                    
     D  pContHandle                  16a   Const                                                    
     D  ErrorCode                          like(APIErr)                                             
      *                                                                                             
     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 SCDL0100        ds                  Qualified                                                
     D  InfStatus                     1a                                                            
     D  JobName                      10a                                                            
     D  EntNbr                       10a                                                            
     D  ScdDate                      10a                                                            
     D  ScdDay                       70a                                                            
     D  ScdTime                       6a                                                            
     D  Frequency                    10a                                                            
     D  RelDOM                       10a   Dim(5)                                                   
     D  RcyAcn                       10a                                                            
     D  NextSbm                      10a                                                            
     D  Status                       10a                                                            
     D  JobqName                     10a                                                            
     D  JobqLib                      10a                                                            
     D  UsrPrfAdder                  10a                                                            
     D  LastSbmDate                  10a                                                            
     D  LastSbmTime                   6a                                                            
     D  Text                         50a                                                            
     D  rsvd                         23a                                                            
      *                                                                                             
     D SCDL0200        ds                  Qualified Based(jlPtr)                                   
     D  BASE_ELEM                          LikeDS(SCDL0100)                                         
     D  JobqStatus                   10a                                                            
     D  DatesOmitted                 10a   Dim(20)                                                  
     D  JobdName                     10a                                                            
     D  JobdLib                      10a                                                            
     D  UsrPrfSbm                    10a                                                            
     D  MsgqName                     10a                                                            
     D  MsgqLib                      10a                                                            
     D  Save                         10a                                                            
     D  LastSbmJob                   10a                                                            
     D  LastSbmUsr                   10a                                                            
     D  LastSbmJobno                  6a                                                            
     D  LastAttDate                  10a                                                            
     D  LastAttTime                   6a                                                            
     D  LastAttStatus                10a                                                            
     D  rsvd2                         2a                                                            
     D  CmdLen                       10I 0                                                          
     D  Cmd                         512a                                                            
      *                                                                                             
     D pName           S             20a                                                            
     D usPtr           S               *                                                            
      *                                                                                             
     D pContHandle     S             16a                                                            
      *                                                                                             
     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 cmdstr          S            512a   varying                                                  
      *                                                                                             
     D RcvSize         S             10  0 INZ(16776704)                                            
      *                                                                                             
     D HandleErr       PR                                                                           
      *                                                                                             
      /Free                                                                                         
                                                                                                    
             if JobScdEName = *blanks ;                                                             
                JobScdEName = '*ALL'  ;                                                             
             endif ;                                                                                
                                                                                                    
             pName =    'RTVJOBSCDEQTEMP     ' ;                                                    
             usPtr = CrtUsrspcP  (pName ) ;                                                         
                                                                                                    
             LstJobScdE ( pName                                                                     
                         :'SCDL0200'                                                                
                         :JobScdEName                                                               
                         :pContHandle                                                               
                         :APIErr ) ;                                                                
                                                                                                    
             If APIErr.ErrLEN <> 0 ;                                                                
                HandleErr() ;                                                                       
                return ;                                                                            
             endif ;                                                                                
                                                                                                    
             If GenericHeader.numberList = 0 ;                                                      
                return ;                                                                            
             endif ;                                                                                
                                                                                                    
             exec sql                                                                               
             DELETE FROM APITEST/RTVJOBSCDE ;                                                       
                                                                                                    
             jlStr = usPtr + GenericHeader.offsetList ;                                             
                                                                                                    
             for i = 0 to (GenericHeader.numberList - 1) ;                                          
                jlPtr =  jlStr                                                                      
                         + (GenericHeader.sizeEntry * i) ;                                          
                                                                                                    
                cmdstr = %subst(SCDL0200.cmd : 1 : SCDL0200.cmdlen) ;                               
                                                                                                    
                exec sql                                                                            
                INSERT INTO APITEST/RTVJOBSCDE                                                      
                   VALUES(                                                                          
                         :BASE_ELEM.JobName   ,                                                     
                         :BASE_ELEM.EntNbr    ,                                                     
                         :BASE_ELEM.ScdDate   ,                                                     
                         :BASE_ELEM.ScdDay    ,                                                     
                         :BASE_ELEM.ScdTime   ,                                                     
                         :BASE_ELEM.Frequency ,                                                     
                         :CMDSTR             ,                                                      
                         CURRENT_TIMESTAMP                                                          
                         ) ;                                                                        
                                                                                                    
             endfor ;                                                                               
                                                                                                    
             *inLR = *on ;                                                                          
             return ;                                                                               
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
      *                                                                                             
     P HandleErr       B                                                                            
     D HandleErr       PI                                                                           
      *                                                                                             
      /Free                                                                                         
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
     P HandleErr       E                                                                            

データ・ストラクチャーのネスト機能の埋め込み SQL を使う時の制約事項

拡張情報(SCDL0200)に含まれる基本情報(SCDL0100)について、データ・ストラクチャーのネスト機能を使用しています。

     D SCDL0100        ds                  Qualified                                                
     D  InfStatus                     1a                                                            
     D  JobName                      10a                                                            
     D  EntNbr                       10a                                                            
     D  ScdDate                      10a                                                            
     D  ScdDay                       70a                                                            
     D  ScdTime                       6a                                                            
     D  Frequency                    10a                                                            
     D  RelDOM                       10a   Dim(5)                                                   
     D  RcyAcn                       10a                                                            
     D  NextSbm                      10a                                                            
     D  Status                       10a                                                            
     D  JobqName                     10a                                                            
     D  JobqLib                      10a                                                            
     D  UsrPrfAdder                  10a                                                            
     D  LastSbmDate                  10a                                                            
     D  LastSbmTime                   6a                                                            
     D  Text                         50a                                                            
     D  rsvd                         23a                                                            
      *                                                                                             
     D SCDL0200        ds                  Qualified Based(jlPtr)                                   
     D  BASE_ELEM                          LikeDS(SCDL0100)                                         
     D  JobqStatus                   10a                                                            

ネストした(入れ子になった)データ・ストラクチャーは、ILE RPG の中では "SCDL0200.BASE_ELEM.JobName" というように使用できます。

ただし、埋め込みSQL を使う場合、これが考慮点になります。
埋め込みホスト変数には "."(ピリオド)は一回しか使えない仕様になっています。

どうすればいいでしょう?

たとえば、こんなふうに指定するようにします。

                exec sql                                                                            
                INSERT INTO APITEST/RTVJOBSCDE                                                      
                   VALUES(                                                                          
                         :BASE_ELEM.JobName   ,                                                     
                         :BASE_ELEM.EntNbr    ,                                                     
                         :BASE_ELEM.ScdDate   ,                                                     
                         :BASE_ELEM.ScdDay    ,                                                     
                         :BASE_ELEM.ScdTime   ,                                                     
                         :BASE_ELEM.Frequency ,                                                     
                         :CMDSTR             ,                                                      
                         CURRENT_TIMESTAMP                                                          
                         ) ;                                                                        

"BASE_ELEM.JobName" といった直接一段上のデータ項目名とのネストの指定を行えばいいわけです。

逆に言えば、"SCDL0200.BASE_ELEM.JobName" というかたちの指定はできないので、↓のような指定はできないことになります。(埋め込み SQL の場合、実際にプリコンパイルでエラーになります。埋め込み SQL でない場合は問題なくコンパイルできます)

     D SCDL0100        ds                  Qualified                                                
     D  InfStatus                     1a                                                            
     D  JobName                      10a                                                            
                                              
      *                                                                                             
     D SCDL0200        ds                  Qualified Based(jlPtr)                                   
     D  SCDL0100                           LikeDS(SCDL0100)                                         
     D  JobqStatus                   10a                                                            

「データ・ストラクチャーの一部としてデータ・ストラクチャーを LikeDS で使用する場合、元のデータ・ストラクチャー名をデータ項目名として指定すると、埋め込み SQL のホスト変数に使う場合に不都合がある」ということですね。

"SCDL0200.SCDL0100.JobName" と指定できれば、まちがいなく SCDL0200 の中の SCDL0100 の中の JobName ということになりますよね。
"SCDL0100.JobName" という指定では、"SCDL0100" の中の JobName なのか、 "SCDL0200" の中の SCDL0100 の中の JobName なのかが判別できません。

SQL を使用する ILE RPG アプリケーションでのホスト構造の使用」の以下の記述を参照してみてください。

プリコンパイラーは、LIKEDS キーワードを使って定義されたホスト構造を認識します。ただし、ホスト変数の SQL 構文では、SQL ステートメントで 1 レベルの修飾だけを使用できます。

D CustomerInfo     DS                         QUALIFIED
D    Name                               20A
D    Address                            50A

D ProductInfo      DS                         QUALIFIED
D    Number                              5A
D    Description                        20A
D    Cost                                9P 2

D SalesTransaction...
D                  DS                         QUALIFIED
D    Buyer                                    LIKEDS(CustomerInfo)
D    Seller                                   LIKEDS(CustomerInfo)
D    NumProducts                        10I 0
D    Product                                  LIKEDS(ProductInfo)
D                                             DIM(10)

C/EXEC SQL
C+ SELECT * INTO :CustomerInfo.Name, :Buyer.Name FROM MYTABLE
C/END-EXEC

CustomerInfo.Name は、QUALIFIED 構造の変数への参照として認識されます。Buyer.Name は、SalesTransaction.Buyer.Name として定義されます。

SalesTransaction.Buyer.Name は SQL ステートメントで使用できません。SQL 構文では 1 レベルの修飾だけが許容されるためです。COST はディメンションのある配列のため、Product.Cost は SQL ステートメントの中で使用できません。

SalesTransaction と同様に定義された SalesTransaction2 が存在する場合、構造であるサブフィールドは SQL ステートメントの中で使用できません。

[Top Pageに戻る]

Ads by TOK2