1

我对 xpages 很陌生。一段时间以来,我一直在网上搜索我的问题的答案。似乎答案应该很简单。

我一直在玩我从 Brad Balassaitis 的优秀 Xcellerent.net 站点获得的代码片段,该站点动态填充视图面板的“jumptoitems”列表。代码从 xpage 的 beforeRenderResponse 事件运行。

var viewName = getComponent('viewPanel1').getData().getViewName();
var vw = database.getView(viewName);
var colNum = 1;
var cols:Vector = vw.getColumns();
for (var i=0; i < cols.length; i++) {
    if (cols[i].isSorted() && !cols[i].isHidden()) {
        colNum = i + 1;
        break;
    }
}
var letters = @DbColumn(null, viewName, colNum);
var options = @Trim(@Unique(@UpperCase(@Left(letters, 1))))
viewScope.put('jumpToOptions', options);

它工作得很好——但我想修改代码以引用不同数据库中的视图。在帖子中,布拉德说可以“增强”代码来实现这一点。但我一直在试验和寻找一段时间,无法完成增强。

谢谢你的帮助。--丽莎&

4

2 回答 2

4

在您的第二行中,您通过从组件viewPanel1中提取的viewName建立视图的句柄。您的电话是database.getView(viewName)。这相当于 NotesDatabase .getView() 的编程引用。如果您获得了要连接的另一个数据库的句柄,则可以在该句柄上调用相同的.getView()调用。

首先,建立与其他数据库的连接;这是通过session关键字(即NotesSession)完成的,如下所示:

var extDB = session.getDatabase(dbName)

正如霍华德所指出的,该会话关键字是当前用户的会话,并将作为该用户受制于所有 ACL 权限/分配/角色。如果您需要提升权限以以编程方式公开其他数据,您可以使用sessionAsSigner关键字(这也是一个NotesSession,只需使用签名者本人的凭据,或者您可以将 NSF 签名为服务器 ID,以给它更高的权限)。

然后像往常一样使用您的extDB句柄代替database关键字(与session.getCurrentDatabase()大致相同);像这样:

var vw = extDB.getView(viewName)

如果 NSF 中不存在该名称的视图,则NotesDatabase.getView()调用将返回 null,因此您需要确保它存在并以编程方式检查并处理 null 返回。

[编辑] 由于您使用的是@DbColumn的移植@ 函数,因此使用 Frantisek Kossuth 建议的方法可能很容易,但依赖于当前用户的NotesSession。要覆盖该用户的(缺乏)权限并获得单独 NSF 中所有文档值的完全可见性,您仍然需要使用sessionAsSigner关键字获取如上所示视图的columnValues的句柄。[/编辑]

于 2015-05-20T14:15:00.293 回答
1

根据您的代码,您还需要在@DbColumn公式中指定数据库。

var letters = @DbColumn([database], viewName, colNum);

您可以在这里那里阅读它...除了文档格式之外,您还可以将 API 格式"server!!database"用作单个字符串值。

于 2015-05-20T14:31:24.870 回答