Xpages 穿过一只著名的观鸟鸟

Xpages 穿过一只著名的观鸟鸟,xpages,lotus-notes,Xpages,Lotus Notes,我之前发布了其中的一部分,但我想我会用一个更完整的代码和问题开始一个新的线程。我试图在NotesViewNavigator中浏览这些类别,这就是我正在使用的代码。我已经把它降到了最低限度。sysOut只向服务器控制台写入一条消息。该视图选中了“不显示空类别” vw.setAutoUpdate(假); var nav:NotesViewNavigator=vw.createViewNav(); 导航设置选项(注:查看导航器.VN_ENTRYOPT_NOCOUNTDATA); 资产净值(400);

我之前发布了其中的一部分,但我想我会用一个更完整的代码和问题开始一个新的线程。我试图在NotesViewNavigator中浏览这些类别,这就是我正在使用的代码。我已经把它降到了最低限度。sysOut只向服务器控制台写入一条消息。该视图选中了“不显示空类别”

vw.setAutoUpdate(假);
var nav:NotesViewNavigator=vw.createViewNav();
导航设置选项(注:查看导航器.VN_ENTRYOPT_NOCOUNTDATA);
资产净值(400);
导航设置最大电平(0);
var rtn:java.util.TreeMap=new java.util.TreeMap();
var条目:NotesViewEntry=nav.getFirst();
var thisCat:java.util.Vector=new java.util.Vector;
试一试{
while(条目!=null){
WFSUtils.sysOut(“条目不为空”);
thisCat=entry.getColumnValues();
var thisCatString=thisCat.elementAt(0).toString()
WFSUtils.sysOut(“thisCat=“+thisCatString”);
rtn.put(此CATSTRING,“无”);
sysOut(“did put”+thisCatString)
变量tEntry:NotesViewEntry=nav.getNextCategory();
entry.recycle();
进入=第十天;
tEntry.recycle();
}
put(“vsCats”,rtn.keySet());
}捕获(e){
sysOut(“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(条目)处失败,因为找不到它或参数非法。如果我将其更改为just 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应该做什么。

删除该行

tEntry.recycle();
此recycle()会销毁您的
条目
,因为
条目
tEntry
都指向同一个Notes对象

从中删除参数

... nav.getNextCategory();

问题中显示的代码没有参数,但错误消息和注释告诉您有参数。

以下是我的结论。我需要做的是创建一系列嵌套的Reapeat控件,这些控件的功能非常类似于原生Notes类别。因此,顶级类别绑定到viewScope“vsCat1”,紧挨着“vsCat2”,最后一个绑定到“vsCat3”。此过程可以扩展到处理更多级别,但我通常会尝试将类别数保持在该级别以下。对于本例,三个类别是状态、发起人和流程。然后,我构建了三个视图,分别称为vwDocsByStatus、vwDocsByStatusOrig和vwDocsByStatusOrigProcess。每个视图中的第一列都已分类。byStatus视图只是一个按状态分类的视图,StatusOrig是Status+“~”+发起人,第三个Status是+“~”+发起人+“~”+进程。 第一次重复的集合名称为cat1、第二次cat2和第三次cat3。我下面的代码是一个JavaScript函数,我将把它移到一个Javabean中,但函数是相同的。因此,要加载“vsCat1”,我将调用setCategory(“vwDocsByStatus”),要加载“vsCat2”,我将调用setCategory(“VWDOCSBYStatourig”,cat1),它将加载vsCat2和cat1下的所有类别。调用setCategory(“vwDocsByStatusOrigProcess”,cat1+“~”+cat2)将在组合cat1~cat2下加载所有类别的vsCat3。限制是没有扩展所有类型的操作,但我发现在大多数情况下这是可以的。 然后在最后一次重复中,它被绑定到domino视图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
        }
    }
}

我已经在getNextCategory中发现了参数,但没有发现thr tEntry.recycle的含义。我现在的工作方式应该如此向前和向上。谢谢应该看到这一点。在其他人对代码有不同看法的情况下,向其他人展示代码始终是一种很好的做法,通常会立即看到问题,因为它不是自己的代码。没错,但我一个人坐在这里。谢谢你额外的开眼。这正是我的意思:在StAcQuobe上提一个问题是向其他人展示代码的好实践的一部分:-如果你只感兴趣的是获得分类的列表,你可以考虑使用<代码>树目录< /COD>而不是<代码> TreMeP。看起来你真的不需要地图。由于视图中的类别已经排序,您也可以只使用
列表
。克努特的回答为我解决了这个问题,有时你会看得太重以至于看不见。@马克,你为Xpages编写了应用程序范围文档锁定了吗?我得到了一份副本,但给我的人记不起它是从哪里来的。它看起来有点像你的代码类型。还有,如果是你的代码,有没有下载的地方?那不是我。可能是这个:看起来不是这样。
cat.indexOf(“~”)0
如果只包含一个“~”,例如“aaa~bbb”,则返回true。indexOf(“~”)将返回3。克努特我从代码中删除了一些注释并删除了条目=tmpentry,在上面对其进行了编辑。在我的例子中,除非我扩展到类别的4个级别,否则cat字符串中永远不会有多个“~”。所以这对我的情况有效,但可能需要做出改变,因为在某个地方我会