我之前发布了部分内容,但我认为我会启动一个代码和问题更完整的新线程。我试图浏览NotesViewNavigator中的类别,这是我正在使用的代码。我把它剥离到最低限度。 WFSUtils.sysOut只是将消息写入服务器控制台。视图已选中“不显示空类别”。
vw.setAutoUpdate(false);
var nav:NotesViewNavigator = vw.createViewNav();
nav.setEntryOptions(NotesViewNavigator.VN_ENTRYOPT_NOCOUNTDATA);
nav.setBufferMaxEntries(400);
nav.setMaxLevel(0);
var rtn:java.util.TreeMap=new java.util.TreeMap();
var entry:NotesViewEntry = nav.getFirst();
var thisCat:java.util.Vector = new java.util.Vector;
try{
while (entry != null){
WFSUtils.sysOut("Entry not null");
thisCat = entry.getColumnValues();
var thisCatString = thisCat.elementAt(0).toString()
WFSUtils.sysOut("thisCat = " + thisCatString);
rtn.put(thisCatString,"Nothing");
WFSUtils.sysOut("did put " + thisCatString)
var tEntry:NotesViewEntry = nav.getNextCategory();
entry.recycle();
entry = tEntry;
tEntry.recycle();
}
viewScope.put("vsCats", rtn.keySet());
}catch(e){
WFSUtils.sysOut("Error in getCategory " + e.toString())
}
当我运行此代码时,我在服务器控制台中获得以下内容。
25/08/2014 12:55:42 PM HTTP JVM: Entry not null
25/08/2014 12:55:42 PM HTTP JVM: thisCat = Approved~Bill Fox^WFS Automated Back end Process Example
25/08/2014 12:55:42 PM HTTP JVM: did put Approved~Bill Fox^WFS Automated Back end Process Example
25/08/2014 12:55:42 PM HTTP JVM: Error in getCategory Method NotesViewNavigator.getNextCategory(lotus.domino.local.ViewEntry) not found, or illegal parameters
在getNextCategory(条目)处未找到它或非法参数。如果我将其更改为getNext(条目),则控制台日志会显示:
25/08/2014 01:06:48 PM HTTP JVM: Entry not null
25/08/2014 01:06:48 PM HTTP JVM: thisCat = Approved~Bill Fox^WFS Automated Back end Process Example
25/08/2014 01:06:48 PM HTTP JVM: did put Approved~Bill Fox^WFS Automated Back end Process Example
25/08/2014 01:06:48 PM HTTP JVM: Entry not null
25/08/2014 01:06:48 PM HTTP JVM: Error in getCategory Exception occurred calling method NotesViewEntry.getColumnValues()
25/08/2014 01:06:48 PM HTTP JVM: null
所以在我看来,var条目在线上某处乱了。有趣的是getFirst工作,我的代码以我期望的方式运行,但getNext和getNextCategory似乎都不起作用。我在代码中遗漏了什么或者getNextCategory应该做什么。
答案 0 :(得分:2)
删除
行tEntry.recycle();
此循环()会破坏您的entry
,因为entry
和tEntry
都指向同一个Notes对象。
从
中删除参数... nav.getNextCategory();
您显示的代码没有参数,但错误消息和您的评论告诉您。
答案 1 :(得分:0)
这是我最终得到的结果。我需要做的是创建一系列嵌套的Reapeat控件,其功能与本机Notes类别非常相似。因此,顶级类别绑定到viewScope" vsCat1"," vsCat2"和#34; vsCat3"这个过程可以扩展到处理更多级别,但我通常会尝试将类别数量保持在下面。对于此示例,三个类别是Status,Originator和Process。然后我构建了三个视图,名为vwDocsByStatus,vwDocsByStatusOrig和vwDocsByStatusOrigProcess。每个视图中的第一列都是分类的。 byStatus视图只是Status的分类视图,StatusOrig是Status +"〜" +发起人和第三个状态+"〜" + Originator +"〜" +过程。 第一个重复的集合名称是cat1,第二个cat2和第三个cat3。我下面的代码是一个JavaScript函数,我将转移到JAVA Bean,但函数将是相同的。所以要加载" vsCat1"我会调用setCategory(" vwDocsByStatus","")来加载" vsCat2"我会调用setCategory(" vwDocsByStatusOrig",cat1),这将加载vsCat2与cat1下的所有类别。调用setCategory(" vwDocsByStatusOrigProcess",cat1 +"〜" + cat2)将加载vsCat3,其中所有类别都在cat1~cat2的组合下。限制是没有扩展所有类型的操作,但我发现在大多数情况下都可以。 然后在最后的重复中,它被绑定到多米诺骨牌视图vwDocsByStatusOrigProcess和cat1 +"〜"的列上的计算过滤器。 + cat2 +"〜" + cat3 每个重复都有一个展开/折叠按钮,用于设置一些viewScope变量以控制可见性,并使用适当的视图和cat值调用setCategory。更快的方法是从视图中获取列值,但不考虑读取器字段,因此返回可能具有一些不允许用户查看的类别值。我到目前为止的测试是,这是非常快的。 希望这对某人有所帮助,如果你能看到如何改进它,请随时提出建议
function setCategory(appView:String , cat:String){
/*Given a categorized view retrieve the a list of values and store that
* list in a viewScope variable "vsCat" + n where n = "1" if cat is null
* if cat contains one "~" n = 2 if cat conatins two "~" n = 3
*
*/
//get appDB and the view
try{
var vw:NotesView = appProps[sessionScope.ssApplication].appDB.getView(appView);
vw.setAutoUpdate(false);
var nav:NotesViewNavigator = vw.createViewNav();
nav.setEntryOptions(NotesViewNavigator.VN_ENTRYOPT_NOCOUNTDATA);
nav.setBufferMaxEntries(400);
nav.setMaxLevel(0);
}catch(e){
WFSUtils.sysOut("Error in setCategory - " + e.toString());
return "";
break;
}
try{
var rtn:java.util.TreeSet=new java.util.TreeSet();
var entry:NotesViewEntry = nav.getFirst();
if (cat.indexOf("~") > 0) {
n = 3;
}else if (cat == null || cat == ""){
n = 1;
}else {
n = 2;
}
var catArray:Array = cat.split("~");
var thisCat:Array = new Array;
while (entry != null && !entry.isTotal()) {
thisCat = entry.getColumnValues();
var temp:String = thisCat[0].toString();
thisCat = temp.split("~");
if (typeof thisCat === "string"){
thisCat = [thisCat];
}
switch (n){
case 1 :
if (!rtn.contains(thisCat[0])){
rtn.add(thisCat[0]);
}
break;
case 2 :
if (cat == thisCat[0]){
if (thisCat[1] != null){
if (!rtn.contains(thisCat[1]))rtn.add(thisCat[1]);
}
}
break;
case 3 :
if (cat == thisCat[0] + "~" + thisCat[1]){
if (thisCat[2] != null){
if (!rtn.contains(thisCat[2]))rtn.add(thisCat[2]);
}
}
break
}
var tmpentry:NotesViewEntry = nav.getNextCategory();
entry.recycle();
entry = tmpentry;
}// end while
// set the viewScope variable
vw.setAutoUpdate(true);
viewScope.put("vsCat" + n.toString(),rtn);
}catch(e) {
WFSUtils.sysOut("Error in setCategory - " + e.toString());
}finally{
try{
WFSUtils.recycleObjects([nav, entry, tmpEntry]);
}catch (e) {
//do nothing caused by undefined object shouldn't happen
}
}
}