1

ソース NSF から宛先 NSF にドキュメントをコピーするアプリケーションを C# で作成しました。宛先 NSF は、ソース NSF に基づいて、すべての設計要素を保持する空のシェルです。Lotus Notes 8.5.3 を使用していますが、Domino サーバーに接続していません。

このアプリケーションを使用して、ソース NSF を小さなチャンクに分割します。目標は、自動化された (eDiscovery) システムによって効果的に処理できる宛先 NSF を作成することです。できるだけ多くのメタデータが保持されるようにする必要があります。

私の既存のコードは、(1) フォルダー情報を失うことを除いて、これらの目標を満たしています。ドキュメントをコピーすると、すべてのフォルダが空になります。(2) すべてのドキュメントは、ソースで未読であっても、既読としてマークされます。

コード C#

//Establish session
NotesSession ns = new Domino.NotesSessionClass();
ns.Initialize("");

//Open source NSF
NotesDatabase nd = ns.GetDatabase("", "test.nsf", false);
//Open destination NSF.
//Assume that all design elements of nd2 are identical to those of nd
NotesDatabase nd2 = ns.GetDatabase("", "test2.nsf", false);

//Create view that returns all documents.
NotesView nView2 = nd.GetView("$All");
nd.CreateView("All-DR", "SELECT @ALL", nView2, false);
NotesView nView = NotesConnectionDatabase.GetView("All-DR");

//Loop through entries in the new view
NotesViewEntry nvec = nView.AllEntries;
nve = nvec.GetFirstEntry();

for (int j = 1; j <= intEntryCount; j++)
{
     if (j == 1)
     {
          nve = nvec.GetFirstEntry();
     }
     else
     {
          nve = nvec.GetNextEntry(nve);
     }

     //Copy document to second database.
     NotesDocument ndoc = nd.GetDocumentByUNID(nve.UniversalID);         
     ndoc.CopyToDatabase(nd2);
 }
 //End loop.
 //All documents are copied.

その結果、すべてのドキュメントがコピーされた宛先 NSF が作成されます。すべてのフォルダーもそこにあると仮定します。ただし、どのドキュメントもフォルダにありません。すべてのドキュメントが既読としてマークされます。

フォルダーと未読の問題を修正するにはどうすればよいですか?

4

2 に答える 2

5

FolderReferencesバックエンド クラスの NotesDocument クラスにはプロパティがあります。そのプロパティが COM クラスと C# の相互運用性で公開されているかどうかは 100% わかりませんが、公開されている場合は、メソッドと一緒に使用してPutInFolder()問題の一部を解決できます。

既読/未読マークに関する限り、重要な問題は、自分自身の既読/未読ステータスのみに関心があるのか​​、それともデータベースのすべてのユーザーに対してそれを保持しようとしているかということです。自分の未読マークだけを気にする場合getAllUnreadDocuments()は、クラスのメソッドを使用できるかもしれませんNotesDatabaseが、これには Notes/Domino 8 以降 (コードが実行されているマシン上) が必要です。このメソッド (またはNotesNoteCollectionそれが返すクラス) が C# の COM/相互運用インターフェイスを介して公開されているかどうかを確認してください。利用可能な場合は、コレクションを反復処理してMarkUnread()メソッドを使用できます。すべてのユーザーの未読マークを気にする場合、それを行う方法があるかどうかはわかりませんが、ある場合は、Notes C API からの呼び出しを使用する必要があります。

于 2013-02-08T01:22:01.053 に答える
2

特にデータベースがFolderReferencesが機能するように設定されていない場合、フォルダーへの移動に関する別の考え:

NotesDatabase オブジェクトの Views プロパティから取得した NotesView オブジェクトの配列を反復処理できます。各 NotesView には、それがフォルダかどうかを示すプロパティがあります。

すべてのフォルダーを把握したら、各フォルダー内で反復処理を行い、含まれている NotesDocuments のリストを収集できます。次に、この情報をディクショナリに保存することで、各ドキュメントを処理してどのフォルダに配置する必要があるかを決定する際に、これをルックアップとして使用できます。

このようなもの(テストされていません):

object oViews = nd.Views;
object[] oarrViews = (object[])oViews;
Dictionary<string, List<string>> folderDict = new Dictionary<string, List<string>>();
for (int x=0; x < oarrViews.Length - 1; x++)
{
    NotesView view = viewArray[x];
    if (view.IsFolder) 
    {
        NotesDocument doc = view.GetFirstDocument();
        while (doc != null)
        {
            // Populate folderDict Dictionary by setting
            // document's UNID as Key, and adding folder name to List
        }
    }
}

次に、ループで:

//Copy document to second database.
NotesDocument ndoc = nd.GetDocumentByUNID(nve.UniversalID);  
NotesDocument newDoc = ndoc.CopyToDatabase(nd2);

if (folderDict.ContainsKey(nve.UniversalID)) {
    foreach (var folderName in folderDict[nve.UniversalID]) {
        newDoc.PutInFolder(folderName, true);
    }
}       
于 2013-02-08T01:55:03.430 に答える