Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[Notes/Domino] ビューの「索引にユニークなキーを作成する」プロパティを使用した場合の不具合(2)

索引にユニークなキーを作成する

以前不具合を報告した「索引にユニークなキーを作成する」の不具合ですが、まだ不具合があるようです(x_x) 以下、再現手順です。

再現手順

1. ビューの1列目をソートし、「索引にユニークなキーを作成する」を有効にしたビューを作成します。

2. 同じ値の文書を複数作成します。
(例) 「りんご」「りんご」「みかん」の3文書を作成すると、以下のようになります。

りんご ← 2文書あるが、1文書にまとめられている
みかん

3. 文書を削除します。すると、残りの文書が存在しているのに、ビューからエントリが消えます。
(例) 「りんご」を消すと、もう1文書「りんご」があるのに、「みかん」だけになります。

みかん

4. [Shift] + [F9] キーを押せば、正しい状態になります。([F9] だけではダメ)

りんご ← [Shift] + [F9] キーで復活
みかん

詳細情報

上記現象は、文書を削除した場合だけでなく、ビューから文書が消える場合(ステータスが変わったときなど)でも発生します。要は、「索引にユニークなキーを作成する」は最初の1文書を表示しているだけで、その文書がビューから無くなっても、同じ値の文書はすぐに表示されない、ということのようです。

ネットを検索してみたところ、こちらに詳しい情報が載っていました。(前に紹介した競合文書の件も載っていました。)以下、抜粋です。

If a document is deleted, you might expect another document with the same key value to take its place in the view. Alas, this does not occur. The view indexer has already considered those existing documents for inclusion in the view, and rejected them because the key was already there. Now that the key is no longer there, Notes doesn't hunt through the already-rejected documents for a replacement. Documents are considered for inclusion only when they are modified or created. So, if in your application the documents you're looking up might be deleted or their keys changed, this isn't an appropriate solution for you -- unless you can arrange to have the index rebuilt each time this occurs. For instance, if the documents are deleted by an archiving agent, have that same agent issue a NotesView.Rebuild against the view, or schedule the index rebuild as a periodic server task timed for after the agent runs. A refresh isn't good enough -- it has to be a rebuild.

以下は、管理人による超訳です(^^;

文書が削除された場合、キーの値が同じである別の文書がビューに表示されると思われるかもしれませんが、悲しいかな、そうはなりません。ビューインデクサは、ビューに含まれる、キーが同じ別の文書をすでに除外しています。キーが無くなったとしても、ノーツはすでに除外された文書を代替として捕まえてきません。文書が更新または作成された場合にのみ、索引に反映されます。したがって、アプリケーションで、参照している文書が削除されたりキーが変わったりする可能性がある場合は、そのたびに再構築を実行しない限り、「索引にユニークなキーを作成する」は適切なソリューションではありません。たとえば、アーカイブエージェントによって文書が削除されるような場合、同じエージェント内でビューに対して NotesView.Rebuild を実行するか、エージェント実行後に索引を再構築するサーバータスクをスケジューリングする必要があります。(「更新」では不十分で、「再構築」を実行する必要があります。)

Rebuild しろ、と書いてありますが、文書が多い場合にはサーバー負荷が高くなってしまうので、あまりおすすめではありません。でも、それ以外に解決方法が無いのが悲しいところ 😥 一番いいのは、本末転倒ですが「索引にユニークなキーを作成する」を使わない方法(リストの取得はカテゴライズしたビューで @DbColumn にするとか、ユニークリスト用の別文書を作成するとか)を模索することかも……(TT

1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 4.00 out of 5)
Loading...

トラックバック

トラックバックはありません

コメント

コメントはありません

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 8009 to the field below:

^
×