Как реализовать многозначный параметр на сервере spagoBi

Я сделал отчет в spagoBI studio с параметром multi_value, он отлично работает в студии. Но когда я загружаю его на сервер, выполняется пустая страница. Пожалуйста, помогите мне.


person dhS    schedule 16.03.2016    source источник


Ответы (1)


Прошло несколько лет с тех пор, как был задан вопрос, но я решил опубликовать свой опыт решения этой проблемы, так как это может помочь другим.

Проблема связана с тем, что каждое значение в строке параметров заключено в одинарные кавычки, поэтому условие where не выполняется в выражении sql вашего отчета.

Поэтому, если вы используете Postgresql, см.: https://www.spagoworld.org/jforum/posts/list/382.page. Однако, если вы, как и я, используете MySQL, то здесь начинаются все развлечения и игры, потому что MySQL не имеет готовой к использованию функции regxp_split_to_table! Что сработало для меня, так это использование временных таблиц и хранимой процедуры для возврата набора данных отчета. Затем я вызвал процедуру в queryString отчета.

Итак, я предпринял следующие шаги:

  1. создайте функцию для выделения каждого параметра из многозначной строки и удаления одинарных кавычек:

    CREATE DEFINER=root@localhost FUNCTION 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}). Хитрость здесь заключается в том, чтобы взять разделенный и очищенный параметр и вставить его во временную таблицу, которую затем можно запросить в последующем операторе select, который возвращает набор данных. Моя хранимая процедура выглядит так:

    CREATE DEFINER=root@localhost PROCEDURE create_temp_breweries(fullstr varchar(255), startDate date, endDate date, output_Type varchar(255))
    BEGIN
    DECLARE a INT По умолчанию 0 ;
    DECLARE b INT По умолчанию 0 ;< br> DECLARE str VARCHAR(255);
    DECLARE outputStr VARCHAR(255);
    удалить временную таблицу, если она существует temp_table1;
    создать временную таблицу temp_breweries(col1 varchar(255));
    удалить временную таблицу если существует temp_table2;
    создать временную таблицу temp_outletTypes(col2 varchar(255));
    loop1: LOOP
    SET a=a+1;
    SET str= REPLACE(SPLIT_STR(fullstr,"," ,a),'\'', '');
    IF str='' THEN
    LEAVE loop1;
    END IF;
    #Do Вставляется здесь во временную таблицу, а str идет в строку
    вставить в temp_table1 значения (str);

    КОНЕЦ ПЕТЛИ петля1;

    loop2: LOOP
    SET b=b+1;
    SET outputStr= REPLACE(SPLIT_STR(outlet_Type,",",b),'\'', '');
    IFoutletStr='' THEN
    LEAVE loop2;
    END IF;
    #Do Вставляется здесь во временную таблицу, а outputStr входит в строку
    вставляется в значения temp_table2 (outletStr);
    # Для тестирования: вставляется в mytest ( пивоварня) значения (outletStr);
    END LOOP loop2;

    ВЫБЕРИТЕ [поля]
    ИЗ
    [таблицы]
    ГДЕ
    ДВОИЧНАЯ field В (ВЫБЕРИТЕ * ИЗ temp_table1)
    И DATE МЕЖДУ startDate И endDate И
    ДВОИЧНАЯ field2 В (ВЫБЕРИТЕ * ИЗ временная_таблица2);

    КОНЕЦ

Получил это из: MySQL Разделить строку, разделенную запятыми, во временную таблицу .

Я уверен, что должен быть лучший или более простой способ, но это сработало как шарм!

person Chibsta    schedule 20.03.2018