在Birt中聚合子表值

时间:2010-07-29 08:02:58

标签: birt

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

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

现在,我需要做的是将SUM聚合添加到主表的底部,显示子表中某个字段的总数(对于所有主项)。

例如,考虑以下数据:

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

(为什么这不是用分组来完成的?简答:实际上每个主行有两个子表,包含不同的数字和字段类型,所以以前的开发人员可能没有找出通过分组来实现这一目标的方法。)

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

我想可能有办法创建一个直接引用子表中SomeValue字段的表达式,而不是通过子数据集。

任何建议非常赞赏。

3 个答案:

答案 0 :(得分:3)

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

如果你 不能轻松地编写Javascript(我不是),或者如果上述技术无效,你可以尝试:

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

显然,后一种方法更为复杂 - 但我认为应该更容易理解和维护。

答案 1 :(得分:3)

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

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

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

祝你好运!

答案 2 :(得分:2)

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

我的最终解决方案如下:

1)在报告的initialize方法中声明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(总);