Birt脚本通过Web查看器表现不同

时间:2012-08-28 13:19:11

标签: birt

我无法通过网络运行Birt报告。在html中运行时,报告的行为与预期相同,但某些脚本无法通过Web查看器正常工作。我已经在报告的“初始化”阶段运行了这个脚本(我知道很多行都不是必需的,只是想确保我摆脱任何可能的脚本语法错误):

var inc_number;
var inc_number_old;
var contador;
var grupo;
var proveedor;
var contador_no_encaminadas;
var contador_encaminadas;
var contador_cerradas;
var estado;
var cliente_nombre;
var cliente_apellido;
contador = 0;
contador_no_encaminadas = 0;
contador_encaminadas = 0;
contador_cerradas = 0;
inc_number_old = 0;

然后我在桌面行中运行了另一个小脚本,onRender触发:

inc_number =  row["Incident Number"];
grupo = row["Assigned Group"];
proveedor = row["Vendor Name"];
estado = row["Status"];
cliente_nombre = row["First Name"];
cliente_apellido = row["Last Name"];

if (inc_number != inc_number_old){

    contador++;

    if (proveedor != null && grupo != "SIGMA")
        contador_encaminadas++;

    if ((proveedor == null || proveedor == "") && (grupo == "SIGMA") && (estado != "Resolved" && estado != "Closed"))
        contador_no_encaminadas++;

    if (estado == "Resolved" || estado == "Closed")
        contador_cerradas++;
}   

inc_number_old = inc_number;

vars["contador_cerradas"] = contador_cerradas;
vars["contador_incidencias"] = contador;
vars["contador_no_encaminadas"] = contador_no_encaminadas;
vars["contador_encaminadas"] = contador_encaminadas;

您可能已经注意到,所有这些只是用于显示不同的计数集。我在一个表中设置了一些数据字段来调用这个变量(前一个代码块的最后四行),因此报告显示了这个计数。好吧,当通过工作区中的预览选项卡运行或者在“运行”菜单中点击html选项时,所有这些都能很好地工作,但是当我尝试通过Web查看器运行它时,所有计数都显示0(可能是默认值)变量的值)。如果有人能在这方面给我一些帮助,我将非常感激。不知怎的,我已经在单元格上运行了一些其他脚本,onRender,无论我选择哪个预览选项,它都能正常工作。

P.S。我正在使用Birt v2.5.1,我知道它有点旧,但它是与BMC Remedy ARS集成的唯一支持版本,这就是我需要的。谢谢!

1 个答案:

答案 0 :(得分:3)

BIRT为“直接”输出提供了不同的脚本流程,对于Web Viewer有不同的脚本流程。有两个报告创建阶段:“生成”和“演示”,请参阅BIRT events flow diagrams。在“直接”生成中,onCreateonRender事件通过生成阶段(onCreate第1行; onRender第1行; onCreate第2行; onRender第2行等)混合并一起触发。 initialize脚本首先被执行一次。

相反,Web Viewer具有拆分生成和呈现阶段:首先执行所有onCreate,然后报告几乎关闭(认为“所有脚本数据都丢失”),然后执行所有onRenderinitialize执行两次,第一次是在生成阶段之前(onCreate),第二次是在呈现阶段之前(onRender)。 onRender可能无法访问row['...']个变量,但可以访问它的报告元素属性,例如this.foo

最好在onCreate而不是onRender脚本中进行所有数据操作,因为脚本变量保持在一个一致的阶段。演示文稿,对于某些页面可能被忽略(我不确定),因此当您在Web查看器中的页面之间跳转时,可能有错误的结果。

如果必须在生成阶段和演示阶段之间传递一些数据,则必须将其存储在持久性全局变量中:

setPersistentGlobalVariable("name", value); //in generation phase
...
var value = getPersistentGlobalVariable("name"); //in presentation phase

无需在报表设计器中定义该变量,只需使用上述功能即可。使用持久性全局变量时,只能遇到一个小陷阱 - 它们必须可以用Java进行序列化(对于某些Java数据类型来说,这不是一个明显的特性)。