0

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

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

像这样的东西:

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


       Summary
       C1   2
       C2   1 

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

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

还有其他想法吗?

PS 用户宁愿不必使用 Excel 的小计功能。

4

2 回答 2

4

Bruce,让您的生活更轻松,并使用 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();
    ...
 }

其中键是字符串或向量。您需要注意数据类型。如果视图中的类别是数字,请确保您使用Number()您的密钥,否则它将不匹配。

于 2013-02-22T02:25:34.283 回答
0

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

装备Id[equipId1] 装备Id[equipId2] 。. 装备Id[装备Idx]

然后,在您循环浏览所有文档后,循环浏览您的设备 ID 对象值,就像您在上面的示例报告中一样。

循环遍历 javascript 对象: 如何循环遍历或枚举 JavaScript 对象?

对 javascript 对象 进行排序:按属性值对 JavaScript 对象进行排序

于 2013-02-22T01:15:47.010 回答