Неофициальный форум разработчиков QlikView и Qlik Sense

Форум разработчиков QlikView и Qlik Sense. Получи любые ответы на вопросы по QlikView и Qlik Sense в течении нескольких часов!

Вы не вошли.

#1 Re: Программирование QlikView » Анализ повторных покупок » 2016-05-18 19:19:16

Добрый день!

Попробую помочь.
Добавленная таблица "Календарь" содержит все даты и их различные представления начиная с первой даты в ваших данных и заканчивая последней (включая пробелы, даты по которым не было продаж).
Таблица "calendarShift" - организует связь многое ко многим между календарем и данными продаж. То есть одна строчка продаж ссылается на несколько дат в календарь, в зависимости от значения поля dateShift. Если не учитывать это в формулах, то статистика с использованием измерение из календаря поедет.
Пример:
рассмотрим следующую строку продаж (нам интересны 2 параметра):
  Дата, [Продажа $ с НДС], ...
  15.05.2010, 1500, ...

Формула: sum([Продажа $ с НДС]) в разрезе месяцев (поле из календаря) только для этой строки вернет следующее:
2010.05 = 4500
2010.06 = 1500
2010.08 = 1500
2011.05 = 1500
Утроение в первой строке происходит за счет dateShift = now; День; Неделя. Затем идут строки, где dateShift = Месяц, Квартал, Год соответственно.
Чтобы правильно рассчитать формулу продаж в разрезе месяцев необходимо добавить set analysis:
sum({$<dateShfit = {'now'}>} [Продажа $ с НДС]) - то есть явно указать какое смещение по датам мы используем.

now - дата из календаря ссылается на саму себя в продажах;
День - дата из календаря ссылается на предыдущую дату в продажах;
Неделя - дата из календаря ссылается на аналогичный день предыдущей недели в продажах;
и т. д.

Чтобы избежать проблем добавьте во всем формулы, где вы планируется рассматривать текущие параметры set analysis:
dateShift = {'now'}.

Либо, если формул уже много, и добавление займет большое количество времени, можно вывести listbox с этим полем, выбрать значение now, после чего в свойствах listbox-general поставить галку Always one selected value (всегда выбрано одно значение). Затем listbox при желаниии можно удалить, настройка останется.
Таким образом сделанный выбор нельзя будет очистить или случайным образом изменить и все формулы будут считаться с учетом этого выбора.

#3 Re: Программирование QlikView » Аналог ф-ции сцепить » 2015-12-21 12:22:13

Добрый день, Prive!

Задача, не совсем понятна, поправьте если я ошибаюсь:
требуется в ячейку с надписью Итоги, добавить значения поля по которому эти итоги посчитаны.
Например:
Измерение1                 Измерение2                        Выражение
                                 Значение 2_1                            100
Значение 1_1              Значение 2_3                            200
                                 Значение 2_3                            300
                          Подитог Значение 1_1                       600

В этом случае достаточно в свойствах сводной таблице на листе Presentation для Измерения 1 указать Label for total:
= 'Подитоги ' & Измерение1
, где Измерение1 - название поля из первого столбца.

#4 Re: Программирование QlikView » Изменение выборки в зависимости от параметра » 2015-12-14 13:46:17

Добрый день!

Для вашего случая есть решение, оно не очень прозрачное и в нем используется функционал триггеров.

Для примера, сделаем следующую модель из трех таблиц:

  • Таблица-островок "Переключатель" содержит поля Num, Value и 2 записи:
    (1, 'С учетом подразделений')
    (2, 'Без учета подразделений')

  • Таблица-справочник "Регионы" содержит поля ID-идентификатор региона и Region-название региона

  • Таблица-факт "Продажи" содержит поля ID, SalesSum, Quantity:

Чтобы реализовать описанную вами схему выбора в фильтре Region необходимо настроить триггер из нескольких действий на событие OnSelect в поле Region, то есть каждый раз когда пользователь будет делать выбор в этом поле, будут выполняться действия из триггера:

