1

我在 spagoBI 工作室中使用multi_value 参数制作了一个 birt 报告,它在工作室中运行良好。 但是当我将它上传到服务器时,它的执行会给出一个空白页。 请有人帮助我。

4

1 回答 1

1

自从询问这个问题以来已经有几年了,但我想我会发布我在这个问题上的经验,因为它可能会帮助其他人。

问题是由于参数字符串中的每个值都用单引号括起来,因此在报表的 sql where 语句中不满足 where 条件。

因此,如果您使用的是 Postgresql,请参阅:https ://www.spagoworld.org/jforum/posts/list/382.page 。但是,如果您像我一样使用 MySQL,那么所有的乐趣和游戏都从这里开始,因为 MySQL 没有准备好使用的 regxp_split_to_table 函数!对我有用的是使用临时表和存储过程来返回报表数据集。然后我在报告的 queryString 中调用了该过程。

所以以下是我采取的步骤:

  1. 创建一个函数以从多值字符串中拆分出每个参数并删除单引号:

    CREATE DEFINER= root@ localhostFUNCTION SPLIT_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, '')

  2. 创建一个存储过程以将参数作为结果集返回,该结果集可以通过 sql 的 where in ($P{parameter}) 语句进行匹配。这里的诀窍是获取 split 和 clean up 参数并将其插入到临时表中,然后可以在随后返回数据集的 select 语句中查询该临时表。我的存储过程如下所示:

    CREATE DEFINER= root@ localhostPROCEDURE create_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
    BINARY fieldIN (SELECT * FROM temp_table1)
    AND DATEBETWEEN startDate AND endDate AND
    BINARY field2IN (SELECT * FROM temp_table2);

    结尾

从:MySQL Split Comma Separated String Into Temp Table得到这个。

我相信一定有更好或更简单的方法,但这就像一个魅力!

于 2018-03-20T18:23:13.560 回答