Динамическое написание Set Analysis на основе выборки

Каждый знает, как неудобно порой бывает писать выражения для анализа множеств. Вам неплохо бы помнить, какие поля есть в вашей модели. Хотя тут несколько выручают подсказки в редакторе выражений. Но вдобавок к этому, нужно также помнить значения, которые вы хотите подставить в анализ. А их вам уже никто подсказывать не будет.

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

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

И сейчас этим способом мы поделимся.

GetCurrentSelections() — наш лучший друг

Функция GetCurrentSelections() возвращает перечень выбранных полей и их значений. Очевидно, результат возвращается не в формате анализа множеств.

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

Как она работает, объяснять не буду. Разберитесь сами, если вам интересно 🙂

replace(replace('{<'&replace(replace('['&GetCurrentSelections ( '"'&'},' , '☄ {'&'"' ,'","',1000)&'"}','☄',']='),'},','},[')&'>} ','{<['&'"'&'}>} ',''),'{<["}>}','')

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

{<[Поле1]={"Значение 1","Значение 2","Значение 3"}, [Поле2]={">=3"}>}

Обрамление значений двойными кавычками было выбрано не случайно. Дело в том, что при выборе значений через условия поиска в фильтре, например >=3<10 в выборке фиксируются не отобранные значения, а условия их отбора. И для его работы нужно обрамление именно двойными кавычками. Т.к. при нашем подходе можно задать только один вариант обрамления значений, мы выбираем двойные кавычки как самый универсальный.

Доработка формулы выражения

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

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

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

Выбор поля для агрегирования лучше всего сделать через формулу only(‘[‘&$Field&’]’). Напомню, что $Field — это системное поле, которое содержит перечень всех полей модели. А функция Only() выводит значение, только если оно представлено в единственном экземпляре для даного разреза. Проще говоря, значение будет появляться только если выбрано одно поле. Кстати в паре с ним идет поле $Table — оно показывает список таблиц модели и фильтрует данные в $Field. Что позволяет ограничить вывод списка полей только определенными таблицами.

Итоговая формула должна получиться примерно такой:

'$(vExpressions)'&'('&'$(vKeyWords)'&
replace('{<'&replace(replace('['&GetCurrentSelections ( '"},' , '☄ {"' ,'","',1000)&'"}','☄',']='),'},','},[')&'>} ','{<["}>} ','')&
only( '['&$Field&']')&
')'

С данным выражением вы сможете выводить текст набираемой формулы как меру в таблице, откуда ее можно скопировать через правый клик мышкой, и вставить в основные элементы.

Вы также можете сделать динамический предпросмотр этого выражения на любой диаграмме. Для этого просто возьмите формулу выражения внутрь конструкции $(=). Из-за этого Qlik Будет воспринимать нашу формулу как выражение, которое нужно вычислить. И она будет работать именно как формула меры.

$(='$(vExpressions)'&'('&'$(vKeyWords)'&
replace('{<'&replace(replace('['&GetCurrentSelections ( '"},' , '☄ {"' ,'","',1000)&'"}','☄',']='),'},','},[')&'>} ','{<["}>} ','')&
only( '['&$Field&']')&
')')

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

Это изображение имеет пустой атрибут alt; его имя файла - DSA.gif

Оптимизируем оптимизацию

В нашей модели может быть множество полей, которые потребуется использовать в Set Analysis. Все их на экран не вытащишь. Разберемся же с этим.

Доступ к остальным полям модели можно получить либо через панель выборок, либо собрав себе динамический переключатель измерений.

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

Рядом создайте фильтр в стандартном состоянии с измерением [$(=only({a1} $Field))], и меткой ‘$(=only({a1} $Field))’.

Теперь, когда вы отберете одно значение в альтернативном поле $Field, то в фильтре появятся значения этого поля, доступные для выбора. Так можно очень быстро переключаться между всеми полями модели.

Также динамическое измерение можно исопльзовать для превью собираемой формулы. Вы можете сами собрать себе нужную компоновку экрана конструктора формул. Мы остановились на таком варианте:

1 Комментарий

  1. Вкину идею: написать экстеншен-кнопку для добавления меры на основе собранной формулы. Т.е. собрал формулу, ввел название и отправил в список мер.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *