固定カラム式 RPG をフリー・フォーマット RPG に書き直す

こちらで参照した元の Fixed-Format RPG で書かれたプログラムを Free-Format RPG に書き直してみました。

固定カラム式 RPG の例

元のソースは↓になります。

     D Inf_Len         S              4B 0 inz(%size(Job_Inf))                                      
      *                                                                                             
     D Job_Inf         DS           256    Qualified                                                
     d  JobName                9     18                                                             
     d  JobUser               19     28                                                             
     d  JobNumber             29     34                                                             
     d  InternalId            35     50                                                             
     d  Status                51     60                                                             
     D  JobType               61     61                                                             
     D  JobSubType            62     62                                                             
     D  Subsystem             63     72                                                             
     D  JobRunPty             73     76b 0                                                          
     D  SystemPool            77     80b 0                                                          
     D  ProcessUnit           81     84b 0                                                          
     D  AuxRequests           85     88b 0                                                          
     D  InteractTrans         89     92b 0                                                          
     D  TotRespTime           93     96b 0                                                          
     d  FunctionType          97     97                                                             
     D  FunctionName          98    107                                                             
     D  ActJobStatus         108    111                                                             
     D  DBLockWait           112    115b 0                                                          
     D  MchLockWait          116    119b 0                                                          
     D  NDBLockWait          120    123b 0                                                          
     D  TimeDBLckW           124    127b 0                                                          
     D  TimeNDBLckW          128    131b 0                                                          
     D  TimeMchLckW          132    135b 0                                                          
      *                                                                                             
     D   Api_Format    S              8a   inz('JOBI0200')                                          
     D   Job_Qual      S             26a                                                            
     D   Job_Int       S             16a   inz(*blanks)                                             
      *                                                                                             
      * For this program, an the parms are used:                                                    
     c     *entry        plist                                                                      
     c                   parm                    CTJob            10                                
     c                   parm                    CTUser           10                                
     c                   parm                    CTJobN            6                                
     c                   parm                    Job_Inf         256                                
      * or you could use the Internal Job ID (*char 16) which                                       
      * can be gathered from the QUSLJOB (list job) API.                                            
                                                                                                    
      * Qualify the Job Name:                                                                       
     C                   eval      Job_Qual = CTJOB + CTUSER + CTJOBN                               
     c                   z-add     256           Inf_Len                                            
                                                                                                    
      * Call the API to retrieve the WRKACTJOB info for this job:                                   
     C                   call      'QUSRJOBI'                                                       
     C                   parm                    Job_Inf                                            
     C                   parm                    INF_Len                                            
     C                   parm      'JOBI0200'    Api_Format        8                                
     C                   parm                    Job_Qual         26                                
     C                   parm      *BLANKS       Job_Int          16                                
                                                                                                    
     c                   eval      *inlr = *on                                                      
     c                   return                                                                     

フリー・フォーマット RPG への書き直し例