1. Открываем "Document Properties" -> "Triggers", в списке полей выбираем Region и справа под надписью OnSelect нажимаем на кнопку "Add Action(s)...".
2. Add -> Select in Field
Field: = if(getselectedcount(Region)>0, pick(Num, 'ID', null()))
Search String: ='(' & Concat(ID&'*', '|') & ')'
- выбирает в поле ID идентификаторы выбранных регионов и всех их подрегионов;
3. Add -> Clear Field
Field: =if(getselectedcount(Region)>0, pick(Num, 'Region', null()))
- очищает поле Region;
4. Add -> Select Possible
Field: =if(getselectedcount(Region)>0, pick(Num, 'Region', null()))
- выбирает возможные значения в поле Region (те что соответсвуют фильтру на ID из пункта 2 );
5. Add -> Clear Field
Field: =if(getselectedcount(Region)>0, pick(Num, 'ID', null()))
- очищает поле ID;

Условие if(getselectedcount(Region)>0 используется, чтобы действия не срабатывали при очищении фильтра (то же попадает под OnSelect)
Условие pick(Num, 'ID', null()) используется, чтобы действия срабатывали только при нужном значение переключателя.

Одно но: действия из триггера будут аналогичны действиям сделанным пользователем, поэтому использование кнопки Back (возврат к предыдущей выборке) после выбора в поле Region вернет нас к пункту 4 (то есть вернутся значения выбранные в поле ID).

При необходимости могу направить пример.

#5 Re: Программирование QlikView » Как реализовать функцию ВПР или поиск в массиве в Qlikview » 2015-12-11 12:43:24

Добрый день!

При создании модели данных Qlik соединяет таблицы по полям с одинаковыми наименования. В итоге получается множество доступных записей с которыми можно работать без дополнительных функций.
Рассмотрим простейший пример, даны 2 таблицы:
Заказы - содержит поля [Номер заказа, Позиция заказа, Количество], в поле позиция заказа хранится наименование товара.
Цены - содержит поля [Товар, Цена].
Чтобы посчитать сумму по каждому заказу в Excel можно было бы воспользоваться функцией ВПР.
В Qlik необходимо в скрипте загрузить обе таблицы с ключевым полем Товар (то есть переименовать поле "Позиция заказа" в первой таблице). Далее при построении таблицы достаточно в качестве измерения выбрать Номер заказа, а в качестве выражения sum(Цена*Количество), за счет связи Qlik автоматические рассчитает суммы заказов по ценам из второй таблицы.

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

#6 Re: Для начинающих » Объединить поля выборки в строку » 2015-12-10 17:26:49

Добрый день!

Воспользуйтесь функциями concat и aggr:
concat( aggr( Group & ' = ' & count(Value), Group ), ',' )

#7 Re: Программирование QlikView » Необходимость в аналитических функциях » 2015-11-02 16:19:38

Ева, добрый день!

Если пользователи не будут иметь возможность фильтровать рассматриваемый период, то можно воспользоваться следующей формулой, предварительно отсортировав чарт по возрастанию недели:
Label: Not closed
Definition: Count({<STATUS={'created'}>}DISTINCT TASK_ID) - Count({<STATUS={'closed'}>}DISTINCT TASK_ID) + alt( Above( [Not closed] ) , 0 )
- она считает разницу между количеством созданных и количеством закрытых тасков на этой неделе и прибавляет предыдущее значение из этого же столбца- то есть считает накопительным итогом.
Таким образом для каждой недели будет считаться количество (созданных-закрытых) задач с минимальной даты по конец этой недели.

В случае если пользователь имеет возможность ограничивать период, необходимо добавить ещё две формулы:
Label: Not closed earlier
Definition: Count({<STATUS= {'created'}, LOG_ID= {"<$(=min(LOG_ID))"}, WEEK>}DISTINCT TOTAL TASK_ID) -
Count({<STATUS= {'closed'}, LOG_ID= {"<$(=min(LOG_ID))"}, WEEK>}DISTINCT TOTAL TASK_ID)
- считает количество незакрытых задач, до отфильтрованного периода;

Label: Not closed total
Definition: [Not closed] + [Not closed earlier]
- считает количество незакрытых задач итого.

В qlikview при написании expressions есть возможность использовать другие формулы из этого же чарта обращаясь к ним по Label.
Поэтому если будет исправлять наименования формул, исправьте их в описании.

#8 Re: Для начинающих » Простейший пример » 2015-09-07 21:13:32

Добрый день!

Если вы реализуете три различных объекта-счетчика и в каждом планируете отражать количество заявок соответствующего типа, то используйте одну из следующих формул:
count({<Приоритет = {'Высокий'}>} [№ Заявки])
count( if( Приоритет = 'Высокий', [№ Заявки], null() ) )
, пример реализован для заявок с высоким приоритетом, наименования полей и значение необходимо привести в соответствие вашим данным.

В рамках одного объекта, например таблицы или диаграммы, для расчета сразу трех показателей, можно поле приоритет добавить в измерения, и использовать простую формулу:
count([№ Заявки])

Примечание: если в исходных данных для одной заявки может быть более одной строки, то используйте в формулах DISTINCT для учета каждой заявки один раз. Например: count( DISTINCT [№ Заявки])

#9 Re: Программирование QlikView » Как реализовать функцию СУММЕСЛИ И СУММЕСЛИМН в Qlikview? » 2015-08-20 16:51:08

Добрый день!

В Qlikview подобные формулы можно создать двумя различными способами.
Первый с использованием условного выражения внутри суммы:
sum( if(<условие>, <выражение для true>, <выражение для false>) )
Пример:
необходимо рассчитать сумму продаж в 2012 году по категории "Одежда", формула будет иметь вид: sum( if( Год = 2012 and Категория = 'Одежда', СуммаПродаж, 0 ) )

Второй способ предполагает использование функционала Qlikview - анализ множеств. Данный функционал позволяет различным образом изменять текущее множество обрабатываемых данных, в частности сокращать его путем накладывания фильтров непосредственно в формуле.
На основе того же примера, формула примет следующий вид:
sum({< Год={2012}, Категория = {'Одежда'} >} СуммаПродаж ) - то есть в анализе множеств указывается, что в расчет попадут данные только за 2012 год и которые связаны с категорией "Одежда".

Более подробно с возможностями и синтаксисом анализа множеств можно ознакомиться в Help Qlikview Desktop, по запросу "Анализ множеств" / "Set analysis" (в зависимости от выбранного языка программы)

#10 Re: Программирование QlikView » Помогите! не могу найти очень полезные функции как в Excel » 2015-08-12 13:24:09

Добрый день, KPWS!

В Qlikview для реализации подобных показателей можно использовать функции above(), below() и им подобные (подробнее в разделе Qlikview Help: "Chart Inter Record Functions").
Рассмотрим на примере создания таблицы с динамикой по месяцам.
Допустим имеем выражение: Сумма продаж = sum( SumSales ).
Тогда для расчета отличия можно использовать два варианта:
    [Сумма продаж] - above ([Сумма продаж]) - обращение к выражению ( expression ) через его название ( label ).
    sum( SumSales ) - above (sum( SumSales )) - без обращения, через подстановку формулы
Приведенное отличие рассчитывается аналогично с добавлением требуемого знаменателя.

Долю от суммы по строке также можно посчитать несколькими способами:
    добавить выражение [% суммы продаж] = sum( SumSales ), и для данного выражения установить флаг Relative/Доля (слева от поля для ввода комментария к выражению, доступно на большинстве объектов)
    добавить выражение [% суммы продаж] = sum( SumSales ) / sum( Total SumSales ), Total - ключевое слово, которое означает не учитывать измерения при расчете. Если измерений несколько, а итог надо посчитать по части из них, то тогда используется Total<Измерение1, Измерение2, ...> - через запятую в угловых скобках указываются измерения которые учитываются в выражении.

#11 Re: Программирование QlikView » подсчет кол- ва внутри агрегированных данных » 2015-08-11 14:10:25

Добрый день!

Для решения этой задачи можно min заменить на:
sum( sign( fabs( Aggr(...) ) ) )
, где Aggr(..) - та же самая выборка.

sign( fabs( Значение ) ) - для всех ненулевых значений вернет 1, а для нулей 0.

#12 Re: Программирование в Qlik Sense » Циклические группы в Qliksense » 2015-08-11 13:58:13

Добрый день!
На данный момент Qlik Sense поддерживает только группы измерений с Drill-down, циклические измерения возможно будут реализованы в будущих релизах.

В качестве альтернативы можно использовать следующий подход:
1. Создать таблицу содержащую одно поле с перечнем измерений, не привязанную к основой модели ("островок"). Допустим поле называется ТекущееИзмерение.
2. Вывести поле ТекущееИзмерение, как фильтр.
3. В объект добавить вычисляемое измерение с формулой: =[$(=MinString(ТекущееИзмерение))]

После выбора в фильтре в объект будет подставляться выбранное измерение.

#13 Re: Для продвинутых » Организация доступа к приложениям Section Access (Active Directory) » 2015-04-03 20:57:55

Добрый день!

Вопрос действительно очень интересный и варианты могут быть различные.
Наиболее используемый, на моём опыте, это разграничение через группы в AD, поскольку является самым простым для будущих администраторов системы.
Отдельные группы создаются как для территориального/структурного разделения так и для ограничения функционала приложений.
На уровне пользовательских приложений используются LDAP запросы к AD для создания таблицы в разделе Section Access, в которой каждому пользователю определяется доступ к набору данных и функционалу.
Для администраторов готовится инструкция по настройке доступов и далее они работают только с AD.

В случае использования Qlikview Publisher -  можно частично (или полностью в зависимости от задач) сократить таблицу в Section Access и использовать Loop and Reduce также по группам пользователей.

При большом количестве приложений и вариативности разделения прав требуется более гибкий инструмент, например для случая быстро предоставить доступ пользователю к 20 приложения.
Альтернативой предложенному вами варианту с использованием базы данных, может быть специально созданное приложение Qlikview для управления правами. В нём будет информация о всех пользователях, приложениях и возможных ограничениях/срезах (измерения из приложений). Администратор с помощью указанного приложения будет создавать таблицы доступа для каждого приложения и сохранять их в обычные CSV, QVD файлы (не обойтись без написания макросов).
Пользовательские приложения будут подгружать таблицы доступа из созданных файлов и обновление прав будет вступать в силу согласно расписанию автоматических задач. Можно дополнительно внедрить в указанное приложение возможность быстрого обновления прав в выбранном приложении с использованием Partial Reload.

И кратко комментарии к вопросам:
"- ограничивать права на приложения через AD" - вариант удобный для администраторов, но недостаточно функциональный;
" - ограничивать права через section access, с использованием групп AD или конкретных пользователей" - по сути то, что я описал в начале, и боюсь для предоставления доступа группе необходимо предварительно выгрузить пользователей из неё (хотя в документации указано, что это возможно, но на практике не срабатывало).
"- создать одно приложение, в котором будут ограничения через section access на открытия других приложений." - боюсь этот вариант потенциально опасен, ведь если пользователь использует прямую ссылку на другое приложение (полученную ранее например), то он минуя разграничение прав попадёт в приложение куда по факту доступа не должен иметь.

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.013 сек, 8 запросов выполнено - Использовано памяти: 1.51 Мбайт (Пик: 1.61 Мбайт) ]