Birt脚本通过web viewer表现出不同的行为

Birt脚本通过web viewer表现出不同的行为,birt,Birt,我无法通过网络运行birt报告。在html中运行时,报告的行为与预期一致,但某些脚本无法通过web viewer正常工作。我已经在报告的“初始化”阶段运行了这个脚本(我知道很多行不是必需的,只是想确保我排除了任何可能的脚本语法错误): 然后我在表行中运行了另一个小脚本,带有onRender触发: inc_number = row["Incident Number"]; grupo = row["Assigned Group"]; proveedor = row["Vendor Name"];

我无法通过网络运行birt报告。在html中运行时,报告的行为与预期一致,但某些脚本无法通过web viewer正常工作。我已经在报告的“初始化”阶段运行了这个脚本(我知道很多行不是必需的,只是想确保我排除了任何可能的脚本语法错误):

然后我在表行中运行了另一个小脚本,带有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 viewer运行时,所有计数都显示为0(可能是变量的默认值)。如果有人能在这方面给我一些帮助,我将非常感激。不知何故,我在单元格上运行了一些其他脚本,onRender也是,无论我选择的预览选项如何,这些脚本都可以正常工作


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

对于“直接”输出,BIRT有不同的脚本流;对于Web查看器,BIRT有不同的脚本流。有两个报告创建阶段:“生成”和“演示”,请参阅。在“直接”生成中,
onCreate
onRender
事件在生成阶段混合并一起触发(onCreate行1;onRender行1;onCreate行2;onRender行2等)<代码>初始化脚本先执行一次,然后执行全部

相反,Web Viewer分为生成和表示两个阶段:首先执行所有
onCreate
,然后几乎关闭报表(认为“所有脚本数据都丢失”),然后执行所有
onRender
<代码>初始化执行两次,第一次在生成阶段(onCreate)之前执行,第二次在演示阶段(onRender)之前执行
onRender
可能无权访问
row['…']
变量,但可以访问其报表元素属性,如
this.foo

最好在
onCreate
而不是
onRender
脚本中进行所有数据操作,因为脚本变量保持在一个一致的阶段。演示文稿,因为某些页面可能被复制(我不确定),所以在web viewer中在页面之间跳转时可能会产生错误的结果

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


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

谢谢@jinowolski,这帮了大忙!
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;
setPersistentGlobalVariable("name", value); //in generation phase
...
var value = getPersistentGlobalVariable("name"); //in presentation phase