Free-Format RPG で書き直してみたのが↓になります。

     H DFTACTGRP(*NO)
      * For this program, an the parms are used:                                                    
     D RtvJobInf2      PR                                                                           
     d  JobNameIn                    10a                                                            
     d  JobUserIn                    10a                                                            
     d  JobNumberIn                   6a                                                            
      *                                                                                             
     D RtvJobInf2      PI                                                                           
     d  JobNameIn                    10a                                                            
     d  JobUserIn                    10a                                                            
     d  JobNumberIn                   6a                                                            
      *                                                                                             
     D Inf_Len         S              4B 0 inz(%size(Job_Inf))                                      
      *                                                                                             
     D Job_Inf         DS           256    Qualified                                                
     D  ByteReturned                 10i 0                                                          
     D  ByteAvailable                10i 0                                                          
     d  JobName                      10a                                                            
     d  JobUser                      10a                                                            
     d  JobNumber                     6a                                                            
     d  InternalId                   16a                                                            
     d  Status                       10a                                                            
     D  JobType                       1a                                                            
     D  JobSubType                    1a                                                            
     D  Subsystem                    10a                                                            
     D  JobRunPty                    10i 0                                                          
     D  SystemPool                   10i 0                                                          
     D  ProcessUnit                  10i 0                                                          
     D  AuxRequests                  10i 0                                                          
     D  InteractTrans                10i 0                                                          
     D  TotRespTime                  10i 0                                                          
     d  FunctionType                  1a                                                            
     D  FunctionName                 10a                                                            
     D  ActJobStatus                  4a                                                            
     D  DBLockWait                   10i 0                                                          
     D  MchLockWait                  10i 0                                                          
     D  NDBLockWait                  10i 0                                                          
     D  TimeDBLckW                   10i 0                                                          
     D  TimeNDBLckW                  10i 0                                                          
     D  TimeMchLckW                  10i 0                                                          
      *                                                                                             
     D   Api_Format    S              8a   inz('JOBI0200')                                          
     D   Job_Qual      S             26a                                                            
     D   Job_Int       S             16a   inz(*blanks)                                             
      *                                                                                             
     D GetJobInf       PR                  extpgm('QUSRJOBI')                                       
     D   Job_Inf_O                         like(Job_Inf)                                            
     D   INF_Len_I                         like(Inf_Len)                                            
     D   Api_Format_I                      like(Api_Format)                                         
     D   Job_Qual_I                        like(Job_Qual)                                           
     D   Job_Int_I                         like(Job_Int)                                            
      *                                                                                             
      * or you could use the Internal Job ID (*char 16) which                                       
      * can be gathered from the QUSLJOB (list job) API.                                            
                                                                                                    
      * Qualify the Job Name:                                                                       
      /Free                                                                                         
            Job_Qual = JobNameIn + JobUserIn + JobNumberIn ;                                        
                                                                                                    
      * Call the API to retrieve the WRKACTJOB info for this job:                                   
            Api_Format = 'JOBI0200' ;                                                               
            Job_Int = *blanks ;                                                                     
                                                                                                    
            GetJobInf (Job_Inf :                                                                    
                       Inf_len :                                                                    
                       Api_Format :                                                                 
                       Job_Qual :                                                                   
                       Job_Int ) ;                                                                  

            *inlr = *on ;                                                                           
            return ;                                                                                
      /End-Free                                                                                     

比較

両方併記したものです。(Fixed Format の部分はコメントでつぶしてあります)
書き換えた理由はコメントしておきました。

     H DFTACTGRP(*NO)
     D RtvJobInf2      PR                                                                           
     d  JobNameIn                    10a                                                            
     d  JobUserIn                    10a                                                            
     d  JobNumberIn                   6a                                                            
      *                                                                                             
     D RtvJobInf2      PI                                                                           
     d  JobNameIn                    10a                                                            
     d  JobUserIn                    10a                                                            
     d  JobNumberIn                   6a                                                            
      *                                                                                             
     D Inf_Len         S              4B 0 inz(%size(Job_Inf))                                      
      *                                                                                             
     D Job_Inf         DS           256    Qualified                                                
     D  ByteReturned                 10i 0                                                          
     D  ByteAvailable                10i 0                                                          
     d* JobName                9     18                                                             
     d  JobName                      10a                                                            
     d* JobUser               19     28                                                             
     d  JobUser                      10a                                                            
     d* JobNumber             29     34                                                             
     d  JobNumber                     6a                                                            
     d* InternalId            35     50                                                             
     d  InternalId                   16a                                                            
     d* Status                51     60                                                             
     d  Status                       10a                                                            
     D* JobType               61     61                                                             
     D  JobType                       1a                                                            
     D* JobSubType            62     62                                                             
     D  JobSubType                    1a                                                            
     D* Subsystem             63     72                                                             
     D  Subsystem                    10a                                                            
     D* JobRunPty             73     76b 0                                                          
     D  JobRunPty                    10i 0                                                          
     D* SystemPool            77     80b 0                                                          
     D  SystemPool                   10i 0                                                          
     D* ProcessUnit           81     84b 0                                                          
     D  ProcessUnit                  10i 0                                                          
     D* AuxRequests           85     88b 0                                                          
     D  AuxRequests                  10i 0                                                          
     D* InteractTrans         89     92b 0                                                          
     D  InteractTrans                10i 0                                                          
     D* TotRespTime           93     96b 0                                                          
     D  TotRespTime                  10i 0                                                          
     d* FunctionType          97     97                                                             
     d  FunctionType                  1a                                                            
     D* FunctionName          98    107                                                             
     D  FunctionName                 10a                                                            
     D* ActJobStatus         108    111                                                             
     D  ActJobStatus                  4a                                                            
     D* DBLockWait           112    115b 0                                                          
     D  DBLockWait                   10i 0                                                          
     D* MchLockWait          116    119b 0                                                          
     D  MchLockWait                  10i 0                                                          
     D* NDBLockWait          120    123b 0                                                          
     D  NDBLockWait                  10i 0                                                          
     D* TimeDBLckW           124    127b 0                                                          
     D  TimeDBLckW                   10i 0                                                          
     D* TimeNDBLckW          128    131b 0                                                          
     D  TimeNDBLckW                  10i 0                                                          
     D* TimeMchLckW          132    135b 0                                                          
     D  TimeMchLckW                  10i 0                                                          
      *                                                                                             
     D   Api_Format    S              8a   inz('JOBI0200')                                          
     D   Job_Qual      S             26a                                                            
     D   Job_Int       S             16a   inz(*blanks)                                             
      *                                                                                             
     D GetJobInf       PR                  extpgm('QUSRJOBI')                                       
     D   Job_Inf_O                         like(Job_Inf)                                            
     D   INF_Len_I                         like(Inf_Len)                                            
     D   Api_Format_I                      like(Api_Format)                                         
     D   Job_Qual_I                        like(Job_Qual)                                           
     D   Job_Int_I                         like(Job_Int)                                            
      *            

