0

少し前に、C# を使用してまったく別のプログラムを自動化するプログラムを作成しましたが、Lotus Notes データベースのデータにアクセスする必要があることがわかりました。唯一の問題は、(session.GetDatabase() を使用して) サーバーの名前でデータベースを開く方法しか理解できないように見えることです... レプリカ ID でデータベースを開く方法がわかりません。誰かが私がそれについてどうするか知っていますか? (サーバーが変更されるたびにプログラムがダウンするのは望ましくありません。)

public static string[] GetLotusNotesHelpTickets()
{
    NotesSession session = new NotesSession();
    session.Initialize(Password);
    // 85256B45:000EE057 = NTNOTES1A Server Replica ID
    NotesDatabase database = session.GetDatabase("NTNOTES1A", "is/gs/gshd.nsf", false);
    string SearchFormula = string.Concat("Form = \"Call Ticket\""
                                    , " & GroupAssignedTo = \"Business Systems\""
                                    , " & CallStatus = \"Open\"");
    NotesDocumentCollection collection = database.Search(SearchFormula, null, 0);
    NotesDocument document = collection.GetFirstDocument();
    string[] ticketList = new string[collection.Count];

    for (int i = 0; i < collection.Count; ++i)
    {
        ticketList[i] = ((object[])(document.GetItemValue("TicketNumber")))[0].ToString();
        document = collection.GetNextDocument(document);
    }

    document = null;
    collection = null;
    database = null;
    session = null;

    return ticketList;
}

このコードは問題なく動作していますが、サーバーが NTNOTES1A から変更された場合、何も機能しなくなります。

4

2 に答える 2

2

notesDbDirectory.OpenDatabaseByReplicaID(rid$) メソッドを使用する必要があります。NotesDbDirectory を取得するには、セッションの getDbDirectory メソッドを使用できます。

Set notesDbDirectory = notesSession.GetDbDirectory( serverName$ )

したがって、以下のコードを使用して、レプリカ ID でデータベースを取得できます。

public static string[] GetLotusNotesHelpTickets()
{
    NotesSession session = new NotesSession();
    session.Initialize(Password);

    Set notesDBDirectory = session.GetDbDirectory("NTNOTES1A")
    // 85256B45:000EE057 = NTNOTES1A Server Replica ID
    NotesDatabase database = notesDBDirectory.OpenDatabaseByReplicaID("85256B45:000EE057")
    string SearchFormula = string.Concat("Form = \"Call Ticket\""
                                    , " & GroupAssignedTo = \"Business Systems\""
                                    , " & CallStatus = \"Open\"");
    NotesDocumentCollection collection = database.Search(SearchFormula, null, 0);
    NotesDocument document = collection.GetFirstDocument();
    string[] ticketList = new string[collection.Count];

    for (int i = 0; i < collection.Count; ++i)
    {
        ticketList[i] = ((object[])(document.GetItemValue("TicketNumber")))[0].ToString();
        document = collection.GetNextDocument(document);
    }

    document = null;
    collection = null;
    database = null;
    session = null;

    return ticketList;
}

残念ながら、これは問題の半分しか解決しません。DBLink やブックマークをクリックしたときにノーツ クライアントが行うように、クライアントに最も近いサーバーから特定のレプリカ ID を持つデータベースをフェッチするようにノーツに指示したいことはわかっています。ただし、Notes API を使用してそれを行う方法はありません (またはないように見えます)。

私の提案は、潜在的なサーバーのハードコーディングされたリストを名前でループし、データベースが見つかるかどうかを確認することです (データベースが見つからない場合、OpenDatabaseByReplicaID メソッドは ERR_SYS_FILE_NOT_FOUND (エラー 0FA3) を返します)。それが適切でない場合は、アプリの管理メニューでサーバー名を簡単に公開して、サーバー名がある時点で変更された場合に簡単に変更できるようにすることができます。

于 2009-09-11T17:27:28.517 に答える
1

set database = new NotesDatabase("") call database.OpenByReplicaID("repid")

于 2009-11-10T02:26:01.220 に答える