CRTBNDCL
によるコンパイルの都度に結果がフラフラと異なるような不思議な
現象に悩まされたことはないだろうか ?
コンパイルしたはずなのに、まるで結果が変わらないとかいう現象である。
もしそのような現象に出くわしたとしたら多くの原因は活動化グループが
*NEW
ではなく *DFTACTGRP
になっていることに起因している可能性が高い。
ILE-CLPソースをコンパイルするときは CRTCLMOD + CRTPGM
でコンパイルするか、
または多くは CRTBNDCL
コマンドによってコンパイルするのが一般的である。
省略値によるコンパイルであれば
CRTBNDCL PGM(MYLIB/MYPGM) SRCFILE(PGMRLIB/QCLLESRC) AUT(*ALL)
のようにして コンパイルする。
ところがこのコンパイルの結果を DSPPGM
コマンドで確認してみると
プログラム情報の表示
画面 7 の 1
プログラム . . . . . . : TESTLPAR ライブラリー . . . . . : TEST.COM
所有者 . . . . . . . . : QTR
プログラム属性 . . . . : CLLE
詳細 . . . . . . . . . : *BASIC
プログラム作成情報 :
プログラム作成日/時刻 . . . . . . . . . . . . : 14/10/19 11:13:08
プログラムのタイプ . . . . . . . . . . . . . . : ILE
プログラム入力プロシージャー・モジュール . . . : TESTLPAR
ライブラリー . . . . . . . . . . . . . . . : QTEMP
活動化グループ属性 . . . . . . . . . . . . . . : *DFTACTGRP
共用活動化グループ . . . . . . . . . . . . . . : *NO
ユーザー・プロファイル . . . . . . . . . . . . : *USER
借用権限の使用 . . . . . . . . . . . . . . . . : *YES
コード化文字セット ID . . . . . . . . . . . . : 65535
モジュールの数 . . . . . . . . . . . . . . . . : 1
のように活動化グループ属性: *DFTACTGRP
となってしまい、*NEW
とすることができない。
これは CRTBNDCL
の「省略時の活動化グループ」パラメータの省略値の値が *YES
に
なっているためである。
*DFTACRGRP
という活動化グループは QILE という活動化グループであり
実行ジョブが完全に終了するまではプログラムは一旦、ロードすると
メモリーに留まり続けるのである。
これは ILE
以前の OPM
での実行とは異なるので期待どおりの結果が得られない場合がある。
米国のユーザーは、このことはよく承知していて活動化グループは *NEW
で作成することが
暗黙の了解となっている。
それどころか *DFTACTGRP
としてコンパイルするとプロシージャーの定義そのものが
コンパイル・エラーを引き起こしてしまうのである。
となると *DFTACTGRP
でコンパイルすることは避けるべきとなる。
活動化グループが *NEW
であれば RPG III の終了と同じようにプログラムの終了とともに
プログラムはメモリから正しく削除される。
( 実際はメモリに残るのであるが、再ロードのときには、プログラムで使用しているすべての
変数やフィールドも初期化される。これに対して省略時の活動化グループ(QILE) であれば
QILE の終了まではプログラムは再ロードされると以前に使用されていた変数値やフィールド値も
そのまま再利用されてしまう。)
それでは一体 *NEW
としてコンパイルするには、どのように指定すればよいのだろうか ?
CRTBNDCL
+ [F4キー] を押してから、省略時の活動化グループ (初期値:*YES
) を *NO
にして
実行キーを押すと次のように表示が変更される。
バインド CL PGM の作成 (CRTBNDCL)
選択項目を入力して,実行キーを押してください。
プログラム . . . . . . . . . . > MYPGM 名前
ライブラリー . . . . . . . . . . . > MYLIB 名前 , *CURLIB
ソース・ファイル . . . . . . . QCLSRC 名前
ライブラリー . . . . . . . . . . . > MYSRC 名前 , *LIBL, *CURLIB
ソース・メンバー . . . . . . . *PGM 名前 , *PGM
テキスト ' 記述 ' . . . . . . . *SRCMBRTXT
省略時の活動化グループ . . . . > *NO *YES, *NO
活動化グループ . . . . . . . . *STGMDL 名前 , *STGMDL, *NEW, *CALLER
ストレージ・モデル . . . . . . *SNGLVL *SNGLVL, *TERASPACE
この「活動化グループ」を *STGMDL
から *NEW
に変更してコンパイルすると
作成されたプログラム・オブジェクトの活動化グループは次のように *NEW
としてオブジェクトを
作成することができるのである。
プログラム情報の表示
画面 7 の 1
プログラム . . . . . . : TESTLPAR ライブラリー . . . . . : TEST.COM
所有者 . . . . . . . . : QTR
プログラム属性 . . . . : CLLE
詳細 . . . . . . . . . : *BASIC
プログラム作成情報 :
プログラム作成日/時刻 . . . . . . . . . . . . : 14/10/19 11:20:43
プログラムのタイプ . . . . . . . . . . . . . . : ILE
プログラム入力プロシージャー・モジュール . . . : TESTLPAR
ライブラリー . . . . . . . . . . . . . . . . : QTEMP
活動化グループ属性 . . . . . . . . . . . . . . : *NEW
共用活動化グループ . . . . . . . . . . . . . . : *NO
ユーザー・プロファイル . . . . . . . . . . . . : *USER
借用権限の使用 . . . . . . . . . . . . . . . . : *YES
コード化文字セット ID . . . . . . . . . . . . : 65535
モジュールの数 . . . . . . . . . . . . . . . . : 1
したがって正しい CRTBNDRPG
によるコンパイル・コマンドとは
CRTBNDCL PGM(MYLIB/MYPGM) SRCFILE(MYSRCLIB/QCLLESRC) DFTACTGRP(*NO) ACTGRP(*NEW) AUT(*ALL)
である。
これで ILE-CLP の動作結果が安定しない、という悩みから解放されるにちがいない。
最後に「活動化グループ」については「RPG」の活動化グループの解説を参照されたい。