フックは、トリガと同様、 スクリプトのエントリ ポイントです。フックは指定されたタイミングで実行され、ユーザーによる Rational® ClearQuest® 環境での処理を制御します。
フックはスーパーユーザー権限を使用して実行されます。したがって、 通常のアクセス制御またはフィールド動作制限の対象にはなりません。 フックを使用すると、通常は読み取り専用であるフィールドの値の設定とリセットを行えます。 (ただし、History フィールドなどの システム フィールドはリセットできません。) 必須フィールドはフックを使用しても必須フィールドのままです。 詳細については、『IBM Rational ClearQuest API リファレンス』と「アクションとアクセス制御」を参照してください。
次の 4 タイプのフックがサポートされます。
フィールド フックを使用すると、実行時に 1 つのフィールド値をチェックし、 必要に応じてほかのフィールドを調整できます。 たとえば、フィールドの内容を確認したり、フィールドにデフォルト値を割り当てることができます。
アクション フックを使用すると、レコードのライフ サイクルの主要ポイントで タスクを実行できます。一般に、アクション フックはレコード全体に影響を及ぼすイベントに 関連付けられます。たとえば、レコード全体を確認したり、アクション完了時に通知を送信できます。
レコード スクリプトを使用すると、 実行時に特定のタスクを実行できます。レコード スクリプトは 1 つのレコード タイプ専用であり、通常はフォーム コントロールに関連付けられています。
グローバル スクリプトを使用すると、 スキーマ内のすべてのレコード タイプで共有できるルーチンのライブラリを 定義できます。たとえば、電子メールによる通知など、すべてのレコード タイプのすべてのフックから呼び出すことができるサブルーチンを作成できます。
フックは、VBScript (Windows の場合) と Perl (UNIX システムと Windows の場合) で 作成できます。デフォルトで、フックは Windows 版では VBScript で 実行されます。Windows 上でフックを Perl で実行させる方法については、「スクリプト言語」を参照してください。
フィールド フックとアクション フックには、VBScript または Perl で 記述したスクリプトを追加できます。グローバル スクリプトまたはレコード スクリプトを作成する場合は、必ず VBScript または Perl を使用してください。
格納や参照を簡単に行うために、同一スキーマ内に VBScript と Perl の両方のスクリプトを記述することが可能です。 ただし、スキーマは、そのスキーマに指定されている言語のスクリプトのみを実行します。詳しくは、 スクリプト言語を参照してください。
スクリプトの記述または編集は、スクリプト エディタ内で行います。 新規スクリプトを定義すると、Designer によって、 そのフックの呼び出し構文がスクリプト エディタ ウィンドウに追加されます。呼び出し構文は 編集できません。Designer によって、サンプルの本体テキストも追加されます。こちらは、必要に応じて 編集できます。(当初、本体テキストはコメント化されているので、 コメント マーカーを削除しないと実行されません。)
Designer には、VBScript 用と Perl 用の スクリプト エディタが別々に用意されています。エディタ タイプは、 ウィンドウのタイトル バーに表示されます。正しいエディタを使用していることを確認してから、 コードを記述してください。
フックの 動作状況は一貫しているため、VBScript フックと Perl フックを作成するプロセスは 単純化されています。フックが VBScript スクリプトまたは Perl スクリプトを呼び出す前に、Rational ClearQuest ソフトウェアによって Session オブジェクトが作成され、ユーザーをログインさせます。すべてのフック (グローバル スクリプトも含む) は、 現行レコードのコンテキストから実行されるので、ユーザーには、そのレコードに対応する Entity オブジェクトが 提供されます (グローバル スクリプトでは、呼び出し元のフックに関連付けられた Entity オブジェクトを共有します)。
スクリプト内では、前に識別子を指定しなくてもエンティティのメソッドを呼び出すことができます。 たとえば、次の方法でエンティティの GetSession メソッドを呼び出すことができます。
set curSession = GetSession
この方法でメソッドを呼び出すと、Rational ClearQuest ソフトウェアは、 フックに渡される暗黙的な Entity オブジェクトのメソッドを呼び出していると見なします。明示的に Entity オブジェクトを参照する場合は、オブジェクトの識別子としてレコード タイプ名を使用します。 以下の例で示すように、この識別子を使用すると、同時に複数の Entity オブジェクトを処理するコードが簡単に識別できます。この例では、エンティティに別のエンティティの重複としてマークします。
set curSession = GetSession idName = GetFieldValue("id").GetValue set currentObj = curSession.GetEntity("defect", idName) ' Mark the entity with ID="SAMPL00000031" as a duplicate of this entity. ' Use the action named "duplicate". set dupEntityObj = curSession.GetEntity("defect", "SAMPL00000031") curSession.MarkEntityAsDuplicate dupEntityObj, currentObj, "duplicate"
スクリプトはフィールドの動作に影響を与えることがあるため、 フック コードの設計とテストは慎重に行ってください。たとえば、フックがフィールドに何らかの値を含めることを要求した場合、フィールドの動作を MANDATORY に設定していなくてもフィールドは必須となります。
フック コードが正しく作成されていないと、 実行時にエラーが発生することがあります。フックは、スキーマの確認時にコンパイルされ、 構文または文法上のエラーがすべてマークされます。 スキーマをチェックインする前に、テスト データベースを使用してスキーマをテストしてください。 また、スキーマの変更を適用する前に、ユーザー データベースをバックアップしてください。 詳細については、「テスト データベースでのスキーマのテスト」を参照してください。
複製環境で実行するフックに関係する問題の多くは、単一サイトのデータベース ロックの問題の場合と同じです。フックの機能テストも、単一サイトまたは複製環境で同じです。しかし、一部の ClearQuest フックの実行は、複製環境と単一サイト環境では異なることがあります。例えば、あるレコードのアクションのコンテキストで別のレコードを更新するフックは、別のレコードが現行サイトにマスター登録されていない場合には、エラーが発生することがあります。この場合には変更できません。
各データベース レコードを更新できるのは、現在マスター登録されているサイト (これは、レコードの ratl_mastership フィールドの複製サイト名で示されます) でのみです。複雑なアプリケーションでは、複数のレコードが 1 つの複雑なトランザクションの一部として更新されることがあります。複製環境用のフックを設計およびテストする場合は、この原則を考慮する必要があります。
パッケージをインストールするとき、 フィールド フックやレコード スクリプトがスキーマに追加されることがあります。これらのスクリプトはパッケージの一部であり、 ユーザーのフック コードの一部ではありません。
パッケージ所有のスクリプトは削除または修正できません。 それらはスキーマが所有するコードの一部ではありません。この理由により、ユーザーがフック コードに選択したデフォルト言語設定と、パッケージが所有するフックが実装されている言語との間には関係はありません。