21 декабря 2009 г.

Тип данных Dual()

Приветствую, коллеги.
Каюсь, каюсь и еще раз каюсь... Очередной простой в блоге, но Вы должны менять понять :) конец года как никак... Ну да ладно, хватит о грустном и перейдем непосредственно к самому интересному...
Сегодня предлагаю поговорить о таком интересном типе данных QlikView как Dual.
Как видно из его названия это некий двойной тип данных, а проще говоря, тип данных хранящий сразу два представления. Для начала давайте заглянем в справку и посмотрим что нам предлагает официальный источник. Заглянули? Отлично. А теперь приведу пример использования этой фичи из своего реального опыта.
Для начала немного предыстории… Я всегда на всех проектах формирую отдельную таблицу календарь, где создаю на основании поля “Дата транзакции” различные поля типа: Год, Месяц, Квартал, Месяц-Год, Квартал-Год… Выглядит это примерно так:
Calendar:
LOAD
    TransDate,
    Year(TransDate)                                          as Year,
    Month(TransDate)                                     as Month,
    'Q' & ceil(Month(TransDate)/3)           as Quarter,
    Date(Monthstart(TransDate), 'MMM-YYYY')       as MonthYear,
    num(QuarterStart(TransDate)))                                 as QuarterYear,
    'Q' & Ceil(Month(TransDate)/3) &'-'& Year(TransDate)   as QuarterYear,
    Day(TransDate)                                                as Day       
;
LOAD
    ($(vMinDate) + IterNo())        as TransDate
AUTOGENERATE 1
WHILE ($(vMinDate) + IterNo()) <= $(vMaxDate);
И все вроде замечательно, пока я не обнаружил, что значения поля QuarterYear постоянно в различных объектах, будь то диаграмма(Chart) или список значений(ListBox), различным образом сортируется. В диаграмме по оси X может нормально сортироваться:
Q1-2008, Q2-2008, Q3-2008, Q4-2008, Q1-2009, Q2-2009…,
а в Списке значений может сортироваться как текст, т.е. как то так:
Q1-2008, Q1-2009, Q2-2008, Q2-2009, Q3-2008, Q3-2009,…
Причем настройка типа Сортировки(как Текст, либо как Число) в свойствах объекта не всегда приводила к нужному варианту, что заставило меня задуматься над этой ситуацией. Почему собственно наблюдается такое непредсказуемое поведение системы? Ведь в случае с очень похожем полем MonthYear ничего подобного и в помине нет – всегда сортируется так, как мы указываем в параметрах сортировки объекта. А ответ очень прост – посмотрите на реализацию календаря – поле MonthYear формируется при помощи функций работы с датами, просто выбирается необходимый формат представления - 'MMM-YYYY'. А поле QuarterYear реализуется в виде обычной строки, без какого либо намека на  привязку к дате. В этом и весь ответ.
В итоге немного поразмыслив я переделал формирование своего календаря, а точнее поля QuarterYear. Теперь это выглядит следующим образом:
Dual('Q' & Ceil(Month(TransDate)/3) &'-'& Year(TransDate), num(QuarterStart(TransDate))) as QuarterYear
т.е. в поле QuarterYear мы “загоняем” сразу 2 типа данных: строковый и числовой. И в этом нам помогает собственно тип данных Dual. В результате теперь во всех объектах QlikView мы можем производить сортировку так как нам будет необходимо и система всегда правильно нас “поймет” и отсортирует значения в нужном порядке.
Вот такой вот натюрморт получается :).

3 комментария:

  1. Автор слегка чайник. Появляется проблема в табличных чартах - если значение ячейки невлазит в ширину столбца. Для сего есть Sort: Load order

    ОтветитьУдалить
  2. Хм. интересное замечание про кухонную утварь :) Особенно лестно слышать это от анонима :) А каким боком сюда приплетена ширина столюца так вообще непонятно... Согласен, что одним из вариантов решения вышеописанных проблем может быть "Sort: Load order", однако, тип данных Dual как решение также вполне корректно на мой взгляд(взгляд автора)

    ОтветитьУдалить
  3. Спасибо , Анатолии . Пример может и не слиском удачен , но возможност функции передана прекрастно.
    и доступно.
    Я исползовал Dual , когда нуйно отсортировать Character data in P&L reporting such account cathegory .
    Revenue account should be first
    then Cost Of Goods
    Then Expenses

    и так далее.

    Great job on qlikview forum as well !!!!!!
    Artur.

    ОтветитьУдалить