*CALLLVL 対 *ACTGRPDFN
Question
ILE CL プログラムの OVRDBF コマンドで OVRSCOPE(*CALLLVL) を指定することと、OVRSCOPE(*ACTGRPDFN) を指定することの違いは何ですか。
Answer
プログラムでファイルを開くたびに、そのオープンに影響のある指定変更があるかどうか確認されます。OVRSCOPE パラメーターは、その指定変更の範囲を制御します。これは、「どのオープンでこの指定変更が使用されるはずなのか」という質問の答えになります。
*CALLLVL は、指定変更の範囲がコール・レベル内であることを意味します。あるプログラムが別のプログラムを呼び出し、そのプログラムがさらに別のプログラムを呼び出すとどうなるか考えてみてください。最終的に、プログラムが極めて「積み重なった状態」になるでしょう。例えば、次のようになります。
PGM1 --calls--> PGM2 --calls--> PGM3
PGM2 が *CALLLVL で指定変更を設定すると、PGM2 と PGM3 に影響を与えますが、PGM1 には影響ありません。PGM2 が終了すると、その *CALLLVL 指定変更は自動的に削除されます。*CALLLVL が意味しているのはそれです。指定変更がコール・レベルで行われ、コール・レベルが終了すると削除されます。
V2R3 以前は *CALLLVL は OVRSCOPE のデフォルト・オプションでした。当時、オプションは *CALLLVL と *JOB だけでした。オープンがどのコール・スタック・レベルで発生しようと、*JOB は常にジョブ中の、それ以降のオープンに影響を与えました。*JOB ではしばしば競合が発生します。例えば、ジョブ・レベルの指定変更を削除するのを忘れた場合、それ以降のプログラムに影響があります。たとえ、そのプログラムが指定変更を発行したプログラムとまったく無関係だったとしてもです。そうした競合が発生するため、*JOB はできる限り避けるべきでしょう。
*ACTGRPDFN は定義された活動化グループを表し、V2R3 以来 OVRSCOPE パラメーターのデフォルト値です。つまり、指定変更の発行元となる活動化グループによって、指定変更の範囲の動作は異なることを意味しています。あなたが「この指定変更の指定変更範囲は何か」と自問するかもしれませんが、その答えは「定義された活動化グループ」となるでしょう。つまり、活動化グループで定義されているのです。
プログラムで考えられる活動化グループとは何か、また指定変更範囲はどのような振る舞いをするのでしょうか。
- *DFTACTGRP
コール・レベルで指定変更の範囲が指定されます(*CALLLVL と同じ)。OPM プログラムは常にこの活動化グループで動作しているため、常に同じように動作します。同様にデフォルト活動化グループで動作する ILE プログラムは、その OPM の相手プログラムのように動作します。 - NAMED actgrp (QILE を含む)
指定変更は、その活動化グループだけに存在するファイル・オープンに影響を与えます。*JOB のようにコール・レベルは関係ありませんが、*JOB と異なり、1 つの活動化グループ、指定変更の発行元の活動化グループのみに影響を与えます。さまざまな名前の活動化グループ、デフォルト活動化グループなどのファイル・オープンには影響はありません。 - *NEW
これは NAMED と同じですが、活動化グループの名前がシステムで生成されている点が異なります。 -
*CALLER
プログラムの呼び出し元により異なります。デフォルト活動化グループから呼び出された場合、上記の *DFTACTGRP を参照してください。それ以外については、上記 NAMED actgrp を参照してください。
詰まるところ、可能性は実際 2 つしかないということです。*DFTACTGRP は *CALLLVL のように動作し、その他は指定変更の発行元となる活動化グループのみに影響するよう範囲が指定されるということです。