【问题标题】:Aggregate child table values in Birt在 Birt 中聚合子表值
【发布时间】:2011-03-22 14:06:09
【问题描述】:

我有这个从另一个开发人员那里继承的 Birt 报告,它由一个主表中的一个子表组成。对于主表中的每一行,子表都会列出属于当前主行项目的项目。

这两个表来自不同的数据集,子表数据集采用一个参数,指示要获取其子项的主项。

现在,我需要在主表底部添加一个 SUM 聚合,显示子表中某个字段的总计(针对所有主项)。

例如,考虑以下数据:

MasterItem1
            ChildItem1 SomeValue
            ChildItem2 SomeValue
            ChildItem3 SomeValue
MasterItem2
            ChildItem1 SomeValue
            ChildItem2 SomeValue
            ChildItem3 SomeValue
--------------------------------
                       Total

(为什么不用分组来完成呢?简短的回答:实际上每个主行都有 两个 子表,包含不同的数字和类型的字段,所以以前的开发人员可能没有'不知道如何通过分组来实现这一点。)

起初我以为我可以简单地在 Total 字段中添加另一个子表,并汇总子数据集中的值。但是,这不起作用,因为子数据集需要一个参数来指示要获取其子项的主项,因此无法一次从子数据集中获取所有值。

我认为可能有一种方法可以创建直接引用子表中 SomeValue 字段的表达式,而不是通过子数据集。

非常感谢任何建议。

【问题讨论】:

    标签: birt


    【解决方案1】:

    应该可以在报告开头声明一个全局变量,然后在其中一个子表行事件中将每个子值添加到它,并在报告末尾输出它 - 如果您是编写 JavaScript 很舒服,这可能是最快的解决方案。

    如果您习惯于编写 Javascript(我不习惯)或者如果上述技术不起作用,您可以尝试:

    • 创建第三个​​数据集,将主报表中的主数据项与子报表中的子数据项合并,并在新数据表中输出总计,或
    • 通过联合合并现有的两个子数据值表(这样如果主表是A,主子表是B,子表是C,你就有AB联合AC),替换子表和现有的明细行和以子行类型为条件的新明细行,以及基于 AC 值的报表末尾的总计。

    显然,这些方法中的后者更复杂 - 但我认为它应该更容易理解和维护。

    【讨论】:

      【解决方案2】:

      全局变量是要走的路。对于子表中的每一行,将所需的值添加到全局变量中,然后访问它以在表底部显示。没有任何硬 JavaScript:

      var Sum = reportContext.getPersistentGlobalVariable( "RunningAggregate" );
      Sum = Sum + row["column Name"];
      reportContext.setPersistentGlobalVariable( "RunningAggregate", Sum );
      

      然后您可以通过动态文本项访问表格页脚中的全局变量。

      祝你好运!

      【讨论】:

        【解决方案3】:

        感谢 Mark 和 Mystik,你们的回答让我走上了正确的道路!

        我的最终解决方案如下:

        1) 在报表的初始化方法中声明 sum-variable:

        var total = 0;
        

        2) 将每一行的值添加到包含值的数据字段的 onReder 方法中的 sum-variable:

        total += parseInt(this.getValue());
        

        3) 在总字段中使用 sum-variable 作为表达式。

        像魅力一样工作。


        更新: 在我的解决方案中发现了一个错误:最后一行被排除在总和之外。我认为表格页脚中总单元格的值是在最后一行渲染之前定义的。

        修复:

        1. 将求和代码从 onRender 方法移至 onCreate
        2. 在total-cell的onRender方法中添加如下代码:

          this.setDisplayValue(total);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-04
          • 1970-01-01
          • 2015-10-29
          相关资源
          最近更新 更多