我有一个包含2个数据集的BIRT报告,返回单行名称和数字,以及返回合同类型和值的合同。
报告的布局是为了显示衡量标准,然后是合同和价值清单。我想做一个合同价值与措施的比率,整个事情看起来像:
MEASURE 1 --- 200
CONTRACT TYPE 1 --- 1000 --- 0.2
CONTRACT TYPE 2 --- 200 --- 1.0
CONTRACT TYPE 3 --- 400 --- 0.5
这是通过在报告布局中设置层次结构来完成的,如下所示:
+ Report Layout
++ Grid
+++ Table (bound to measure data set, has OnRender trigger that sets global variable for measure name and number)
++ Grid
+++ Table (bound to Contract Type data set)
++++ Cell
+++++ Bound data element with a formula that gets the global variable for the Measure and does the contract value / measure number math
当我从Eclipse设计器中的预览器运行报表时,这完全符合预期。
当我在网络浏览器上运行时,所有比率都是空白的。 所以我在OnRender触发器和公式中记录了全局变量的设置。
当我在预览器中运行时,我得到以下结果:
-- measure name global variable - Enrollment
-- measure value global variable - 14000
--- contract ratio cal get measure value -- 14000
--- contract ratio cal get measure value -- 14000
--- contract ratio cal get measure value -- 14000
--- (and so on, one for each contract type row returned.)
当我在网络浏览器中运行时,我得到以下结果
--- contract ratio cal get measure value -- null
--- contract ratio cal get measure value -- null
--- contract ratio cal get measure value -- null
--- (and so on, one for each contract type row returned.
-- measure name global variable - Enrollment
-- measure value global variable - 14000
换句话说,在预览器中,报表网格单元格和数据集的顶部先执行,而在Web查看器中,顺序相反。
我发现,执行应该按照它在设计器的Report Layout层次结构中出现的顺序进行。任何人都知道我能做什么?
谢谢,
史蒂夫
答案 0 :(得分:0)
预览和webviewer之间的主要区别在于,预览没有特定的渲染步骤。从技术上讲,当webviewer有两个不同的“运行”和“渲染”任务时,预览是一个“RunAndRender”任务。这就是为什么有时我们可以看到这种差异。
在描述问题时,似乎这个全局变量是在度量数据字段的“onRender”脚本中定义的,但是它来自“onCreate”“onPrepare”或来自元素表达式的契约。
无论如何要解决这个问题,你最好在onCreate脚本中设置这个全局变量并使其持久化,以确保它可以从onRender事件中使用。要创建全局var persistent,有两个选项:
报表变量:在大纲中创建报表变量,并将其与vars["myVariable"]
一起使用
旧时尚:使用reportContext.setPersistentGlobalVariable
和reportContext.getPersistentGlobalVariable
答案 1 :(得分:0)
在onRender事件中进行计算通常不是一个好主意。
您应该将代码移动到onCreate事件。
答案 2 :(得分:0)
在阅读了此question中找到的有关Web查看器中生成阶段和呈现阶段之间差异的信息后,我改变了我的方法。
我在数据集的OnFetch触发器中创建了全局变量,这使得它们可以包含在我的报告的Contract部分中的数据元素中。
结果现在复制了预览器中生成的内容。