BIRT中基于其他数据集值过滤行仅显示首行的问题求助
BIRT行隐藏仅显示第一行的问题解决思路
嗨Michel,我来帮你捋清楚这个问题的原因和解决办法~
首先说下你当前方法的问题:你直接用(dataset, preferences)row._outer["type"] != (dataset, posts)row["type"]来判断行隐藏,BIRT默认只会拿posts的当前行和preferences数据集的第一行做对比,不会自动遍历整个preferences数据集去匹配所有类型。所以当posts里的行type是A时,和preferences第一行的A相等,就显示;后面的行比如type=C,和preferences第一行的A不相等,就被隐藏了,这就是为什么只显示第一行的原因。
下面给你几个可行的解决思路:
方法一:数据源层面直接过滤(最推荐)
直接在数据库查询阶段就完成过滤,效率最高,也不用在报表里做复杂的脚本处理。你可以给posts数据集的SQL加上IN子查询,直接关联偏好数据集:
SELECT ID, Name, type FROM posts WHERE type IN (SELECT column_type FROM preferences)
这样查询出来的posts数据集本身就是符合用户偏好的类型,不需要再设置行隐藏,一步到位。
方法二:用全局变量存储偏好类型,再做匹配
如果没办法修改SQL,那可以通过BIRT脚本把所有偏好类型存到一个全局列表里,再检查帖子类型是否在列表中:
存储偏好类型到全局变量:
打开preferences数据集的Fetch事件,添加以下脚本:// 初始化全局列表(只执行一次) if (!reportContext.getGlobalVariable("preferredTypes")) { reportContext.setGlobalVariable("preferredTypes", new java.util.ArrayList()); } // 把当前行的偏好类型加入列表 reportContext.getGlobalVariable("preferredTypes").add(row["column_type"]);修改行隐藏表达式:
回到posts数据集的行隐藏属性,把表达式改成:!reportContext.getGlobalVariable("preferredTypes").contains(row["type"])这个表达式会检查当前帖子的type是否在全局的偏好类型列表中,不在的话就隐藏该行,这样就能正确匹配所有偏好类型了。
方法三:使用BIRT数据集过滤功能
你也可以直接给posts数据集设置过滤条件:
- 打开
posts数据集的Filters选项卡,点击Add添加过滤规则 - 选择
type字段,操作符选IN,然后在值的部分选择preferences数据集的column_type字段 - 确保
preferences数据集的执行顺序在posts之前(可以在报表的Data Explorer里调整数据集的顺序)
额外注意事项
- 如果你偏好数据集中有重复的类型值,可以在存储全局列表的时候做去重处理,比如用
HashSet代替ArrayList,避免重复检查:if (!reportContext.getGlobalVariable("preferredTypes")) { reportContext.setGlobalVariable("preferredTypes", new java.util.HashSet()); } - 一定要保证
preferences数据集先执行,否则全局变量会是空的,过滤就失效了。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

