Форум разработчиков QlikView и Qlik Sense. Получи любые ответы на вопросы по QlikView и Qlik Sense в течении нескольких часов!
Вы не вошли.
Страницы 1
Добрый день!
Попробую помочь.
Добавленная таблица "Календарь" содержит все даты и их различные представления начиная с первой даты в ваших данных и заканчивая последней (включая пробелы, даты по которым не было продаж).
Таблица "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 при желаниии можно удалить, настройка останется.
Таким образом сделанный выбор нельзя будет очистить или случайным образом изменить и все формулы будут считаться с учетом этого выбора.
Yulia, добрый день!
Попробуйте Ctrl + Pause (Break)
Добрый день, Prive!
Задача, не совсем понятна, поправьте если я ошибаюсь:
требуется в ячейку с надписью Итоги, добавить значения поля по которому эти итоги посчитаны.
Например:
Измерение1 Измерение2 Выражение
Значение 2_1 100
Значение 1_1 Значение 2_3 200
Значение 2_3 300
Подитог Значение 1_1 600
В этом случае достаточно в свойствах сводной таблице на листе Presentation для Измерения 1 указать Label for total:
= 'Подитоги ' & Измерение1
, где Измерение1 - название поля из первого столбца.
Добрый день!
Для вашего случая есть решение, оно не очень прозрачное и в нем используется функционал триггеров.
Для примера, сделаем следующую модель из трех таблиц:
Таблица-островок "Переключатель" содержит поля 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).
При необходимости могу направить пример.
Добрый день!
При создании модели данных Qlik соединяет таблицы по полям с одинаковыми наименования. В итоге получается множество доступных записей с которыми можно работать без дополнительных функций.
Рассмотрим простейший пример, даны 2 таблицы:
Заказы - содержит поля [Номер заказа, Позиция заказа, Количество], в поле позиция заказа хранится наименование товара.
Цены - содержит поля [Товар, Цена].
Чтобы посчитать сумму по каждому заказу в Excel можно было бы воспользоваться функцией ВПР.
В Qlik необходимо в скрипте загрузить обе таблицы с ключевым полем Товар (то есть переименовать поле "Позиция заказа" в первой таблице). Далее при построении таблицы достаточно в качестве измерения выбрать Номер заказа, а в качестве выражения sum(Цена*Количество), за счет связи Qlik автоматические рассчитает суммы заказов по ценам из второй таблицы.
Дополнительные возможности по отбору данных непосредственно в выражениях предоставляет Анализ множеств (Set Analysis), описание его работы с примерами можно найти в справке Qlik-а.
Если ещё остались вопросы, то лучше разобрать их на конкретных примерах задач, которые поставлены для реализации в Qlik.
Добрый день!
Воспользуйтесь функциями concat и aggr:
concat( aggr( Group & ' = ' & count(Value), Group ), ',' )
Ева, добрый день!
Если пользователи не будут иметь возможность фильтровать рассматриваемый период, то можно воспользоваться следующей формулой, предварительно отсортировав чарт по возрастанию недели:
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.
Поэтому если будет исправлять наименования формул, исправьте их в описании.
Добрый день!
Если вы реализуете три различных объекта-счетчика и в каждом планируете отражать количество заявок соответствующего типа, то используйте одну из следующих формул:
count({<Приоритет = {'Высокий'}>} [№ Заявки])
count( if( Приоритет = 'Высокий', [№ Заявки], null() ) )
, пример реализован для заявок с высоким приоритетом, наименования полей и значение необходимо привести в соответствие вашим данным.
В рамках одного объекта, например таблицы или диаграммы, для расчета сразу трех показателей, можно поле приоритет добавить в измерения, и использовать простую формулу:
count([№ Заявки])
Примечание: если в исходных данных для одной заявки может быть более одной строки, то используйте в формулах DISTINCT для учета каждой заявки один раз. Например: count( DISTINCT [№ Заявки])
Добрый день!
В Qlikview подобные формулы можно создать двумя различными способами.
Первый с использованием условного выражения внутри суммы:
sum( if(<условие>, <выражение для true>, <выражение для false>) )
Пример:
необходимо рассчитать сумму продаж в 2012 году по категории "Одежда", формула будет иметь вид: sum( if( Год = 2012 and Категория = 'Одежда', СуммаПродаж, 0 ) )
Второй способ предполагает использование функционала Qlikview - анализ множеств. Данный функционал позволяет различным образом изменять текущее множество обрабатываемых данных, в частности сокращать его путем накладывания фильтров непосредственно в формуле.
На основе того же примера, формула примет следующий вид:
sum({< Год={2012}, Категория = {'Одежда'} >} СуммаПродаж ) - то есть в анализе множеств указывается, что в расчет попадут данные только за 2012 год и которые связаны с категорией "Одежда".
Более подробно с возможностями и синтаксисом анализа множеств можно ознакомиться в Help Qlikview Desktop, по запросу "Анализ множеств" / "Set analysis" (в зависимости от выбранного языка программы)
Добрый день, 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, ...> - через запятую в угловых скобках указываются измерения которые учитываются в выражении.
Добрый день!
Для решения этой задачи можно min заменить на:
sum( sign( fabs( Aggr(...) ) ) )
, где Aggr(..) - та же самая выборка.
sign( fabs( Значение ) ) - для всех ненулевых значений вернет 1, а для нулей 0.
Добрый день!
На данный момент Qlik Sense поддерживает только группы измерений с Drill-down, циклические измерения возможно будут реализованы в будущих релизах.
В качестве альтернативы можно использовать следующий подход:
1. Создать таблицу содержащую одно поле с перечнем измерений, не привязанную к основой модели ("островок"). Допустим поле называется ТекущееИзмерение.
2. Вывести поле ТекущееИзмерение, как фильтр.
3. В объект добавить вычисляемое измерение с формулой: =[$(=MinString(ТекущееИзмерение))]
После выбора в фильтре в объект будет подставляться выбранное измерение.
Добрый день!
Вопрос действительно очень интересный и варианты могут быть различные.
Наиболее используемый, на моём опыте, это разграничение через группы в 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 на открытия других приложений." - боюсь этот вариант потенциально опасен, ведь если пользователь использует прямую ссылку на другое приложение (полученную ранее например), то он минуя разграничение прав попадёт в приложение куда по факту доступа не должен иметь.
Страницы 1
[ Сгенерировано за 0.013 сек, 8 запросов выполнено - Использовано памяти: 1.51 Мбайт (Пик: 1.61 Мбайт) ]