xpages:引用来自不同 database/application 的视图
xpages: referencing a view from a different database/application
我是 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);
它工作得很好 - 但我想修改代码以引用不同数据库中的视图。在 post 中,Brad 表示代码可以 "enhanced" 来完成此操作。但是我一直在试验和寻找一段时间,无法完成增强。
感谢您的帮助。
--丽莎&
在您的第二行中,您通过从组件 viewPanel1 拉取的 viewName 在视图上建立句柄。您的电话是 database.getView(viewName)。这相当于 NotesDatabase.getView() 的编程引用。如果您获得了要连接的其他数据库的句柄,则可以在该句柄上调用相同的 .getView() 调用。
首先,建立与其他数据库的连接;这是通过 session 关键字(这是一个 NotesSession)完成的,例如:
var extDB = session.getDatabase(dbName)
正如霍华德指出的那样,session 关键字是当前用户的会话,并且将作为该用户受所有 ACL rights/assignments/roles 约束。如果您需要提升权限以编程方式公开其他数据,您可以使用 sessionAsSigner 关键字(这也是一个 NotesSession,只需使用签名者、您自己的凭据,或者您可以将 NSF 签名为服务器 ID,以赋予它更高的权限)。
然后像往常一样使用 extDB 句柄代替 database 关键字(这与 session.getCurrentDatabase());像这样:
var vw = extDB.getView(viewName)
如果 NSF 中不存在同名的视图,NotesDatabase.getView() 调用将 return 为空,因此您需要确保它在那里并以编程方式检查并处理空 return.
[编辑]
由于您按原样使用 @function 的 @DbColumn ,因此使用 Frantisek Kossuth 建议的方法可能很容易,但依赖于在当前用户的 NotesSession 上。要覆盖该用户的(缺乏)权限并在单独的 NSF 中获得所有文档值的完全可见性,您仍然需要获取 the columnValues 上显示的视图的句柄,使用 sessionAsSigner 关键字。
[/编辑]
根据您的代码,您还需要在 @DbColumn
公式中指定数据库。
var letters = @DbColumn([database], viewName, colNum);
你可以阅读它 here or there...
除了记录的格式,您还可以使用 API 格式 "server!!database"
作为单个字符串值。
我是 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);
它工作得很好 - 但我想修改代码以引用不同数据库中的视图。在 post 中,Brad 表示代码可以 "enhanced" 来完成此操作。但是我一直在试验和寻找一段时间,无法完成增强。
感谢您的帮助。 --丽莎&
在您的第二行中,您通过从组件 viewPanel1 拉取的 viewName 在视图上建立句柄。您的电话是 database.getView(viewName)。这相当于 NotesDatabase.getView() 的编程引用。如果您获得了要连接的其他数据库的句柄,则可以在该句柄上调用相同的 .getView() 调用。
首先,建立与其他数据库的连接;这是通过 session 关键字(这是一个 NotesSession)完成的,例如:
var extDB = session.getDatabase(dbName)
正如霍华德指出的那样,session 关键字是当前用户的会话,并且将作为该用户受所有 ACL rights/assignments/roles 约束。如果您需要提升权限以编程方式公开其他数据,您可以使用 sessionAsSigner 关键字(这也是一个 NotesSession,只需使用签名者、您自己的凭据,或者您可以将 NSF 签名为服务器 ID,以赋予它更高的权限)。
然后像往常一样使用 extDB 句柄代替 database 关键字(这与 session.getCurrentDatabase());像这样:
var vw = extDB.getView(viewName)
如果 NSF 中不存在同名的视图,NotesDatabase.getView() 调用将 return 为空,因此您需要确保它在那里并以编程方式检查并处理空 return.
[编辑] 由于您按原样使用 @function 的 @DbColumn ,因此使用 Frantisek Kossuth 建议的方法可能很容易,但依赖于在当前用户的 NotesSession 上。要覆盖该用户的(缺乏)权限并在单独的 NSF 中获得所有文档值的完全可见性,您仍然需要获取 the columnValues 上显示的视图的句柄,使用 sessionAsSigner 关键字。 [/编辑]
根据您的代码,您还需要在 @DbColumn
公式中指定数据库。
var letters = @DbColumn([database], viewName, colNum);
你可以阅读它 here or there...
除了记录的格式,您还可以使用 API 格式 "server!!database"
作为单个字符串值。