Java xpages:从其他数据库/应用程序引用视图

Java xpages:从其他数据库/应用程序引用视图,java,database,views,xpages,ssjs,Java,Database,Views,Xpages,Ssjs,我对xpages很陌生。我在网上搜索我的问题的答案已经有一段时间了。看来答案应该很简单 我一直在玩弄从Brad Balassaitis优秀的Xcellerent.net网站上获得的一段代码,该网站动态填充viewpanel的“jumptoitems”列表。代码从xpage的beforeRenderResponse事件运行 var viewName = getComponent('viewPanel1').getData().getViewName(); var vw = database.get

我对xpages很陌生。我在网上搜索我的问题的答案已经有一段时间了。看来答案应该很简单

我一直在玩弄从Brad Balassaitis优秀的Xcellerent.net网站上获得的一段代码,该网站动态填充viewpanel的“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);
var viewName=getComponent('viewPanel1').getData().getViewName();
var vw=database.getView(viewName);
var colNum=1;
var cols:Vector=vw.getColumns();
对于(变量i=0;i
它工作得很好-但是我想修改代码以引用不同数据库中的视图。在博文中,Brad说可以通过“增强”代码来实现这一点。但我已经尝试和搜索了一段时间,无法实现增强

谢谢你的帮助。
--Lisa&

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

首先,建立与其他数据库的连接;这是通过会话关键字(即a)完成的,例如:

var extDB = session.getDatabase(dbName)
正如Howard指出的那样,session关键字是当前用户的会话,并且作为该用户将受所有ACL权限/分配/角色的约束。如果需要提升权限以编程方式公开其他数据,可以使用sessionAsSigner关键字(这也是一个NotesSession,仅使用签名者、您自己的凭据,或者您可以将NSF作为服务器ID进行签名,以赋予其更高的权限)来实现此目的

然后像往常一样使用extDB句柄代替数据库关键字(与相同);像这样:

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

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

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

首先,建立与其他数据库的连接;这是通过会话关键字(即a)完成的,例如:

var extDB = session.getDatabase(dbName)
正如Howard指出的那样,session关键字是当前用户的会话,并且作为该用户将受所有ACL权限/分配/角色的约束。如果需要提升权限以编程方式公开其他数据,可以使用sessionAsSigner关键字(这也是一个NotesSession,仅使用签名者、您自己的凭据,或者您可以将NSF作为服务器ID进行签名,以赋予其更高的权限)来实现此目的

然后像往常一样使用extDB句柄代替数据库关键字(与相同);像这样:

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

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

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

var letters = @DbColumn([database], viewName, colNum);
你可以读到它或者。。。
除了文档格式之外,您还可以使用API格式“服务器!!数据库”
作为单个字符串值。

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

var letters = @DbColumn([database], viewName, colNum);
你可以读到它或者。。。
除了文档格式之外,您还可以使用API格式
“server!!database”
作为单字符串值。

再加上Eric的出色响应,如果您的用户没有访问其他数据库的权限,您可以使用sessionAsSigner根据签名者的XPage设计而不是登录的用户名进行访问。谢谢您的回答。这正是我所需要的。很高兴听到@LisaGerlich。如果您觉得足够,请接受答案。除了Eric的出色回答之外,如果您的用户没有访问其他数据库的权限,您可以使用sessionAsSigner根据签名者的XPage设计而不是登录的用户名获得访问权限。感谢您的回答。这正是我所需要的。很高兴听到@LisaGerlich。如果你觉得足够,请接受答案。