2

我无法通过网络运行 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 也是,无论我选择哪个预览选项,它们都可以正常工作。

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

4

1 回答 1

3

BIRT 对“直接”输出有不同的脚本流,对 Web 查看器有不同的脚本流。有两个报告创建阶段:“生成”和“呈现”,请参阅BIRT 事件流程图。在“直接”生成中onCreateonRender事件通过生成阶段(onCreate row 1 ; onRender row 1 ; onCreate row 2 ; onRender row 2 等)混合并触发。initialize首先,脚本执行一次。

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

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

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

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

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

于 2012-08-28T18:27:20.547 回答