ホーム > ロータスノーツのソフトウェアロータスノーツのソリューションLotus Notesのチュートリアルロータスドミノデザイナー 、通常の文書に>変更Lotus Notesのレプリケーション競合ドキュメント

通常の文書にLotus Notesのレプリケーション競合文書を変更する

複製/保存の競合文書をLotus Notesのような分散環境で必要です。 開発者は、競合をマージするために、フォームのプロパティを設定するようなものを通じた紛争を最小限に抑えるために彼/彼女ができるすべてを行うことができ、可能であればとNotes 6で文書のロックを使用します。 しかし、おそらく文書のロックは、ユーザーがNotesまだ6またはアプリケーションが実際に配布されているので(ローカルレプリカとしないネットワークアクセスを持つユーザーが既存の文書を編集することができます)上に存在しないので、実装することができないものです。 その場合、あなたは、競合を持つようにバインドされているとそれらに対処する必要があります。

これ 、Lotus Notes は、競合を処理する方法に関するすべての詳細に入る適切な場所ではありませんが、のちょうど最後の編集と編集の数時間に基づいてアルゴリズムが競合"勝者"と判断するために使用されているとしましょう紛争 "敗者"。 これらのデータベース内の2つの別個の文書です。 二つの文書を評価するとき、あなたが取ることができる3つのアクションがあります。

  1. "勝者"はそれに必要なすべての情報を持っていると "敗者"は追加することができます何もないことを決定します。
  2. "敗者"がそれに必要なすべての情報を持っており、 "勝者"は追加することができます何もないことを決定します。
  3. 各ドキュメントが保持されるために必要な情報を持っていることを決定します。

場合、上記の#1で、レプリケーションの競合の敗者は、単にデータベースから削除することができます。 場合、上記の#3で、勝者であることが必要敗者の情報は、コピー/勝者に貼り付けし、敗者 、Lotus Notes データベースから削除したりすることができます。 そのような場合は、処理が比較的容易である。

ケース#2では、物事はもう少し複雑になります。 あなたは勝者に敗者からケース#3とコピー情報のように扱い、上に移動することができます。 レプリケーションの競合の勝者を削除した場合、その後敗者は孤児となり、どこに表示されませんので、しかし、あなたはケース#1のように扱うことはできません。 以下のコードを使用するレプリケーションの競合の勝者にレプリケーションの競合の敗者になります。 オリジナルの勝者は、その後孤児を発生させずに削除されます。

このコードを実装するには、競合について少し理解する必要があります。 必ずしもノートには、紛争を決定する方法や注意事項勝者と敗者を決定する方法が、何が敗者にしないノートはありません。 つのフィールドは、敗者とみなさドキュメントに追加されます。 最初のフィールドは、$紛争と呼ばれ、空の文字列を含むテキストフ​​ィールドです。 このフィールドが存在するという事実は、おなじみの[ レプリケーションまたは競合を保存 ]を表示するノートへの指標であるビューのインジケータ

ロータスノーツは、競合敗者にない他のところは、$ REFフィールドを作成することにより、紛争の勝者への応答にすることです。 それは、ビュー内の競合の勝者と一緒に表示されますので、これが行われます。 あなたは通常の文書に戻って敗者を変えたいというような場合でも、このアソシエーションを削除する必要があります。 単に$ REFフィールドを削除したりすると、十分であるかもしれません。 オリジナルの勝者は、親ドキュメントであった場合、敗者のref($紛争と一緒に)$を削除すると、トリックを行います。 しかし、もし勝者は$コンフリクトを削除し、$ Refを保持する必要が敗者を維持するために、 応答ドキュメントそのものであったが、それが正しい親を指すようにしています。

競合の勝者に競合敗者をオンにする完全に汎用的なエージェントを構築するために、我々はオリジナルの勝者は、応答ドキュメントそのものであった可能性を考慮する必要があります。 また、エージェントを実行するユーザーは、ドキュメントが選択されたかを心配する必要はありませんしたい(彼らは元の勝者または元の敗者を選択するために知っておく必要があり - それらのいずれかを選択し、あるいは両方することが十分でなければなりません)。 また、エージェントはすべてを一度に複数のドキュメント上で実行できるようになります。 それではコードを見てみましょう:

エージェントを作成します。 エージェントは、アクションメニューから実行する必要があります。 (あなたは、それがエージェントのリストから実行し、必要に応じてそれをキックオフいくつかのボタンのどこかを持つことができます。) エージェントは、選択された文書で実行する必要があります。 最初は、いくつかの変数を確立しましょう​​。 これはかなり一般的なコードですので、議論されることはありません。

サブの初期化
新しいNotesSessionのように薄暗いセッション
NotesDatabaseクラスます。Dim DB as
NotesDocumentCollectionとしてDim collの
NotesDocumentのように薄暗いのdoc
NotesDocumentのように薄暗いnextDoc

DB = session.CurrentDatabaseを設定します。
コル= db.UnprocessedDocumentsを設定します。
ないcollのは、何もしない場合
= coll.GetFirstDocumentドキュメントを設定します。
docは何ですかではありませんが
= coll.GetNextDocument(DOC)nextDocを設定します。
ProcessDocumentコール(DB​​、DOC)
DOC = nextDocを設定します。
バン
終了する場合
End Subの

