Я сделал отчет в spagoBI studio с параметром multi_value, он отлично работает в студии. Но когда я загружаю его на сервер, выполняется пустая страница. Пожалуйста, помогите мне.
Как реализовать многозначный параметр на сервере spagoBi
Ответы (1)
Прошло несколько лет с тех пор, как был задан вопрос, но я решил опубликовать свой опыт решения этой проблемы, так как это может помочь другим.
Проблема связана с тем, что каждое значение в строке параметров заключено в одинарные кавычки, поэтому условие where не выполняется в выражении sql вашего отчета.
Поэтому, если вы используете 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}). Хитрость здесь заключается в том, чтобы взять разделенный и очищенный параметр и вставить его во временную таблицу, которую затем можно запросить в последующем операторе select, который возвращает набор данных. Моя хранимая процедура выглядит так:
CREATE DEFINER=
root
@localhost
PROCEDUREcreate_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 Разделить строку, разделенную запятыми, во временную таблицу .
Я уверен, что должен быть лучший или более простой способ, но это сработало как шарм!