Eclipse 4.3.1中Birt主页脚动态设值失效问题(Maximo 7.6.1.1环境)
Maximo 7.6.1.1 + Birt 4.3.1 动态页脚实现方案
旧教程失效原因
2013年的教程对应Birt 3.x/4.2及更早版本,从Birt 4.3版本开始,主页面的事件触发逻辑做了核心调整:你自行创建的非继承主页面的页面级onPageStart/onPageEnd事件,默认仅会在主页面模板初始化时触发一次,不会随报表每一页生成分次触发,这是页面变量更新逻辑失效的根本原因。
同时你直接在页脚添加数据元素不更新的问题,是因为Birt的页脚渲染优先级早于当前页数据集的遍历渲染,直接绑定数据集的元素只会拿到初始化阶段的取值,不会随数据更新同步变动。
可行替代方案
- 方案1:全局变量+数据集/分组事件联动
- 在报表根节点的「脚本」选项卡中声明全局变量,示例代码:
reportContext.setGlobalVariable("currentRelateText", "默认文本"); reportContext.setGlobalVariable("targetFieldValue", "");- 找到取数对应的数据集,在
onFetch事件中编写更新逻辑,每取一行数据就刷新全局变量取值;如果是按分组分页的场景,可搭配分组的onGroupStart/onGroupEnd事件做触发 - 在页脚添加动态文本元素,表达式直接引用全局变量即可:
reportContext.getGlobalVariable("currentRelateText") + " " + reportContext.getGlobalVariable("targetFieldValue") - 方案2:使用内置页面变量适配分页逻辑
如果需要严格按分页维度取值,可直接调用Birt内置的页面变量,无需自定义事件:
取当前页码写pageNumber,总页码写totalPage;如果要取当前页对应的数据字段,先在数据集的「输出列」设置中把目标字段勾选「可用于页面级引用」,再在页脚动态文本中写reportContext.getPageVariable("目标字段名")即可。 - 方案3:适配Maximo预置扩展控件
Maximo 7.6.x对Birt做了自定义扩展,原生支持动态页脚能力:在「Palette」面板的「Maximo Report Controls」分类下找到Custom Page Footer控件,直接绑定需要展示的字段后,系统会自动适配分页逻辑同步更新内容。
注意:如果你的报表需要支持Maximo的多语言翻译,所有页脚静态文本需要通过
mxreport.getMessage("文本键值")方法调用Maximo的消息字典,不要直接写死文本内容。
内容的提问来源于stack exchange,提问作者kishjeff
相关产品推荐
相关产品推荐

