我在 spagoBI 工作室中使用multi_value 参数制作了一个 birt 报告,它在工作室中运行良好。 但是当我将它上传到服务器时,它的执行会给出一个空白页。 请有人帮助我。
1 回答
自从询问这个问题以来已经有几年了,但我想我会发布我在这个问题上的经验,因为它可能会帮助其他人。
问题是由于参数字符串中的每个值都用单引号括起来,因此在报表的 sql where 语句中不满足 where 条件。
因此,如果您使用的是 Postgresql,请参阅:https ://www.spagoworld.org/jforum/posts/list/382.page 。但是,如果您像我一样使用 MySQL,那么所有的乐趣和游戏都从这里开始,因为 MySQL 没有准备好使用的 regxp_split_to_table 函数!对我有用的是使用临时表和存储过程来返回报表数据集。然后我在报告的 queryString 中调用了该过程。
所以以下是我采取的步骤:
创建一个函数以从多值字符串中拆分出每个参数并删除单引号:
CREATE DEFINER=
root
@localhost
FUNCTIONSPLIT_STR
(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
) 返回 varchar(255) CHARSET utf8
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '')创建一个存储过程以将参数作为结果集返回,该结果集可以通过 sql 的 where in ($P{parameter}) 语句进行匹配。这里的诀窍是获取 split 和 clean up 参数并将其插入到临时表中,然后可以在随后返回数据集的 select 语句中查询该临时表。我的存储过程如下所示:
CREATE DEFINER=
root
@localhost
PROCEDUREcreate_temp_breweries
(fullstr varchar(255), startDate date, endDate date, outlet_Type varchar(255))
BEGIN
DECLARE a INT Default 0 ;
DECLARE b INT 默认值 0 ;
声明 str VARCHAR(255);
声明 outletStr VARCHAR(255);
如果存在 temp_table1,则删除临时表;
创建临时表 temp_breweries(col1 varchar(255));
如果存在 temp_table2,则删除临时表;
创建临时表 temp_outletTypes(col2 varchar(255));
循环1 :循环
设置a=a+1;
SET str= REPLACE(SPLIT_STR(fullstr,",",a),'\'', '');
如果 str=''
万一;
#Do Inserts into temp table here with str into the row
insert into the temp_table1 values (str);结束循环循环1;
循环2 :循环
设置b=b+1;
SET outletStr= REPLACE(SPLIT_STR(outlet_Type,",",b),'\'', '');
IF outletStr='' THEN
LEAVE loop2;
万一;
#Do 在此处插入临时表,其中 outletStr 进入行
插入 temp_table2 值(outletStr);
# 用于测试:插入 mytest (brewery) 值 (outletStr);
结束循环循环2;SELECT [fields]
FROM
[tables]
WHERE
BINARYfield
IN (SELECT * FROM temp_table1)
ANDDATE
BETWEEN startDate AND endDate AND
BINARYfield2
IN (SELECT * FROM temp_table2);结尾
从:MySQL Split Comma Separated String Into Temp Table得到这个。
我相信一定有更好或更简单的方法,但这就像一个魅力!