在视图导出中获取摘要计数?

时间:2013-02-21 21:00:18

标签: xpages

我需要将视图导出为ex​​cel。我已经在某处找到了一些代码,它在xpages中运行良好。现在,用户想要添加总计的摘要。我会解释一下。

我有一个包含用户名,项目ID和设备ID的文档。我需要做的是导出具有特定项目ID的所有文档,在导出中显示用户名和设备ID,但在导出视图后,显示类似设备ID的摘要总数。

这样的事情:

       User              Selected Equipment
       Jonh Smith        C1
       Salley Johnson    C2
       Fred Days         C1


       Summary
       C1   2
       C2   1 

我想要做的是首先使用项目ID的分类视图,然后使用sum列使用Equipment ID,从NotesViewEntryCollection执行getAllDocumentsByKey以获取所选项目的所有文档,然后利用类别行获取我的需要总数。但是当我只为getAllDocumentsByKey获取一个文档时。如果我删除了“设备”列并仅对“项目ID”进行了分类,那么我将获得所有预期的文档。

我的另一个想法是拥有一个可以存储在sessionscope变量中的对象,然后再使用getalldocumentsbykey对项目ID进行排序。该对象将具有设备ID变量和总数。当我通过视图工作时,我会更新当前设备ID的总数。然后在视图导出的最后jut导出这个sessionscope表。但由于我是javascript的新手,我真的不知道从哪里开始这个。这是正确的方向吗?如果是这样,有人可以让我开始吗?

还有其他想法吗?

P.S。用户宁愿不必使用Excel的Subtoal功能。

2 个答案:

答案 0 :(得分:4)

布鲁斯,让您的生活更轻松,并使用ViewNavigator。 ViewNavigator包含类别的条目,当您设置一个值来汇总该值在视图导航器中时。它还有从类别跳转到类别的方法,因此您可以阅读的数据更少。例如,我使用此函数从分类视图(一个或两个级别)获取摘要数据:

function getCategoryData(viewName, dataColumn, getChildren) {
    var v = database.getView(viewName);
    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;
 }

注意:它返回一个JSON字符串,而不是JSON对象。我需要字符串,所以你可能想改变它。您可以轻松修改该函数,以首先选择基于类别的子集:

function getCumulativeCategoryData(viewName, key, dataColumn, fetchChildren) {
var v = database.getView(viewName);

var nav = v.createViewNavFromCategory(key);
var ve = nav.getFirst();
    ...
 }

其中key是String或Vector。您需要对数据类型稍微小心。如果视图中的某个类别是一个数字,请确保您使用Number()作为密钥,否则将无法匹配。

答案 1 :(得分:0)

您在最后一段中处于正确的轨道,但您无需将值存储在会话范围中。一个标准的javascript对象就行了。假设您通过循环查看视图中的文档来生成报告,我认为最快最简单的解决方案是在循环遍历文档并将计数存储在对象中时计算每个设备ID:

equipId [equipId1] equipId [equipId2] 。 。 equipId [equipIdx]

然后,在浏览完所有文档后,按照上面的示例报告中的方式遍历设备ID对象值。

循环浏览javascript对象: How do I loop through or enumerate a JavaScript object?

对javascript对象进行排序: Sorting JavaScript Object by property value