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\Data包含的development.dir文件E:\customers\stuff需要添加为路径development\shiny.nsf,但NotesDatabase.getFilePath会返回E:\customers\stuff\shiny. 所以看起来(?)我必须读取注册表以从 Notes.ini 中找到数据路径,然后根据文件路径检查它,当没有匹配项时,去寻找 dir 文件,直到找到匹配项。
接受更好的想法:-)

4

2 回答 2

3

我会将副本 ID 转换为server!!path-to-nsf格式。尝试首先使用 db.openByReplicaID("", repID) 获取本地数据库。如果失败,请尝试打开服务器上的数据库。

使用生成的对象构建server!!path-to-nsf字符串并改用它

于 2013-06-29T05:42:18.320 回答
3

更新:

根据Christian 的建议,将代码更改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 回答