1

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

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

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

例如,考虑以下数据:

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

(为什么不使用分组来完成呢?简短的回答:实际上每个主行都有两个子表,包含不同的数字和类型的字段,所以以前的开发人员可能没有找到一种方法来完成这个分组。)

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

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

非常感谢任何建议。

4

3 回答 3

3

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

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

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

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

于 2010-07-29T10:09:58.143 回答
3

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

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

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

祝你好运!

于 2010-07-30T15:51:28.147 回答
2

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

我的最终解决方案如下:

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

var total = 0;

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

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

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

奇迹般有效。


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

使固定:

  1. 将求和代码从 onRender 方法移至 onCreate
  2. 在总单元格的 onRender 方法中添加了以下代码:

    this.setDisplayValue(total);

于 2010-08-02T08:12:07.533 回答