BIRT报告在Web查看器中以相反的顺序处理网格

时间:2014-02-07 02:58:05

标签: birt

我有一个包含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层次结构中出现的顺序进行。任何人都知道我能做什么?

谢谢,

史蒂夫

3 个答案:

答案 0 :(得分:0)

预览和webviewer之间的主要区别在于,预览没有特定的渲染步骤。从技术上讲,当webviewer有两个不同的“运行”和“渲染”任务时,预览是一个“RunAndRender”任务。这就是为什么有时我们可以看到这种差异。

在描述问题时,似乎这个全局变量是在度量数据字段的“onRender”脚本中定义的,但是它来自“onCreate”“onPrepare”或来自元素表达式的契约。

无论如何要解决这个问题,你最好在onCreate脚本中设置这个全局变量并使其持久化,以确保它可以从onRender事件中使用。要创建全局var persistent,有两个选项:

报表变量:在大纲中创建报表变量,并将其与vars["myVariable"]一起使用

旧时尚:使用reportContext.setPersistentGlobalVariablereportContext.getPersistentGlobalVariable

答案 1 :(得分:0)

在onRender事件中进行计算通常不是一个好主意。

您应该将代码移动到onCreate事件。

答案 2 :(得分:0)

在阅读了此question中找到的有关Web查看器中生成阶段和呈现阶段之间差异的信息后,我改变了我的方法。

我在数据集的OnFetch触发器中创建了全局变量,这使得它们可以包含在我的报告的Contract部分中的数据元素中。

结果现在复制了预览器中生成的内容。