2

次のようなカスタム コントロール上のデータ ソースを使用して、ローカルに (サーバー上ではなく) XPiNC でレプリケートされたアプリケーションがあります。

 <xp:dominoDocument var="document1"
                    formName="demo"
                    databaseName="#{javascript:getDemoData();}"
                    action="openDocument"
                    documentId="#{compositeData.unid}">
 </xp:dominoDocument>

私の JavaScript には次の関数があります。

    function getDemoData() {
         return "12345678:9ABEDEFF";
    }

それは私のデータを含むデータベースのレプリカIDを返します(実際のコードではハードコードされていませんが、構成から読み取られますが、それはここでは問題ではありません).

私の知る限り (これは間違っている可能性があります)、このレプリカ構文を提供するときにサーバー名を指定することはできません。これは偶然のゲームであることが判明しました。データベースがサーバー上で開かれることもあれば、クライアント上で開かれることもあります。これは、desktop8.dsk に基づいており、どのレプリケーション アイコンが一番上にあるのか (?) に基づいていると思います。

私の質問:
ローカル レプリカが利用可能な場合、ローカル レプリカが最初に開かれるようにするにはどうすればよいですか?

明確化:
ローカル マシン上の NotesDatabase.getFilePath() は、そのファイルの絶対ファイル パスを返します (サーバー上では相対パスです)。dirlink ファイルを使用すると、絶対パスは相対パスとはまったく似ていません。サンプル:C:\Notes\Datadevelopment.dir含むファイルでE:\customers\stuffは、パスとして追加する必要がありますdevelopment\shiny.nsfが、. どうやら (?) レジストリを読み取って Notes.ini からのデータ パスを見つけ、それをファイルパスと照合し、一致するものが見つからない場合は、一致するまで dir ファイルを探す必要があります。より良いアイデアを受け入れる:-)NotesDatabase.getFilePathE:\customers\stuff\shiny

4

2 に答える 2

3

アップデート:

クリスチャンによって提案されたようなものに基づいてsession.getDbDirectory()、より良い解決策に基づいてコードを変更しました。db.openByReplicaID()テストを追加しまし@ClientType() != 'Web'た。

このコードは、データベースのローカル レプリカを検索し、"!!filePath"データベースがローカルに存在するかどうかを返します。それ以外の場合は、 を返しますreplicaId

<xp:this.databaseName><![CDATA[#{javascript:
    var replicaId = getDemoData();
    if (@ClientType() != 'Web') {
        var db = session.getDatabase(null, null);
        try {
            if (db.openByReplicaID("", replicaId)) {
                return "!!" + db.getFilePath();
            }
        } catch (err) {
        }
    }
    return replicaId
}]]></xp:this.databaseName>

このコードは XPiNC とブラウザーで機能しますが、XPiNC のローカル レプリカのみを検索します。コードは、ローカル データベースまたはサーバー上のデータベースで実行できます。

于 2013-06-29T06:24:00.060 に答える