ポイント

*ENTRY PLIST

*entry plist についてはこちらで紹介したようにプロトタイプ定義に変更しています。

      * For this program, an the parms are used:                                                    
     c*    *entry        plist                                                                      
     c*                  parm                    CTJob            10                                
     c*                  parm                    CTUser           10                                
     c*                  parm                    CTJobN            6                                
     c*                  parm                    Job_Inf         256                                
      * or you could use the Internal Job ID (*char 16) which                                       
      * can be gathered from the QUSLJOB (list job) API.

      * Qualify the Job Name:                                                                       
     C*                  eval      Job_Qual = CTJOB + CTUSER + CTJOBN                               
      /Free                                                                                         
            Job_Qual = JobNameIn + JobUserIn + JobNumberIn ;                                        
      /End-Free    

データ・ストラクチャ / %SIZE

↓の Inf_Len のサイズの設定は D仕様書でデータ・ストラクチャーの %size を取ることで行っています。
元のままだとあわせておかないといけない定数を三箇所(データ・ストラクチャーの長さとここと Job_Inf ワークフィールドの定義時)に書くことになってしまい、メインテナンスする時に面倒かなと思いましたので ......

     c*                  z-add     256           Inf_Len

CALL からサブプロシージャの呼び出しへ

API の呼び出しも、より ILE RPG らしくプロシージャー呼び出しに変更しています。

C* で始まっている部分が書き直す元のコーディングです。

      * Call the API to retrieve the WRKACTJOB info for this job:                                   
      /Free                                                                                         
            Api_Format = 'JOBI0200' ;                                                               
            Job_Int = *blanks ;                                                                     
                                                                                                    
            GetJobInf (Job_Inf :                                                                    
                       Inf_len :                                                                    
                       Api_Format :                                                                 
                       Job_Qual :                                                                   
                       Job_Int ) ;                                                                  
      /End-Free 
  
                             
     C*                  call      'QUSRJOBI'                                                       
     C*                  parm                    Job_Inf                                            
     C*                  parm                    INF_Len                                            
     C*                  parm      'JOBI0200'    Api_Format        8                                
     C*                  parm                    Job_Qual         26                                
     C*                  parm      *BLANKS       Job_Int          16                                
                                                                                                    
     c*                  eval      *inlr = *on                                                      
     c*                  return                                                                     


      /Free                                                                                         
            *inlr = *on ;                                                                           
            return ;                                                                                
      /End-Free

[Top Pageに戻る]

Ads by TOK2