我在spagoBI工作室用 multi_value参数做了一个birt报告,它在工作室中运行良好。 但是当我将它上传到服务器时,它的执行会给出一个空白页面。 请别人帮帮我。
答案 0 :(得分:1)
问问问题已经过了几年但是我想我会发表这个问题的经验,因为它可能会帮助其他人。
问题是由于参数字符串中的每个值都用单引号括起来,所以在报表的sql where语句中没有满足where条件。
因此,如果您使用的是Postgresql,请参阅:https://www.spagoworld.org/jforum/posts/list/382.page。然而,如果像我一样你使用MySQL那么所有的乐趣和游戏开始,因为MySQL没有准备好使用regxp_split_to_table函数!对我有用的是使用临时表和存储过程来返回报表数据集。然后我在报告的queryString中调用了该过程。
以下是我采取的步骤:
创建一个函数,从多值字符串中拆分每个参数并删除单引号:
创建DEFINER = root
@ localhost
功能SPLIT_STR
(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)RETURNS varchar(255)CHARSET utf8
返回替换(SUBSTRING(SUBSTRING_INDEX(x,delim,pos),
LENGTH(SUBSTRING_INDEX(x,delim,pos -1))+ 1),
delim,'')
创建一个存储过程,将参数作为结果集返回,可以通过sql($ P {parameter})语句中的sql进行匹配。这里的技巧是获取拆分并清理参数并将其插入临时表中,然后可以在随后的返回数据集的select语句中查询该表。我的存储过程如下:
CREATE DEFINER = root
@ localhost
程序create_temp_breweries
(fullstr varchar(255),startDate date,endDate date,outlet_Type varchar(255))
BEGIN
DECLARE INT默认值为0;
DECLARE b INT默认值0;
DECLARE str VARCHAR(255);
DECLARE outletStr VARCHAR(255);
如果存在,则删除临时表temp_table1;
创建临时表temp_breweries(col1 varchar(255));
如果存在,则删除临时表temp_table2;
创建临时表temp_outletTypes(col2 varchar(255));
loop1:LOOP
设a = a + 1;
SET str = REPLACE(SPLIT_STR(fullstr,“,”,a),'\'','');
IF str =''那么
LEAVE loop1;
结束IF;
#Do在这里插入临时表,str进入行
插入temp_table1值(str);
END LOOP loop1;
loop2:LOOP
SET b = b + 1;
SET outletStr = REPLACE(SPLIT_STR(outlet_Type,“,”,b),'\'','');
如果outletStr =''那么
LEAVE loop2;
结束IF;
#Do在这里插入临时表,outletStr进入行
插入temp_table2值(outletStr);
#用于测试:插入mytest(啤酒厂)值(outletStr);
END LOOP loop2;
SELECT [fields]
从
[表]
WHERE
BINARY field
IN(SELECT * FROM temp_table1)
AND DATE
BETWEEN startDate AND endDate AND
BINARY field2
IN(SELECT * FROM temp_table2);
结束
来自:MySQL Split Comma Separated String Into Temp Table。
我相信必须有一个更好或更简单的方法,但这就像一个魅力!