如何在spagoBi服务器

时间:2016-03-16 06:28:33

标签: spagobi

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

1 个答案:

答案 0 :(得分:1)

问问问题已经过了几年但是我想我会发表这个问题的经验,因为它可能会帮助其他人。

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

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

以下是我采取的步骤:

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

    创建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,'')

  2. 创建一个存储过程,将参数作为结果集返回,可以通过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);

    结束

  3. 来自:MySQL Split Comma Separated String Into Temp Table

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