我有一个XPiNC本地复制(不在服务器上)应用程序,在自定义控件上有一个数据源,如下所示:
<xp:dominoDocument var="document1"
formName="demo"
databaseName="#{javascript:getDemoData();}"
action="openDocument"
documentId="#{compositeData.unid}">
</xp:dominoDocument>
在我的JavaScript中,我有以下功能:
function getDemoData() {
return "12345678:9ABEDEFF";
}
返回包含我的数据的数据库的replicaID(在实际代码中,它不是硬编码的,而是从配置中读取,但这不是问题)。
据我所知(可能有问题),在提供此副本语法时,我无法指定服务器名称。事实证明这是一场机会游戏。有时数据库在服务器上打开,有时在客户端上打开。我认为这是基于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文件,直到我找到匹配。
向更好的想法开放: - )
答案 0 :(得分:3)
我会将副本ID转换为 server !! path-to-nsf 格式。尝试使用db.openByReplicaID(“”,repID)获取本地数据库。如果失败,请尝试在服务器上打开数据库。
生成的对象构建 server !! path-to-nsf 字符串并使用此字符
答案 1 :(得分:3)
更新
根据session.getDbDirectory()
更改了代码,以更好地解决基于Christian 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查找本地副本。代码可以在服务器上的本地数据库或数据库中运行。