Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
koshcheev
Contributor
Contributor

Анализ множеств как игнорировать все фильтры кроме одного?

Всем привет.

Подскажите, есть ли возможность игнорировать в set analysis все фильтры (отборы) по полям кроме одного указанного.

Например, если я хочу при суммировании поля Колво игнорировать выбор по полю ТипДокумента

я напишу так:

sum({<ТипДокумента=>}Колво)

а вот если я хочу игнорировать все выборы кроме ТипДокумента есть ли такая возможность?

1 Solution

Accepted Solutions
Sergey_Polekhin
Employee
Employee

Согласен, спасибо за внимательность!

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

= Sum( {1 < ТипДокумента = $(=If( IsNull( GetFieldSelections(ТипДокумента )), '{*}',

  If( Index( GetFieldSelections(ТипДокумента), 'NOT') > 0,

  '- {' & chr(39) & Replace( Replace(GetFieldSelections(ТипДокумента), 'NOT ', ''), ', ', chr(39) & ',' & chr(39)) & chr(39) & '}',

  '{' & chr(39) & Replace( GetFieldSelections(ТипДокумента), ', ', chr(39) & ',' & chr(39)) & chr(39) & '}'))) > } Колво)

Идея расчета проста: если результатом GetFieldSelections() является перечисление значений попавших в отбор, то формируется модификатор вида: {'Значение1', 'Значение2'....}, т.е. включающего выбранное множество значений.

Если же результатом GetFieldSelections() является перечисление значений, исключенных из отбора (т.е. появляется оператор NOT), то формируется модификатор вида: - {'Значение1', 'Значение2'....}, т.е. со знаком "минус",  т.е. множество значений, исключающее выбранные.


Пример с пошаговым расчетом в объектах приложения - в аттаче.

View solution in original post

9 Replies
Sergey_Polekhin
Employee
Employee

Можно, например, так:

=Sum( {1 < ТипДокумента = {$(=If( IsNull( GetFieldSelections(ТипДокумента )), '*', GetFieldSelections(ТипДокумента )))} > } Колво)

koshcheev
Contributor
Contributor
Author

Выражение получается не всегда правильное ((  вот если значения строковые, то GetFieldSelections вернет для типов документа например: {продажа,реализация,списание} а надо {'продажа','реализация','списание'} или я где то что-то упустил, еще может вернуть 18of31 или NOT 18,19 и тогда выражение будет ошибочным (

буду благодарен если подскажете универсальный способ

Sergey_Polekhin
Employee
Employee

Согласен, спасибо за внимательность!

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

= Sum( {1 < ТипДокумента = $(=If( IsNull( GetFieldSelections(ТипДокумента )), '{*}',

  If( Index( GetFieldSelections(ТипДокумента), 'NOT') > 0,

  '- {' & chr(39) & Replace( Replace(GetFieldSelections(ТипДокумента), 'NOT ', ''), ', ', chr(39) & ',' & chr(39)) & chr(39) & '}',

  '{' & chr(39) & Replace( GetFieldSelections(ТипДокумента), ', ', chr(39) & ',' & chr(39)) & chr(39) & '}'))) > } Колво)

Идея расчета проста: если результатом GetFieldSelections() является перечисление значений попавших в отбор, то формируется модификатор вида: {'Значение1', 'Значение2'....}, т.е. включающего выбранное множество значений.

Если же результатом GetFieldSelections() является перечисление значений, исключенных из отбора (т.е. появляется оператор NOT), то формируется модификатор вида: - {'Значение1', 'Значение2'....}, т.е. со знаком "минус",  т.е. множество значений, исключающее выбранные.


Пример с пошаговым расчетом в объектах приложения - в аттаче.

Sergey_Polekhin
Employee
Employee

Кстати, в зависимости от ситуации, может оказаться более простым решением использование "Альтернативных состояний".

В частности, на закладке "Альтернативное состояние" приведен пример реализации.

koshcheev
Contributor
Contributor
Author

Идея понятна. Спасибо за развернутый ответ

Anna_Klimkova
Employee
Employee

Сергей, мне понравилось изящное решение через Alternate State.

Но вот другой вариант с GetFieldSelections() не рекомендовала бы.

Если выбраны все значения, то результат фунции = 'ВСЕ'. Но главная проблема появляется, когда выбрано больше 6ти значений и еще осталось много невыбранных. Тогда результат, например, будет '7 из 24', без явного перечисления значений.

Я предлагаю другой вариант решения, взятый из недр нашего коммьюнити (http://community.qlik.com/docs/DOC-1334).

Он основан на автоматизации создания строки перечисления всех полей, в которых выборку надо игнорировать, с помощью системных полей $Field или $Table. И которой с помощью знака 'минус' исключаются поля и таблицы, где фильтры нам нужны.

=sum({$<[$(=Concat({1<$Field-={'ТипДокумента'}>}distinct $Field,']=,[')&']=')>} Колво)

koshcheev
Contributor
Contributor
Author

Спасибо за разные варианты решения ) действительно к одной и той же цели можно прийти разными путями ))

kashporov
Partner - Contributor
Partner - Contributor

Похоже, коллеги немного усложнили в ответах . Попробуйте так:

sum({1<ТипДокумента=$::ТипДокумента>} Колво)

Not applicable

Можно не проверять результат, который выдает функция GetFieldSelections(), если задать параметр максимального числа выводимых значений: GetFieldSelections(ТипДокумента, ',', 'all')