xpages:如何获取分类列的总和

时间:2016-08-05 09:27:43

标签: xpages

我有一个分类视图,第一列是分类和升序。最后一列计算总数。想象一下,视图名称被称为view1,它看起来如下所示:

1st column(categorized)  | 2nd column   | 3rd column (total)
Australia                |              |   2
                         |  Alex        |   1
                         |  Bill        |   1
Brazil                   |              |   3
                         |  Alan        |   1
                         |  Alice       |   1
                         |  Tom         |   1
Chile                    |              |   1
                         |  John        |   1
Denmark                  |              |   2
                         |  Susan       |   1
                         |  Tim         |   1
                         |              |   8

我想检索每个分类列的总数,例如,澳大利亚的总数是2,巴西的总数是3.我浏览互联网并编写一些代码,但结果不成功。

这是我的第一次尝试:我打算使用@DbLookup,for循环和@Count。

var value = sessionScope.Value;
var lookupValue = (@DbLookup(@DbName(),"view1",value,1));

for(var a = 0; a < lookupValue.length; a++)
{
  //try to display the lookupValue and the relevant total
   writer.write("<tr><td>"+lookupValue[a]+"<td> "+ @Count(lookupValue[a]) + "</td></tr>");  
}

当我运行代码时,我得到以下结果:

Australia 1
Australia 1
Brazil    1
Brazil    1
Brazil    1
Chile     1
Denmark   1
Denmark   1

第一次尝试后,我开始第二次尝试:(请注意,这部分中的大部分代码都来自互联网,我只是根据我的情况进行了一些修改)

var myView:NotesView = database.getView('view1');
var vec:NotesViewEntryCollection = myView.getAllEntries();
var viewEnt:NotesViewEntry = vec.getFirstEntry();

writer.write("<table>");
while (viewEnt != null)
{
   // try to retrieve the total in the 3rd column
    writer.write("<tr><td> "+ 'viewEnt.getColumnValues()[2]' +"</td></tr>");

    var tmp = vec.getNextEntry(viewEnt);
    viewEnt.recycle();
    viewEnt = tmp;
}
writer.write("</table>");
writer.endDocument();            

我运行代码,结果为空。我没有得到任何分类列。

我查看了尝试1和尝试2的代码,我不明白为什么我无法获得总数。

我再次在互联网上搜索,我发现了类似的帖子:Getting a summary count in a view export?

我尝试在应用程序中应用该解决方案:(请注意,此部分中的大部分代码都来自该帖子,我只是在函数中添加了视图名称)

function getCategoryData(viewName, dataColumn, getChildren) {
var v = database.getView(view1); // change viewName to view1
var nav = v.createViewNav();
var ve = nav.getFirst();
var isFirst = true;
var result = "[";
    while (ve) {
if (!ve.isTotal()) {
    var curData = ve.getColumnValues();
    if (!isFirst) {
        result += ",";
    }
    result += "{label : \"";
    result += curData[0];
    result += "\", value : ";
    result += curData[dataColumn];
    /* for 2 level categories we fetch additional data */
    if (getChildren) {
        var childve = nav.getChild();
        var firstChild = true;
        result += ", children : [";
        while (childve) {
            var childData = childve.getColumnValues();
            if (!firstChild) {
                result += ",";
            }
            result += "{label : \"";
            result += childData[1];
            result += "\", value : ";
            result += childData[dataColumn];
            result += "}";          
            firstChild = false;
            childve = nav.getNextSibling(childve);
        }
        result += "]"
    }
    result += "}";          
    isFirst = false;
}       
ve = nav.getNextSibling(ve);
}
result += "]";
return result;
 }

我运行代码,得到的结果如下:

[{label : "Australia", value : undefined},{label : "Brazil", value : undefined},{label : "Chile", value : undefined},{label : "Denmark", value : undefined}]

在第三次尝试之后,我认为我无法得到总数的原因是我误解了如何在视图中获得总数的概念。

实际上,我想要做的是获取view1中每个分类列的总和。因此,想象一下结果将如下所示:

Australia 2
Brazil    3
Chile     1
Denmark   2

实际上,我认为第一次尝试非常接近结果。我觉得我在代码中遗漏了一些东西(也许我想在for循环部分)。

如何在视图中获取每个分类列的总数?

感谢您对此问题的建议。非常感谢你。

1 个答案:

答案 0 :(得分:1)

第三次尝试你是在正确的轨道上。你肯定想使用NotesViewNavigator。

以下是基于您的要求的工作示例:

/*
 * @param viewName      Name of the view to navigate
 * @param labelColumn   Number of the column in the view containing the label
 *                      Note: column count start at 0
 * @param dataColumn    Number of the column in the view containing
 *                      totals. Note: column count starts at 0
 * @return              String representing a javascript array of objects containing label and value
 */
function getCategoryData(viewName, labelColumn, dataColumn) {
    var v:NotesView = database.getView(viewName);
    var nav:NotesViewNavigator = v.createViewNav();

    var ve:NotesViewEntry = nav.getFirst(); // first category
    var isFirst = true;
    var result = "[";

    while (ve) {

        var curData = ve.getColumnValues();

        if (curData[labelColumn] != "") { // skip the total at the bottom of the totals column
            if (!isFirst) {
                result += ",";
            }

            result += "{label : \"";
            result += curData[labelColumn];
            result += "\", value : ";
            result += curData[dataColumn];
            result += "}";   
        }

        isFirst = false;    
        var tmpentry:NotesViewEntry = nav.getNextCategory();
        ve.recycle();
        ve = tmpentry;
    }

    result += "]";

    nav.recycle();
    v.recycle();

    return result;
}

根据您的观点说明并假设您的观点名称为“国家/地区”,您可以将此功能称为:

getCategoryData("countries", 0, 2);

注意:我没有使用多个分类列测试此函数。