【问题标题】:BIRT Before Open value list params errorsBIRT 在打开值列表参数错误之前
【发布时间】:2014-02-07 02:45:20
【问题描述】:

我有一个(半)基本数据立方体,其中包含状态和区域的级联参数。状态选择框和区域一样直截了当;当用户选择一个州时,相应地设置区域选项。但是,Area 的值是一长串字符串,它将被发送到 mysql select 语句,该语句将多次使用这两个参数(状态和来自 Area 的字符串列表)。它是一个丑陋的 UNIONS 集合。我的问题是在开始之前和查询时间之间。

//beforeOpen script...LState & LAreas the name of the report param
this.queryText = this.queryText.replace('stateList', params["LStates"].value);
this.queryText = this.queryText.replace('areaList', params["LAreas"].value);


In my mysql statement I use them in the following way:
SELECT ..XXX..
FROM ..XXX..
WHERE ..XXX..
State.State_Location in ('stateList')
AND Range_Locator.Range in ('areaList')
UNION ALL
SELECT ..XXX..
FROM ..XXX..
WHERE ..XXX..
State.State_Location in ('stateList')
AND Range_Locator.Range in ('areaList')

我从 BIRT 得到的两个错误是:

(很明显)

  • 无法获取结果集。 org.eclipse....SQL 语句不返回 ResultSet 对象。

(对我来说不是那么明显)

  • 发生 BIRT 异常。评估 Javascript 表达式时出错。脚本引擎错误:找不到方法 java.lang.String.replace(string.java.lang.Object[])。 有错误评估脚本“this.queryText = this.queryText.replace('stateList', params["LStates"].value);this.queryText = this.queryText.replace('areaList', params["LAreas"] 。价值);”

有什么想法吗?任何帮助将不胜感激。

【问题讨论】:

    标签: birt


    【解决方案1】:

    似乎 LStates 被定义为一个“多值”参数,因此 params["LStates"].value 返回一个值数组:这就是这个替换方法不起作用的原因。

    你应该这样尝试:

    this.queryText = this.queryText.replace('stateList', params["LStates"].value.join("','"));
    

    【讨论】:

    • 这救了我:join(" ',' "));
    【解决方案2】:

    我不确定你在 beforeOpen 脚本中做了什么,但是你的 SQL 正在寻找字符串值 'stateList' 和 'areaList' 并且可能对 () 不满意。您需要使用问号来调用您在数据集设计中设置的“参数”中定义的参数。

    SELECT ..XXX..
    FROM ..XXX..
    WHERE ..XXX..
    State.State_Location in ?
    AND Range_Locator.Range in ?
    UNION ALL
    SELECT ..XXX..
    FROM ..XXX..
    WHERE ..XXX..
    State.State_Location in ?
    AND Range_Locator.Range in ?
    

    我不记得使用过

     in ?
    

    在任何查询中,我通常会尝试将其设置为使用

    like ?
    

    通过 BIRT 向 SQL 发送多项选择参数存在许多问题。你可能想看看How do I set a parameter to a list of values in a BIRT report? 还有一些安全问题。当我必须过滤多个时,我通常在 SQL 运行后在过滤器(数据集设计选项)中进行。如果您的 SQL 返回大量值,则认为这可能是资源问题。

    【讨论】:

      【解决方案3】:

      感谢您的回复,但由于我无法使这些选项起作用,我最终重组了数据库和 sql 语句以更好地运行。解决之前的一些建议:

      @dom states 参数只有一个值,并且在使用“IN ('stateList')”时效率不高(免责声明,不是我的代码)添加 .join(',') 确实引发了特定的错误;我试过了,mysql/BIRT 似乎期待一个逗号分隔的列表,但得到一个带有尾随逗号的字符串。

      @James 我尝试使用问号 (?) 而不是 'stateList' 和 'areaList' 但我认为 mysql/BIRT 无法识别哪个值与哪个问号...我无法很好地调试并找出确切原因。可能是我没有注意到的参数映射问题的一种形式。感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-06
        • 2012-01-23
        相关资源
        最近更新 更多