フック

このトピックでは、ClearQuest フックの概念を説明します。

フックは、トリガと同様、 スクリプトのエントリ ポイントです。フックは指定されたタイミングで実行され、ユーザーによる Rational® ClearQuest® 環境での処理を制御します。

フックはスーパーユーザー権限を使用して実行されます。したがって、 通常のアクセス制御またはフィールド動作制限の対象にはなりません。 フックを使用すると、通常は読み取り専用であるフィールドの値の設定とリセットを行えます。 (ただし、History フィールドなどの システム フィールドはリセットできません。) 必須フィールドはフックを使用しても必須フィールドのままです。 詳細については、『IBM Rational ClearQuest API リファレンス』と「アクションとアクセス制御」を参照してください。

次の 4 タイプのフックがサポートされます。

フックのスクリプト言語

フックは、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 つの複雑なトランザクションの一部として更新されることがあります。複製環境用のフックを設計およびテストする場合は、この原則を考慮する必要があります。

相互に関連し合うレコードのある複製環境での複雑なアプリケーションの場合には、スキーマ設計で以下のケースに対処する必要があります。
  • 親レコードが、マスターシップのために変更できない。例えば、親レコードは現行サイトでマスター登録されていない場合には、変更できません。
  • 親レコードは変更可能であるが (現行サイトでマスター登録されている)、従属レコードはマスターシップのために変更できない (現行サイトでマスター登録されていない)。

レコードのロックおよびスキーマの確認も参照してください。

パッケージによってインストールされるスクリプト

パッケージをインストールするとき、 フィールド フックやレコード スクリプトがスキーマに追加されることがあります。これらのスクリプトはパッケージの一部であり、 ユーザーのフック コードの一部ではありません。

パッケージ所有のスクリプトは削除または修正できません。 それらはスキーマが所有するコードの一部ではありません。この理由により、ユーザーがフック コードに選択したデフォルト言語設定と、パッケージが所有するフックが実装されている言語との間には関係はありません。


フィードバック