BIRT在打开值列表之前参数错误



我有一个(半)基本数据立方体设置,具有状态和区域的级联参数。状态选择框和该区域也是直截了当的。当用户选择状态时,将相应设置区域选项。但是,区域的值是一长串字符串,将发送到MySQL Select语句,该语句将几次使用params(状态和字符串列表)几次使用。这是一个很大的工会集合。我的问题是在开始之前和查询时间之间。

//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语句不返回结果集对象。

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

  • 发生了一个Birt例外。评估JavaScript表达式的错误。脚本引擎错误:找不到方法java.lang.string.replace(string.java.lang.object [])。有错误评估脚本" this.queryText = this.querytext.replace('statelist',params ['lstates'']。value); this.queryText = this.queryText.replace。价值);"

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

似乎LStates被定义为"多值"参数,因此params [lstates']。值返回值数组:这就是为什么此替换方法不起作用的原因。

您应该尝试这样的尝试:

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

我不确定您在打开脚本之前在做什么,但是您的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存在许多问题。您可能想查看如何将参数设置为BIRT报告中的值列表?也有一些安全问题。当我必须在倍数上过滤时,通常在SQL运行后,我通常会在过滤器(数据集设计选项)中进行。认为,如果您的SQL返回大量值,这可能是资源问题。

感谢您的答复,但是由于我无法获得这些选项的工作,因此我结束了数据库的重组&SQL语句运行更好。要解决一些以前的建议:

@dom状态参数只有一个值,而在使用" in('statelist')"时,添加.join('',')的效率不是有效的(免责声明,而不是我的代码)确实抛出了一个特定于此的错误;我尝试了,MySQL/Birt似乎期待逗号分开的列表,但有一个带有尾随逗号的字符串。

@james我尝试使用问号(?)而不是'statelist'&" arealist",但我认为mysql/birt无法识别出哪个问号的价值……虽然不太确定,因为我无法很好地调试,并确切地找出了为什么。可能是我没有注意到的参数映射问题的形式。感谢您的帮助。

最新更新