如何在XML数据源的BIRT报表中正确使用嵌套表格/列表并消除空行
BIRT报表嵌套列表/表格空行问题解决
问题场景
使用XML数据源构建BIRT报表,XML结构如下:
<invoice> <orders> <order> <order_no>1</order_no> <total_price>43</total_price> <items> <item name="name1" order_no="1"/> <item name="name2" order_no="1"/> </items> </order> <order> <order_no>2</order_no> <total_price>52</total_price> <items> <item name="name3" order_no="2"/> <item name="name4" order_no="2"/> </items> </order> </orders> </invoice>
已创建订单、商品两个独立数据集,在内部商品列表的动态文本中通过以下逻辑过滤关联父订单:
if(row["order_no"]==row._outer["order_no"]){ row["name"]; }
报表显示时,每个外部订单行下会出现多余空行,空行数等于外部表格总行数,示例效果:
------------------- |order|description| ------------------- | 1 |price: 43 | | |name1 | | |name2 | | | | ------------------- | 2 |price: 52 | | | | | |name3 | | |name4 | -------------------
解决方法
方法1:使用主从数据集(Master-Detail)关联
放弃独立数据集加动态文本过滤的方式,直接设置主从关系:
- 选中商品数据集,在数据集编辑器的参数标签页,添加参数
parent_order_no,参数值绑定到外部订单数据集的order_no字段 - 修改商品数据集的XML查询,添加过滤条件:
//item[@order_no=?],将参数parent_order_no绑定到该占位符 - 此方式下商品数据集只会返回当前订单对应的商品,不会生成多余空行
方法2:给内部列表行添加可见性规则
若需保留现有数据集结构,给内部列表的行添加隐藏规则:
- 选中内部列表的行,打开属性编辑器的可见性标签
- 设置表达式为:
row["order_no"] != row._outer["order_no"],勾选隐藏元素 - 不符合关联条件的行会直接隐藏,不会显示为空行
方法3:调整XML数据集查询语句
从数据源层面过滤无关数据,避免后续判断:
- 将商品数据集的查询语句改为:
//order[order_no=current()/order_no]/items/item,确保只获取当前订单下的商品 - 此方式无需额外动态文本判断,从根源消除空行
内容的提问来源于stack exchange,提问作者Grigor Vardanyan
相关产品推荐
相关产品推荐

