RPG

219.ILE-RPG の正しいコンパイルの方法

CRTBNDRPG によるコンパイルの都度に結果がフラフラと異なるような不思議な
現象に悩まされたことはないだろうか ?
もしそのような現象に出くわしたとしたら多くの原因は活動化グループが
*NEW ではなく *DFTACTGRP になっていることに起因している可能性が高い。

ILE-RPGソースをコンパイルするときは CRTRPGMOD + CRTPGM でコンパイルするか、または
多くは CRTBNDRPG コマンドによってコンパイルするのが一般的である。
省略値によるコンパイルであれば

CRTBNDRPG PGM(MYLIB/MYPGM) SRCFILE(PGMRLIB/QRPGLESRC) AUT(*ALL)

のようにして コンパイルする。
ところがこのコンパイルの結果を DSPPGM コマンドで確認してみると

	
	                            プログラム情報の表示                        
                                                                   画面 
  プログラム . . . . . . :   TESTZERO      ライブラリー . . . . . :   TEST
  所有者 . . . . . . . . :   QTR                                          
  プログラム属性 . . . . :   RPGLE                                        
  詳細 . . . . . . . . . :   *BASIC                                       

  プログラム作成情報 :                                                    
    プログラム作成日/時刻 . . . . . . . . . . . . :   14/10/18  14:19:34 
    プログラムのタイプ . . . . . . . . . . . . . . :   ILE                
    プログラム入力プロシージャー・モジュール . . . :   TESTZERO           
      ライブラリー . . . . . . . . . . . . . . . .. :     QTEMP            
    活動化グループ属性 . . . . . . . . . . . . . . :    *DFTACTGRP
    共用活動化グループ . . . . . . . . . . . . . . :   *NO                
    ユーザー・プロファイル . . . . . . . . . . . . :   *USER              
    借用権限の使用 . . . . . . . . . . . . . . . . :   *YES               
    コード化文字セット識別コード . . . . . . . . . :   65535              
    モジュールの数 . . . . . . . . . . . . . . . . :   1                  

のように 活動化グループ属性: *DFTACTGRP となってしまい、*NEW とすることができない。
*DFTACRGRP という活動化グループは QILE という活動化グループ であり
実行ジョブが完全に終了するまではプログラムは一旦、ロードすると
メモリーに留まり続けるのである。
これは RPG III での実行とは異なるので期待どおりの結果が得られない場合がある。
米国のユーザーは、このことはよく承知していて活動化グループは *NEW で作成することが
暗黙の了解となっている。

それどころか *DFTACTGRP としてコンパイルするとプロシージャーの定義そのものが
コンパイル・エラーを引き起こしてしまうのである。
となると *DFTACTGRP でコンパイルすることは避けるべきとなる。

活動化グループ*NEW であれば RPG III の終了と同じようにプログラムの終了とともに
プログラムはメモリから正しく削除される。
( 実際はメモリに残るのであるが、再ロードのときには、プログラムで使用しているすべての
  変数やフィールドも初期化される。これに対して省略時の活動化グループ(QILE) であれば
  QILE の終了まではプログラムは再ロードされると以前に使用されていた変数値やフィールド値も
  そのまま再利用されてしまう。)

それでは一体 *NEW としてコンパイルするには、どのように指定すればよいのだろうか ?

CRTBNDGRP + [F4キー] を押してから、省略時の活動化グループ(初期値:*YES) を *NO にして
実行キーを押すと次のように表示が変更される。


                      バインド RPG PGM の作成  (CRTBNDRPG)                     

   選択項目を入力して,実行キーを押してください。                                

   プログラム  . . . . . . . . . . > MYPGM          名前 , *CTLSPEC           
     ライブラリー  . . . . . . . . >   MYLIB        名前 , *CURLIB            
   ソース・ファイル  . . . . . . .   QRPGLESRC      名前 , QRPGLESRC             
     ライブラリー  . . . . . . . . >   MYSRCLIB     名前 , *LIBL, *CURLIB     
   ソース・メンバー  . . . . . . .   *PGM           名前 , *PGM                  
   ソース・ストリーム・ファイル                                                  

   生成重大度レベル  . . . . . . .   10            0-20                          
   テキスト ' 記述 ' . . . . . . .   *SRCMBRTXT                                  

   省略時の活動化グループ  . . . . > *NO           *YES, *NO                  
   活動化グループ  . . . . . . . .   QILE           名前 , QILE, *NEW, *CALLER   
  BINDING ディレクトリー   . . . .   *NONE          名前 , *NONE                 
     ライブラリー  . . . . . . . .                  名前 , *LIBL, *CURLIB...     
                  値の続きは+                                                   

この「活動化グループ」を QILE から *NEW に変更してコンパイルすると
作成されたプログラム・オブジェクトの活動化グループは次のように *NEW としてオブジェクトを
作成することができるのである。


                              プログラム情報の表示                              
                                                                      画面 7 の 1
   プログラム . . . . . . :   TESTZERO      ライブラリー . . . . . :   TEST.COM  
   所有者 . . . . . . . . :   QTR                                                
   プログラム属性 . . . . :   RPGLE                                              
   詳細 . . . . . . . . . :   *BASIC                                             

   プログラム作成情報 :                                                          
     プログラム作成日/時刻 . . . . . . . . . . . . :   14/10/18  14:13:39       
     プログラムのタイプ . . . . . . . . . . . . . . :   ILE                      
     プログラム入力プロシージャー・モジュール . . . :   TESTZERO                 
       ライブラリー . . . . . . . . . . . . . . . . :     QTEMP                  
     活動化グループ属性 . . . . . . . . . . . . . . :    *NEW 
     共用活動化グループ . . . . . . . . . . . . . . :   *NO                      
     ユーザー・プロファイル . . . . . . . . . . . . :   *USER                    
     借用権限の使用 . . . . . . . . . . . . . . . . :   *YES                     
     コード化文字セット識別コード . . . . . . . . . :   65535                    
     モジュールの数 . . . . . . . . . . . . . . . . :   1                        
                                                                                 

したがって正しい CRTBNDRPG によるコンパイル・コマンドとは

CRTBNDRPG PGM(TEST.COM/TESTZERO) SRCFILE(R540SRC/QRPGLESRC)                 
                                      DFTACTGRP(*NO) ACTGRP(*NEW) AUT(*ALL)

である。

これで ILE-RPG の動作結果が安定しない、という悩みから解放されるにちがいない。