BIRT显示按记录分组的数据

BIRT display data of groupped by record

在 BIRT 3.7.1 中,我有一个具有 1 级分层数据的 table。 所以记录有一个唯一的数字(键)和一个 parent 字段,它指的是数据集中的一个键。对于顶级记录,parent 字段为空。

 ---+------------+-------------+-----------+
|   |   Key      |   Parent    | Fields... |
+---+------------+-------------+-----------+
| 1 |     100    |             |   INFO    |
| 2 |     101    |        100  |   INFO    |
| 3 |     102    |        100  |   INFO    |
+---+------------+-------------+-----------+

当我在 parent 字段上添加一个组时,BIRT 将显示组中的顶级记录 (100),其中包含 parent 为空的所有记录以及组中的所有组元素标签下的parent:

 ---+------------+-------------+-----------+
|   |   Key      |   Parent    | Fields... |
+---+------------+-------------+-----------+
|   |            |             |           | <= group header
+---+------------+-------------+-----------+
| 1 |     100    |             |   INFO    |
+---+------------+-------------+-----------+
|   |     100    |             |           | <= group header
+---+------------+-------------+-----------+
| 2 |     101    |        100  |   INFO    |
| 3 |     102    |        100  |   INFO    |
+---+------------+-------------+-----------+

我想显示组 header 中顶级记录(即 'parent' 记录)的信息。

这可能吗?我知道您可以使用 row.__rownum 之类的东西,并且可以在 table 数据绑定中引用数据集或行。如果你想 link 数据集,你也可以使用 rows[0]['fieldName']。

有没有办法使用此信息获取顶级记录的数据?

我认为最简单的方法是为每个要显示的字段创建一个聚合:

在组 header 行中右击 -> 插入 -> 聚合。 Select 一个字段作为表达式,将 "First" 设置为聚合函数,"String" 或任何数据类型,当然 "group on" 属性 在 parent 上使用团体。

一种可能的方法(可能有更优雅的解决方案!)是基于脚本。在 onFetch 事件中,您可以使用 Key 列作为索引将记录添加到字典(报表变量)中。

准确地说,您不能直接使用记录AFAIK;相反,您必须复制其值。

假设您的报表变量名为 "rowDict".

在DataSet的beforeOpen事件中,你初始化rowDict

vars["rowDict"] = new java.lang.HashMap();

在DataSet的onFetch事件中,将当前记录的数据添加到rowDict:

var rec = new java.lang.HashMap();
rec.put("Info1", row["Info1"]);
// ... and so on for the other columns
vars["rowDict"].put(row["Key"], rec);

在 header 行中,您可以使用类似

的语法访问此数据
vars["rowDict"].get(row["Parent"]).get("Info1") 

请注意,在组的 header 行中,行指的是该组中的第一条记录。

我认为您在问题中显示的 BIRT 布局不太准确;您可能将数据项 "Parent" 从 "Parent" 列移动到 Table 布局项的 "Key" 列。

根据您使用的数据库,您也可以使用 SQL 来解决这个问题 - 这甚至可以更快,但需要更多思考。

注意:代码未经测试,但您明白了...