我有一个(半)基本数据立方体设置与状态和区域的级联参数。状态选择框和区域一样直截了当;当用户选择状态时,相应地设置区域选项。但是,Area的值是一个很长的字符串列表,它将被发送到mysql select语句,该语句将使用params(State和来自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得到的两个错误是:
(非常明显)
(对我来说不太明显)
有什么想法吗?任何帮助将不胜感激。
答案 0 :(得分:3)
似乎LStates被定义为“多值”参数,因此params [“LStates”]。value返回一个值数组:这就是为什么这个替换方法不起作用。
你应该这样试试:
this.queryText = this.queryText.replace('stateList', params["LStates"].value.join("','"));
答案 1 :(得分:0)
我不确定你在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返回大量值,则认为这可能是资源问题。
答案 2 :(得分:0)
感谢您的回复,但由于我无法让这些选项工作,我最终重组了数据库& sql语句运行得更好。要解决以前的一些建议:
@dom states参数只有一个值,而使用“IN('stateList')”效率不高(免责声明,而不是我的代码),添加.join(',')确实抛出了一个特定的错误;我试过,mysql / BIRT似乎期待一个以逗号分隔的列表,但得到一个带有逗号的尾随字符串。
@James我尝试使用问号(?)代替'stateList'& 'areaList',但我认为mysql / BIRT无法识别哪个值带有哪个问号...不太确定,因为我无法调试得足够好并找出原因。可能是一个我没注意到的param映射问题的表单。谢谢你的帮助。