グローバル スクリプトを使用すると、スキーマ内の任意のフックからの呼び出しが可能な共通関数を定義できます。 グローバル スクリプトは一種のサブルーチン ライブラリです。Rational® ClearQuest® ソフトウェアが グローバル スクリプトを直接呼び出すことはありません。
グローバル スクリプトは、同じフック コードを呼び出す複数のレコード タイプがある場合に役立ちます。 グローバル スクリプトを使用すると、フック コードを集中管理できるため、フック コードをさまざまな位置にコピーする必要がなくなります。 たとえば、Rational ClearQuest の Email パッケージにあるグローバル スクリプトを使用すると、1 つのグローバル スクリプトを呼び出すだけで複数の通知送信アクションを実行できます。
グローバル スクリプトを実行する唯一の方法は、別のスクリプトから呼び出すことです。 ただし、最終的にグローバル スクリプトへの呼び出しは、フィールド フック、アクション フックまたはレコード スクリプトなどの、レコード ベースのフックへの呼び出しにトレース バックする必要があります。 グローバル スクリプトへの呼び出しは、常にレコード ベースのフックまで追跡されるため、 各グローバル スクリプトは、暗黙の entity オブジェクトと共に提供されます。 この entity オブジェクトは、呼び出しが発生したレコード ベースのフックに渡されます。
VBScript と Perl のいずれを使用してもスクリプトを作成できますが、 一方の言語タイプからもう一方の言語タイプを呼び出すことはできません。 グローバル スクリプトを記述する場合は、それを呼び出すスクリプトと同じ言語で記述してください。
グローバル フックでは関数のみを使用してください。なぜなら、 グローバル スクリプトのコードは、関数内のコード以外すべて実行されるためです。
詳細については、「スクリプトの作成」と「スクリプトを使用するための動作状況」を参照してください。
関連スクリプトの例については、「グローバル スクリプトの例」を参照してください。
Perl では、変数 $entity と $session がグローバル変数で、フックの実行時にアクティブになります。この変数は実行時に定義され、 グローバル スクリプト コード内で使用できます。ただし、グローバル スクリプトのコンテキストの中から、この変数を使って Entity オブジェクト メソッドや Session オブジェクト メソッドを呼び出すことはできません。
$info = $session->GetProductInfo();$session 呼び出しをグローバル サブルーチン内に配置しても、 それだけでは十分でありません。たとえば、次のコードもコンパイル時に $productInfo の 解決が試行されるため、同じ理由で失敗します。
$productInfo = GetProductInfo(); sub GetProductInfo { return $session->GetProductInfo(); }
$productInfo などのグローバル変数を使用する代わりに、GetProductInfo() を 呼び出して値を取得します。
Perl フックの実行中は、$session には常に 現行セッションが設定されます。しかし、最適のパフォーマンスを得るには、Session または Entity オブジェクト データに 依存するグローバル変数の定義は避け、代わりにグローバル アクセス機能 (たとえば、GetUserLoginName() など) を 作成して値を取得してください。
グローバル スクリプトは、ほかのフック (Access Control フック、Initialization フック、Validation フックなど) から呼び出せるサブルーチンの集合体として使用することを前提としています。このため、すべてのグローバル スクリプト コードは、フックの実行のたびに使用される Perl コード部分に含まれます。しかし、グローバル スクリプト コードには サブルーチン スコープの外部にある (ファイル スコープの) ステートメントも含むことができます。
バージョン 7.0.1 以降、 グローバル スクリプトのクローンを作成する新しい Perl フックの機能拡張が使用可能になりました。 この機能拡張を有効にすると、Perl フック環境が作成され、すべての グローバル スクリプト コードのコンパイルとクローン作成が行われ、新しいフック環境が作成されます。 クローン作成プロセスによってコードの再コンパイルの必要がなくなり、フック環境で構文解析ツリーを 共有できるようになります。スクリプトのクローン作成は時間と各 Perl フック環境のメモリの 節約になるので、パフォーマンスの改善につながります (特に、Rational ClearQuest Web で 大きく改善されます)。
スキーマ開発者は、グローバル スクリプトを作成するとき、 クローン作成の使用法を検討する必要があります。 グローバル フックのクローン作成が有効な場合、グローバル スクリプトに含まれるファイル スコープ ステートメントは 1 回 しか実行されません。以降の Perl インタープリタには、その実行結果のクローンが作成されます。 クローン作成が無効の場合は、フック環境が作成されるたびにこのコードが実行されます (レコード アクションごとに 1 度とレコード スクリプトの呼び出しごとに 1 度)。
our $run_once; sub DoSetup { return if defined($run_once); $run_once = 1; # do setup here }
sub Defect_Initialization { DoSetup(); # … # … #reset of Defect_Initialization code…. # … }
このサンプル コードでは、フック環境の作成時には $run_once 変数は 定義されていません。クローン作成時も、この変数は未定義の ままです。フックの最初の実行で DoSetup() を呼び出すと、 セットアップ コードが実行されます。
use Win32::OLE;は、クローン作成されたフック コード内では使用できません (ただし、アクション フック、フィールド フック、レコード フックなどの、クローン作成されていないフック コード内では使用できます)。Win32::OLE は、スレッド セーフではありませんが、ClearQuest Web マルチスレッド環境の外部では使用できます。例えば、
require Win32::OLE; import Win32::OLE;をグローバル スクリプト内で使用して、Win32::OLE モジュールがクローン作成されないようにすることができますが、このモジュールは、Rational ClearQuest Web で使用されるスキーマ内では使用できません。