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 来解决这个问题 - 这甚至可以更快,但需要更多思考。
注意:代码未经测试,但您明白了...
在 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 来解决这个问题 - 这甚至可以更快,但需要更多思考。
注意:代码未经测试,但您明白了...