主なサブルーチンは、コレクション内のすべての文書(選択されたすべての文書)を通過し、それらを一つずつを処理します。 ユーザーが元の勝者(削除される)を選択している可能性がありますので、 "ProcessDocument"サブルーチンを呼び出す前に、次の文書へのハンドルを取得します。 すべての作業は、他のサブルーチンで発生します。

サブProcessDocument(NotesDocumentのようにNotesDatabaseクラスのDBは、doc)
NotesDocumentのように薄暗い勝者
NotesDocumentのように薄暗い敗者
NotesDocumentCollectionとして薄暗い子供
NotesDocumentのように薄暗い子
NotesDocumentのように薄暗い親

docは何もない場合は、サブ終了
doc.IsDeleted場合、サブ終了
doc.UniversalID = ""は、サブ​​終了した場合

勝者=何も設定しない
敗者=何も設定しない

場合doc.HasItem( "$紛争")
敗者= docを設定する
エラー時にResume Nextステートメント
勝者= db.GetDocumentByUNID(loser.ParentDocumentUNID)を設定します。
エラー後藤0で
その後、<> 0エラーの場合
= 0エラー
勝者=何も設定しない
終了する場合

勝者= docを設定する
子供= winner.Responsesを設定します。
ない子どもたちは、何もしない場合
= children.GetFirstDocument子を設定します。
ていない子は何もありませんが
その後、child.HasItemは( "$紛争")敗者=子を設定した場合
子= children.GetNextDocument(子)を設定します。
バン
終了する場合
終了する場合

勝者は何もないか、または敗者は何もない場合は、サブ終了

=何も親を設定します。
場合winner.HasItem( "$ REF")
エラー時にResume Nextステートメント
親を設定= db.GetDocumentByUNID(winner.ParentDocumentUNID)
エラー後藤0で
その後、<> 0エラーの場合
= 0エラー
Subプロシージャを終了する
終了する場合
終了する場合

コー​​ルloser.RemoveItem( "$の衝突")
コー​​ルloser.RemoveItem( "$ REF")
ていない親がNothingである場合loser.MakeResponse(親)を呼び出し
エラー時にResume Nextステートメント
loser.Saveを設定します(true、false)を呼び出す
winner.Remove(true)を呼び出す
エラー後藤0で
その後、<> 0エラーの場合
MsgBoxに "元の勝者を削除するエラー:"&エラー$ 16、 "エラー"
= 0エラー
終了する場合
End Subの

私たちが最初に渡された文書が有効であることを確認します。 ユーザーが元の勝者と敗者、元の両方を選択した場合は削除された文書で呼び出されるこの関数のチャンスがあるので、最初のパスで元の勝者は、データベースから削除されます。 したがって、渡され​​た文書が有効であることを確認してください。

次に、文書がオリジナルの勝者で、どれがオリジナルの敗者であるかを調べる。 渡されたドキュメントが$紛争と呼ばれるフィールドがある場合は、元の敗者であり、その親は元の勝者です。 渡された文書は、そのフィールドを持っていない場合、それはオリジナルの勝者で、元の敗者のためにその応答を検索します。 孤立したドキュメントまたは任意の応答を持っていない、渡された文書のようなエラーをトラップすることを確認してください。

オリジナルの勝者または敗者元のいずれかが検出されなかった場合は、サブルーチンを終了します。

オリジナルの勝者は、応答ドキュメントそのものである場合、次に見つける。 それは$ REFと呼ばれるフィールドがある場合、それは応答文書と勝者を見つけるために試みなければなりません。 オリジナルの勝者は孤立した(それはレスポンスだと言うが、親が見つからない)である場合、サブルーチンを終了します。

我々はこの時点で終了していない場合は、我々は元の勝者、敗者の元、オリジナルの勝者該当する場合の親を持っています。 勝者に敗者をオンにするには、オリジナルの勝者は、応答ドキュメントそのものであった場合は、$ Refをリセットし、$紛争と$ REFフィールドを削除します。 敗者の文書に変更を保存し、勝者の文書を削除します。 すべてのエラーをトラップし、エラーが発生した場合は、メッセージを与える。 可能性のあるエラーは、ユーザーが作成者であり、更新敗者の文書へのアクセスを持っていないということでしょうか、彼ら 、Lotus Notes データベースからの受賞者のドキュメントを削除する機能を持っていません。

さて、あなたは勝者にレプリケーションの競合の敗者を回すための一般的なエージェントを持っている必要があります。 勝者 、Lotus Notes データベースから削除されることに注意してください。 このエージェントの1つの可能な変化は、単に勝者に競合敗者を行い、勝者を削除しないことです。 データベース内のふたつの類似した文書とそこに終わるだろう。 2つの文書は同じ応答レベルであろうと、どちらも競合文書としてマークされます。 その後、手動で削除するかを決定するかもしれませんが、少なくとも何も変化が起こらないようにできないと考えられます。

2959視聴者が9856回アクセス

  1. コメントはまだありません。
  1. トラックバックはまだありません。