浏览NotesViewNavigator

时间:2014-08-25 19:11:17

标签: xpages lotus-notes

我之前发布了部分内容,但我认为我会启动一个代码和问题更完整的新线程。我试图浏览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应该做什么。

2 个答案:

答案 0 :(得分:2)

删除

tEntry.recycle();

此循环()会破坏您的entry,因为entrytEntry都指向同一个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
        }
    }
}