Предположим у нас есть необходимость показать такую таблицу, в каждой ячейке которой надо указать не только число, но и что-то ещё дополнительно. И при этом мы хотим управлять и цветом, и фоном, и размером этих значений по отдельности, несмотря на то, что обе эти величины будут помещены в одной ячейке таблицы. Например, вот так:
Ответ – да! Сразу оговорюсь, что визуально мы сделаем так, что ячейка будет казаться единой, но на самом деле их там будет две. Итак, приступим!
Исходные данные
Итак, пусть у нас есть такая таблица с данными:
1 2 3 4 5 |
STAT_MONTH, STAT_BRANCH, STAT_GROUP, STAT_SUMMA `31.01.2015`, `Восточный округ`, `group-1`, 377 `28.02.2015`, `Центральный округ`, `group-2`, 323 `31.03.2015`, `Южный округ`, `group-3`, 172 |
т.е. есть какие-то суммы данных в разрезе округов, групп и за разные месяца.
Также нам потребуется вспомогательная таблица, не связанная с другими таблицами. Для этого в скрипте напишем следующее:
1 2 |
_СТРОКИ: LOAD RowNo() as _СТРОКА AUTOGENERATE 25; |
Предварительная подготовка
Начнем с того, что создадим для контроля временную, обычную сводную таблицу, дименшены (Dimensions) которой будут:
1 2 3 |
STAT_BRANCH STAT_GROUP, |
а выражение (Expression):
1 |
SUM(STAT_SUMMA). |
А также перенесем поле STAT_GROUP на горизонталь:
Создание таблицы QlikView
1. Возьмем объект Диаграмма — «Прямая таблица» (Chart – Straight Table). В качестве дименшина (Dimension) укажем вычисляемый:
1 2 3 4 |
=IF( _СТРОКА <= @(=Count({1}distinct STAT_BRANCH))*2 AND Match( FieldValue(`STAT_BRANCH`, Ceil(_СТРОКА/2)), `@(=CONCAT(distinct STAT_BRANCH, chr(39)&`,`&chr(39) ))`) ,_СТРОКА) |
На вкладке Выражения (Expression) в качестве выражения укажем пока всего одно:
1 2 |
SUM( IF( STAT_GROUP=`group-1` AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)), STAT_SUMMA)) |
и назовем его «group-1».
Два значения в одной ячейке. В чем же идея?
Идея взять в качестве дименшина и подать для построения таблицы в два раза больше строк, чем есть у нас разных STAT_BRANCH. При том, мы связываем все возможные значения в поле STAT_BRANCH с парами чисел. Первое значение – с числами 1 и 2, второе – с числами 3 и 4 и так далее.
Кроме того, мы сразу учли в формуле дименшина то, что в системе могут быть наложены фильтры или ограничения на STAT_BRANCH и поэтому строки и в нашей таблице должны быть только по тем STAT_BRANCH, которые сейчас попали в фильтр.
Для построения же колонок таблицы, мы взяли пока простой прием и выделили известную нам группу «group-1», так же привязавшись к паре чисел для каждого значения STAT_BRANCH.
Теперь продолжим наши манипуляции:
- Добавим сами наименования округов из поля STAT_BRANCH, притом добавим их только для нечетных номеров строк нашей таблицы. Добавляем ещё одно выражение на вкладке «Выражения» (Expressions):
1IF( ODD(_СТРОКА), FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2) ))
Пропишем «Метка» (Label) для этого выражения = «округ», и переместим новый столбец выше предыдущего (перед «group-1»).
- Немного подправим формулу самого выражения для «group-1», добавив ограничение, чтобы показывать сумму результата тоже только для нечетных строк:
1 2 3 4 |
IF( ODD(_СТРОКА), SUM( IF( STAT_GROUP=`group-1` AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA) )) |
- Чтобы четные строки не исчезали из-за того, что для них пока ничего не вычисляется уберем галочку «Скрыть нулевые значения» (Suppress Zero Values) на вкладке «Представление» (Presentation) и получим:
- Далее выполним косметические настройки:
- Вкладка Представление (Presentation)
- Убираем галочки “Allow Drag and Drop”, “Sort Indicator”, “Selection Indicators”
- Очистим поля “Null Symbol” и “Missing Symbol”
- Колонку «group-1» отцентруем по горизонтали (как заголовок, так и значения)
- Центровку по вертикали «Данные» (Data Vertical) для значений колонки «округ» выберем «к низу» (Bottom).
- Самую первую колонку с номерами строк скроем, выбрав для неё опцию «Скрыть столбец» (Hide Column)
- На вкладке Выражение (Expression). Чтобы скрыть верхнюю строку «Итоги» (Total) для обоих наших выражений «округ» и «group-1» переключим режим итогов (“Total Mode”) в положение “Нет итогов” (No Totals).
- На вкладке Измерения (Dimensions). Чтобы скрыть нижнюю пустую строку включим галочку «Скрыть Null-значения» (Suppress when value is Null) и получим следующее:
- Теперь усложним наше выражение для «group-1», добавив в него формулу, которая для четных строк будет показывать изменение относительно предыдущего месяца:
123456789101112131415IF( ODD(_СТРОКА),SUM( IF( STAT_GROUP=`group-1`AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA)),IF( STAT_MONTH=Min({1}STAT_MONTH), ` `,Num( SUM( IF( STAT_GROUP=`group-1`AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA))-SUM( {<STAT_MONTH={`@(=AddMonths(STAT_MONTH,-1,1))`}>}IF( STAT_GROUP=`group-1`AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA)),`+###0;-###0`)))
В формуле мы также сразу предусмотрели случай, когда выбран самый первый месяц, невозможно сверить показатели с предыдущим месяцем, т.к. его нет. А в результат мы добавили для положительного прироста знак+
, обернув разность функцией NUM:
- Теперь, оставаясь на той же вкладке «Expressions», скопируем наше выражение «group-1» и создадим две копии выражения: «group-2» и «group-3», заменив в них соответственно фразу в формулах «group-1» на «group-2» и «group-3».
Дизайн таблицы QlikView с двумя значениями ячейки
На данном этапе мы закончили все расчетные действия и теперь переходим непосредственно к визуальной составляющей.
- Для начала нужно выбрать стиль! Перейдем на вкладку «Стиль» (Style).
Главная фишка данного примера — выбрать «Полоски везде» (Stripes every) = 1.
Сам стиль выбираем по вкусу, в нашем примере для задания четких границ ячеек выбран стиль Базовый (Basic) и, конечно же, «Полоски везде» (Stripes Every) = 1.
Ну, а теперь, поясню, почему так важен стиль раскраски строк таблицы через одну. Дело в том, что в режиме дизайнера (меню Вид — «Сетка» (View – Design Grid)) теперь можно управлять отдельно визуализацией четных и не четных строк таблицы!
- Давайте это и проделаем. Войдем в режим дизайнера и выберем правой кнопкой ячейку в первой (нечетной) строке колонки «group-1». В появившемся всплывающем меню выберем «Ячейка с настраиваемым форматом» (Custom Format Cell). Попадем в форму детальных настроек ячейки. В этой форме:
- Убираем линию у «Левая граница» (Border after cell)
- Выставляем размер «Размер текста» (Text Size) на 140% и включаем опцию «Полужирный» (Bold).
- Далее выбираем применить эти настройки ко всем выражениям (Apply changes to – All expressions – Ok)
- Теперь вызываем такую же форму настроек для четных строк таблицы и в ней:
- Убираем линию у «Правой границы» (Border before cell)
- Выставляем размер «Размер текста» (Text size) на 80%.
- Цвет «Цвет фона» (Background color) делаем белым
- Продолжаем работать с визуализацией в режиме дизайнера.
- Сделаем заголовки колонок жирным шрифтом,
- Названия округов – наоборот, не жирным,
- Размер шрифта округа уменьшим до 120%.
- После этого выходим из режима дизайнера.
- Перейдем к раскраске значений:
- Подсветим отрицательные изменения величин (в четных строках) красным цветом. Для этого на вкладке «Выражения» (Expressions) раскроем у выражения «group-1» плюсик и в «Цвет текста» (Text Color) пропишем следующую формулу:
12345678910IF( ODD(_СТРОКА), RGB(0,0,0),IF( SUM( IF( STAT_GROUP=`group-1`AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA))<SUM( {<STAT_MONTH={`@(=AddMonths(STAT_MONTH,-1,1))`}>}IF( STAT_GROUP=`group-1`AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA)), RGB(255,0,0), RGB(0,0,0))) - Точно такую же формулу прописываем в «Цвет текста» (Text Color) и для выражений «group-2» и «group-3». Получили следующее:
- Для усиления выделения и восприятия ячейки целиком можно добавить подсветку фона всей «двойной ячейки», когда изменение отрицательное. Для этого дополнительно пропишем ещё формулу в «Цвет фона» (Background Color):
1 2 3 4 5 6 7 8 9 |
IF( SUM( IF( STAT_GROUP=`group-1` AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA) ) <SUM( {<STAT_MONTH={`@(=AddMonths(STAT_MONTH,-1,1))`}>} IF( STAT_GROUP=`group-1` AND STAT_BRANCH=FieldValue(`STAT_BRANCH`,Ceil(_СТРОКА/2)),STAT_SUMMA) ) , RGB(255,220,220), RGB(255,255,255) ) |
- Теперь осталось ещё два важных момента:
- Чтобы при выборе округа прямо в таблице (щелкая по колонке «округ») корректно выбирались обе строки, а не одна, можно прописать соответствующий триггер в свойствах документа на выбор в поле «_СТРОКА». Правда, придется переименовать в скрипте это поле с «_СТРОКА» на «СТРОКА» или убрать в скрипте команду HidePrefix=
_
…
Но мы поступим проще – на вкладке «Общие» (General) включим галочку «Только чтение» (Read Only) и всё.
- Чтобы при выборе фильтром только отдельных групп, они тоже оставались согласно фильтру в нашей таблице, надо прописать соответствующее условие показа колонки.
На вкладке «Выражения» (Expressions) для выражения «group-1» включим галочку «Условие» (Conditional) и пропишем такое условие:
1 |
Match(`group-1`, `@(=CONCAT(distinct STAT_GROUP, chr(39)&`,`&chr(39)))`) |
Аналогичные условия вписываем в условия показа и для «group-2», «group-3».
На этом первый выпуск альманаха визуализации QlikView завершен. На следующей неделе я выложу первый выпуск Альманаха Визуализации в qvw-файле.
Задавайте вопросы, делитесь идеями, опытом и знаниями здесь, в комментах. До новых встреч!
<= @(=Count({1}distinct STAT_BRANCH))*2 что значит "@"? Какую роль выполняет она
Респект автору, разобрав и поправив формулы, все заработало. Потратил пару дней, но получил огромное удовольствие и расширил представление о возможностях QV.