【问题标题】:Birt script behaves differently via web viewerBirt 脚本通过 Web 查看器的行为不同
【发布时间】:2012-08-28 13:19:11
【问题描述】:

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

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

【问题讨论】:

    标签: birt


    【解决方案1】:

    BIRT 有不同的“直接”输出脚本流和不同的 Web 查看器。有两个报告创建阶段:“生成”和“演示”,请参阅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 数据类型而言,这不是明显的特性)。

    【讨论】:

    • 感谢@jinowolski,帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多