1

IBM Lotus Notes 内の names.nsf データベースにアクセスする必要があるツールを開発しており、Lotus の連絡先 ID (従業員 ID) (この ID はユーザーによって提供されます) を使用して、個人 (名前) の完全な情報を取得します。 、位置、電話番号....)

Codeproject.com ( http://www.codeproject.com/Articles/18517/Lotus-Notes-Integration-with-Microsoft-NET-Platfor ) で例を見つけましたが、情報を取得するのに約 10 分かかります。この例ではそれが行われます (データベースには 5000 エントリ程度あります)。そのため、より高速な方法を探しています (実際にこれに Lotus Notes を使用すると、約 1 秒かかります!)。

ユーザーを何分も待たせずにこのタスクを達成する方法はありますか?

多分あなたはこれで私を助けることができると思いました。

4

4 に答える 4

1

使用しているサンプルは、次を使用してビューを通過します

NotesViewEntry viewEntry = notesViewCollection.GetNthEntry( rowCount );

これは、ビューの一番上からすべての反復に進み、n 番目のドキュメントに到達するまですべてのドキュメントを反復するため、使用する最悪の方法 (の 1 つ) です。

2 つのオプションがあります: 1) を使用してこのコードを最適化します。

NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();

そして最後に

viewEntry = notesViewCollection.GetNextEntry(viewEntry);

2)(私の謙虚な意見では、より良い方法です):コードを変更します:-最初の列がキー=>連絡先ID(従業員ID)でソートされたビューが必要です-次のようなコードでViewEntryにアクセスできます

LotusNotesView.GetEntryByKey( EmployeeID, true);
于 2013-01-22T16:49:52.667 に答える
1

運が良ければ、names.nsfは全文索引付けされています。そうでない場合は、全文索引を作成できるかどうかを尋ねることができます。インデックスが作成されると、次のように個人ドキュメントをすばやく取得できます。

LotusNotesView.FTSearch("[EmployeeID]=1234567", 1);
NotesDocument docPerson = LotusNotesView.GetFirstDocument();
于 2013-01-22T17:50:12.470 に答える
0

なぜユーザーに従業員IDの提供を求めているのですか?あなたは彼に彼のNotesユーザー名(FullNameまたはShortNameのいずれか)または彼の電子メールアドレスを提供するように頼むべきです。これらはいずれも、names.nsfの$ Usersビューで非常にすばやく検索できるため、必要なすべてのデータを含むドキュメントにすばやくアクセスできます。

注:一部の企業は、実際には、names.nsfのShortNameフィールドに従業員IDを入力していることを認識しています。組織の場合はNotesView、メソッドを使用してオブジェクトを開きNotesDatabase.getView()、NotesView.getDocumentByKey()メソッドを使用してユーザーのドキュメントを取得する必要があります。たとえば、次のようなものです。

NotesView usersView = namesDb.getView("$Users");
NotesDocument userDoc = usersView.getDocumentByKey(employeeId);

次に、関心のある情報フィールドごとにuserDoc.getItemValue()を使用して、必要なデータを読み取ります。実際にすべてをキャプチャしようとしている場合は、userdoc.Items配列全体をループする必要があります。内部使用価値の。

于 2013-01-22T19:16:49.387 に答える
0

GetNthEntry を使用すると、確かにパフォーマンスの問題が発生します。そのサイトから関連するコードを取得し、Lotus Notes でのすべてのビュー処理に推奨される GetFirst/GetNext パターンを使用するように書き直しました。

もちろん、これはテストされていないことに注意してください。ポイントは、コレクションの最初のエントリを取得し、それがオブジェクトであることを確認してから処理することです。ループの最後で次のエントリを取得し、null に到達するまで繰り返します。

    NotesViewEntryCollection  notesViewCollection = LotusNotesView.AllEntries;
    NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();

    while (viewEntry != null)
    {
        //Get the first document of particular entry.
        NotesDocument document =  viewEntry.Document;

        object documentItems = document.Items;
        Array itemArray1 = (System.Array)documentItems;

        for( int itemCount=0 ; itemCount< itemArray1.Length; itemCount++ )
        {
            NotesItem notesItem = 
            (Domino.NotesItem)itemArray1.GetValue( itemCount );

            //compare field value with specific value entered by user
            if( notesItem.Text !=null )
            {
                if( (notesItem.Text.ToUpper()).StartsWith( fieldValue ))
                {
                    Contact contact = new Contact();
                    for( int icount=0 ; icount< itemArray1.Length; icount++ )
                    {
                        NotesItem searchedNotesItem =
            (Domino.NotesItem)itemArray1.GetValue( icount );
                        string FieldName = searchedNotesItem.Name.ToString();
                        //For FirstName
                        if( searchedNotesItem.Name == "FirstName" )
                            contact.FirstName= searchedNotesItem.Text;

                        //For LastName
                        if( searchedNotesItem.Name == "LastName" )
                            contact.LastName = searchedNotesItem.Text;
                        //For Office Phone Number
                        if( searchedNotesItem.Name == "OfficePhoneNumber" )
                            contact.OfficePhoneNumber = searchedNotesItem.Text;

                        if( searchedNotesItem.Name  == "InternetAddress" )
                            contact.EmailId = searchedNotesItem.Text;

                    }//end for
                    contactsList.Add( contact );
                    break;
                }//End if
            }
        }

        //Get the nth entry of the selected view according to the iteration.
        NotesViewEntry viewEntry = notesViewCollection.GetNextEntry(viewEntry);        
    }
于 2013-01-22T16:46:20.210 に答える