Опция Pentaho CDE All в компоненте Select

Хотя функция «Выбрать все» в раскрывающемся списке компонентов выбора может показаться простой функцией, мне было невероятно трудно найти работоспособное решение. Я могу найти три вопроса SO по теме, но ни один из подходов не работает полностью.

Как добавить выберите все, чтобы выбрать компонент в CDE
параметр сброса Pentaho CDE
Как добавить опцию "выбрать все" для выбора компонента в CDE?

У меня есть таблица со столбцом, который содержит рейтинги от 1 до 5 (как строковый тип). Мне нужно дать пользователям возможность выбрать значение от 1 до 5 или «Все».

Я создал простой источник данных (DB2), вытягивая числа 1-5 в виде строк. Когда применимо ниже, я бы UNION ALL с '' или "Все"

SELECT ... WHERE (CAST(RATING AS CHAR) = CAST(${parameter} AS CHAR) OR ${parameter} = '')

SELECT ... WHERE (RATING = ${parameter} OR ${parameter} = '')

SELECT ... WHERE (RATING LIKE (CASE WHEN ${parameter} = 'All' THEN '%' ELSE ${parameter} END))

Я использую функции «Выбрать компонент» и «Простой параметр», как и следовало ожидать. Я экспериментировал с установкой "Значения свойства параметра" равным '', "Все" и числам 1-5, но я могу получить только либо "Все" или числовой выбор для работы. Примерно за 50 итераций этой методологии я ни разу не сработал успешно оба.

Есть ли простой или прямой способ добавить выбор «Все», не переключаясь на компонент множественного выбора или дополнительный JavaScript?


person Sean Branchaw    schedule 12.08.2016    source источник
comment
Возможно, когда вы используете числовые значения, Pentaho кодирует параметр как число, таким образом, не заключая его в кавычки в SQL и заключая в кавычки в противном случае. Это могло бы объяснить, почему вы можете использовать только «или» (только один тип будет работать при сравнении с RATING). Вы пытались использовать параметр внутри предложения LIKE, например: WHERE TO_CHAR(RATING) LIKE ${parameter}, а затем использовать «%» в качестве значения для «Все»? Я думаю, что мне удалось решить что-то подобное с этой стратегией.   -  person Óscar Gómez Alcañiz    schedule 22.08.2016


Ответы (2)


Если я правильно понимаю, вы хотите, чтобы пользователи могли фильтровать определенную информацию об этом рейтинге (например, список фильмов), но если рейтинг не выбран, должны отображаться все фильмы.

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

в основном вы создаете SQL, в котором вы выбираете свои данные для компонента выбора

SELECT RATING
UNION
SELECT '...'
ORDER BY RATING

Теперь добавьте простой параметр «Рейтинг» или назовите его как угодно. И используйте его в своем основном запросе (для которого требуется фильтр) следующим образом:

SELECT 'all the data you want to show'
FROM 'your table'
WHERE 'your conditions'
AND
CASE WHEN ${Rating} NOT LIKE '...' THEN RATING = ${Rating} else RATING NOT IN ('dummy value') END 

где «фиктивное значение» означает любое значение, которое никогда не встречается в вашей таблице RATINGS.

person dooms    schedule 16.08.2016

В конце концов я понял это (отчасти благодаря советам @dooms и @Oscar Gómez Alcañiz).

Когда я вытягивал оценки для моего компонента селектора, я заставлял все вводить str, чтобы я мог включить компонент «Все»:

SELECT 'All' AS RATING
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT '1'
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT '2'
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT '3'
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT '4'
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT '5'
FROM SYSIBM.SYSDUMMY1

Затем в запросе для моего табличного компонента я добавил это условие:

WHERE (MY_RATING IN (${Rating_Parameter}) OR ${Rating_Parameter} LIKE ('All'))

По какой-то причине использование IN недостаточно для «Все». Запрос работал, только если я использовал LIKE. Однако, как было написано выше, все наконец-то заработало так, как я хотел.

person Sean Branchaw    schedule 19.10.2016