Solution ID: 24622 Type: External 表題: レコードの登録をキャンセルしたにも関わらず、ClearQuestのID値が加算されてIDに欠 番が出るのはどうしてですか。 製品: ClearQuest OS: Windows DEFECT #: N/A PATCH #: N/A 参照事項: SolutionID: 6630の日本語訳 作成年月日: 20-Dec-2001 改訂年月日: 質問: レコードの登録をキャンセルしたにも関わらず、ClearQuestのID値が加算されて、IDの欠番が 出るのはどうしてですか。 回答: 複数のクライアントアプリケーションが同時にレコードを登録できるようなシステムでユニークな 連番を設定する場合、その連番を設定するタイミングによって、「いつ次の使用可能な番号を 設定するか」、「もし、その後にある番号を使用しないと決めた場合に、何が起きるか」というこ とが問題となります。 ClearQuestでは、この連番をレコードの登録過程の最初の方、Submitアクションの初期化 (Initialization)の処理内で設定します。このために、ユーザーはレコードの登録時の画面でこ の連番(ID)が確認できますし、hookの処理内でこの番号を利用することもできます。 仕様上、この番号をレコードの登録過程の後の方、新しいレコードのCommit時に設定するよ うにする方法も可能ですが、システムのパフォーマンスの潜在的なボトルネックとなり得る、 Commit処理中、Next Idテーブルがロックされることを避けるために、採用しておりません。 ここで言うCommit処理とは、Commit hook コードの処理も含みます。Commit hookコードの 処理は非常に遅い場合があり、さらに他のシステムをフリーズさせる場合もありえます。 このため、弊社では絶対に途切れのない連番を持つことより、ユーザーにとって使用可能な連 番を持つということやhookコード内で使用できるというユーザーにとっての利便性がより重要で あるという結論に達したのです。ディフェクトIDの欠番はClearQuestのシステム上、障害とはな りませんし、問題なく無視することができます。 回避策: もし、お客様の環境でこれが問題となる場合、お客様の側で連番を作成するための新しいフィー ルドを作成し、適切なタイミングでその値を設定するようにします。 下記にこの連番フィールドの作成の手順のサンプルを紹介します。 !!! 注 !!! これらの手順はあくまでサンプルとして提供させていただくもので、Rational Softwareによって 正式にサポートされているものではありません。お客様の責任によって、ご活用ください。 1. 「IDCounter」という名称のStatelessRecordTypeを作成します。 このRecordType内に「LastID」という名称のINT型のフィールドと「Project」という名称の SHORT_STRING型フィールドを追加、「Project」フィールドをユニークキーに設定します。 さらにProjectとLastIDの値を入力するためのフォームを作成し、modifyアクションを定義しま す。 2. ClearQuest Clientを起動し、この新しいIDCounterレコードタイプを初期化(レコードを登録)し ます。 3. 「Defect」レコードタイプ(もしくは連番を設定したいレコードタイプ)に「UniqueID」というフィール ドを追加し、この値をIDとして表示するようにフォームを修正します。 それから、このレコードタイプにSubmitアクションの下記のACTION_VALIDATIONフックを作 成します。ACTION_VALIDATIONフックはユーザーがレコードの登録を確定するまで実行され ません(レコードのコミット処理の直前に実行される)ので、このDefectレコードが登録されたと きのみ、定義された連番が加算されることになります。 フックコード(VB) ============ Dim IDEntity Dim MySession Dim IDCounterObject Set MySession = GetSession Set IDEntity = MySession.GetEntity("IDCounter","Project") Set IDCounterObject = IDEntity.GetFieldValue("LastID") MySession.EditEntity IDEntity, "Modify" IDEntity.SetFieldValue "LastID", IDCounterObject.GetValue() + 1 IDEntity.Validate IDEntity.Commit SetFieldValue "UniqueID", IDCounterObject.GetValue() + 1 注1) 上記のコード内の最後のステートメントを実行する前にID.Entity.Commitメソッドの戻り値を確 認したほうが良いかもしれません。もし、何らかの理由でこのコミット処理が失敗した場合、 UniqueIDとして同じ値を持つ複数のDefectレコードが作成されてしまいます。 注2) もし、Defectレコードのコミットが失敗した場合は、IDCounterの方は連番が加算されていますの で、Defectレコード側ではUniqueIDにギャップが生じることになります。 ご不明な点等ありましたら、ラショナルカスタマサービスへお問い合わせ下さい。