Использование переменных в дашборде

Переменная в дашборде — это элемент, позволяющий динамически изменять параметры вычислений и фильтрации данных в зависимости от пользовательского выбора. Она используется в скриптах вычисляемых выражений и наборов данных на Аналитическом портале Modus BI.

Примеры использования:

  1. Значение сумм продаж надо рассчитывать в различных национальных валютах, вид которой выбирается в фильтре.
  2. Необходимо по ключу объединить данные нескольких таблиц, используя для объединения временные периоды, наименования регионов и подразделений, мест возникновения затрат и т.д.
  3. Если фильтрами выбраны лишь некоторые значения для ключей, то процесс объединения может быть более оптимизированным с точки зрения ресурсов и времени выполнения — объединение будет производиться сразу только по выбранным в фильтрах значениям. В этой ситуации популярная в моделировании данных каноническая схема «звезда» будет работать наиболее эффективно.

Синтаксис переменной имеет следующий вид:

{…!env.\<Имя переменной\>!...; \<Выражение пустого условия\>}

env — это пространство имен для пользовательских переменных.

Область выражения { ...<!env.ИмяПеременной!>...; ... } может содержать произвольное выражение в левой и в правой части, но с условием, что в левой части конструкции будет объявлена переменная <!env.ИмяПеременной!>.

В примере с валютой синтаксис может выглядеть следующим образом:

Если переменная VAL выбрана в фильтре как «USD», то используется цена в валюте из поля «Цена_вал», в противном случае при невыполнении условия, например, если в фильтре выберут валюту «Руб» — цена в рублях из поля «Цена_руб».

Если фильтр не выбран, то прописывается условие «1=1», которое всегда возвращает истину (true), и для этого — вариант по умолчанию: применяется цена в валюте (возвращается опять-таки поле «Цена_вал»).

К примеру, имеется «большая» таблица продаж «modus_big_table» следующего вида:

В фильтре видов валют выберем «USD»:

В следующей таблице производится пересчёт суммы в валюту:

Если в фильтре валют выбрать «Руб», то будет произведен соответствующий пересчёт.

Посмотрим, как сконструирована предыдущая таблица в Аналитическом портале, включая код двух вычисляемых выражений:

Как видно из рисунков выше, для вычисляемых выражений «Цена» и «Сумма» использован одинаковый механизм обращения к тем или иным значениям фильтра («USD» / «Руб») и полям набора данных, отвечающих за цену («Цена_вал», «Цена_руб») и сумму соответственно («Сумма_вал», «Сумма_руб»). Везде задействована переменная VAL.

Чтобы механизм работал, нужна соответствующая настройка фильтра валюты. Набор данных для фильтра формируется специальным запросом:

Здесь просто объединяются в набор две текстовых константы: «Руб» и «USD». Самое главное, что переменной присваивается имя «Валюта».

При этом, в настройке фильтра предусмотрен раздел «Переменные», в котором мы можем с помощью кнопки «Добавить» указать нашу переменную «Валюта» и связать её с VAL, которая используется в вычисляемых выражениях:

В следующем примере надо пересчитать сумму продаж для региона:

Здесь верхняя «маленькая» таблица из двух колонок имеет имя «modus_small_table».

В настройке фильтра региона добавлена переменная фильтра региона «Кол», связанная с переменной REGION:

Для набора данных нижней (итоговой) таблицы используется следующий скрипт:

SELECT
FROM "modus_big_table" pr
JOIN (
        SELECT
        FROM "modus_small_table"
        WHERE "Кол" in ({!env.REGION!; 2})
    ) vz
ON pr."id_Региона" = vz."Кол"

Здесь есть подзапрос с «маленькой» таблицей modus_small_table. В ней данные фильтруются по условию, что столбец «Кол» попадает в список значений фильтра REGION. То есть согласно совпадению с фильтром выбирается либо строка {"Москва", 1}, либо {"Санкт-Петербург", 2}, либо {Татарстан, 3}.

Затем идет объединение этой таблицы с «большой» таблицей продаж modus_big_table. В большой таблице есть поле-ключ «id_Региона». Объединение идёт по совпадению значения «Кол» в отфильтрованной в подзапросе таблице и ключом «id_Региона» большой таблицы (цифры 1, 2 или 3).

Цифра 2 дает запасной вариант («страховочное» условие, если вычисление переменной произошло с ошибкой) для скрипта: ему соответствует «Санкт-Петербург».

На основе полученного набора данных в конструкторе настраивается макет итоговой таблицы:

В процессе применения переменных есть определённые особенности.

  1. Значение переменной должно быть числом или текстом. Для дат лучше делать преобразование, например:
    {toDate(!env.Date!) ; '2020-01-01'} = '2023-11-08'
  2. Значение может быть единичным значением или списком, в зависимости от настройки фильтра:
    Region IN { !env.num2!  ;  1 }:: int
  3. Даты начала и окончания периода фильтра обозначаются суффиксами .BEGIN и .END:
Date between ({ toDate(!env.Reg.BEGIN!) ; '2020-01-01'} AND ({ toDate(!env.Reg.END!) ; toDate(now()) }