Вычисляемые факты в стандартных кубах

Блог Форсайт
Ирина Кирьянова

Продолжая тему кубов и вычисляемых показателей в кубах и отчетах, хотелось бы поподробнее рассмотреть один из этих инструментов. Чтобы вывести в отчете показатель, посчитанный на основе данных из базы, можно использовать вычисляемые факты куба (далее «вычфакт») или вычисляемые элементы в отчете. О вычисляемых фактах в кубе и пойдет речь в этой статье.

Вычисляемые факты куба или вычисляемые элементы в отчетах?

Чтобы при создании отчета сделать выбор в пользу того или иного инструмента, нужно иметь представление об особенностях каждого из них. Ниже перечислены преимущества вычисляемых фактов в кубах:

    - В вычисляемых фактах, настроенных в кубе, можно использовать параметры куба, в отчетах такой возможности нет.

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

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

    - Отношения, используемые в вычфактах в кубе, позволяют рассчитывать значения, отстающие на указанное количество шагов от текущего. Причем настроить такой сдвиг можно для любого измерения. В отчетах сдвиг настраивается только для календарного измерения.

Создание вычисляемых фактов в кубе

Вычисляемый факт представляет собой некую функцию, использующую значения других фактов: обычных или вычисляемых.

Для создания вычфакта в мастере стандартного куба следует перейти на страницу «Вычисляемые факты» и для факта, не привязанного к полю набора данных, указать выражение для вычисления.

Для составления выражения можно использовать имеющиеся параметры куба, отношения, другие факты и специальные функции.

Также в выражении может быть использована пользовательская функция, описанная в модуле или форме. Путь до пользовательской функции задается в следующем формате: [Идентификатор модуля/формы].[Наименование функции]. Доступ к данным куба, на основании которых может осуществляться расчет значения, осуществляется посредством класса CubeClass.

Отношения

Вычисляемые факты в кубах тесно связаны с таким инструментом, как Отношения.

Отношения позволяют построить выражение с учетом отметки по другим измерениям.

Значения отношения задаются с помощью установки соответствующих переключателей и задания значений:

  • Нет. В качестве элемента справочника будет взят текущий.
  • Уровней вверх. Результатом применения отношения будет элемент-владелец, отстоящий на указанное количество уровней от текущего элемента.
  • Элементов назад. Результатом применения отношения будет элемент того же уровня, отстоящий на указанный порядковый номер от текущего элемента.
  • Указанный элемент. При установке данного переключателя становится доступным раскрывающееся дерево справочника, в котором нужно выбрать конкретный элемент. Тогда независимо от текущей позиции в кубе, результатом применения отношения будет именно тот элемент.
  • Выражение. Результатом применения отношения будет заданное выражение.

Предлагаю рассмотреть все вышеперечисленные возможности на примере наиболее часто встречающихся вычисляемых показателей.

Темп роста

Первый показатель, который мы рассмотрим, – это темп роста. Для многих расчет темпа роста – непростая задача. На самом деле с помощью вычфактов это сделать довольно легко.

Чтобы посчитать темп роста, помимо значения показателя за текущий период нужно иметь еще значение за какой-либо предыдущий (начальный) период времени. И тут нам на помощь приходят Отношения, которые задаются на соответствующей странице мастера.

Предположим, что у нас куб с календарем, который содержит уровень Годы, Кварталы и Месяцы. Данные у нас хранятся только в разрезе по месяцам. И в зависимости от того, относительно какого периода нам нужно узнать темп роста, настройки отношения будут меняться. Рассмотрим самые основные:

1. Темп роста относительно предыдущего периода текущего года.

В нашем примере это значение за предыдущий месяц. Для того чтобы его получить, нам нужно создать отношение для календарного измерения и указать, что нам нужно передвинуть значение на 1 элемент назад.

2. Темп роста относительно аналогичного периода прошлого года.

У нас это будет значение за тот же месяц, но в прошлом году. Так как в году 12 месяцев, то сдвиг уже пойдет на 12 элементов назад.

3. Темп роста относительно какого-то определенного периода.

Например, мы хотим узнать темп роста с начала работы нашей фирмы. Пусть это будет, к примеру, январь 2010 года. Тогда отношение будет выглядеть следующим образом:

Создадим любое из вышеперечисленных отношений для календарного справочника.

Теперь мы можем перейти к созданию вычфакта, который будет нам выводить темп роста относительно предыдущего месяца. Здесь BEFORE — идентификатор нашего отношения, [@1] — факт, привязанный к набору данных, возвращающий значение за текущий период времени.

Теперь усложним задачу – представим, что мы хотим увидеть значение за аналогичный период прошлого года не только в разрезе месячной динамики, но также квартальной и годовой (значения в кварталы и годы у нас агрегируются с месяцев). И здесь сложность в том, что для каждого уровня календаря сдвиг назад будет на разное количество элементов. Поэтому для каждого уровня создадим отдельное отношение, которое будет брать значение на 12 точек назад для месяцев и на 4 – для кварталов. Для уровня Годы будем брать значение за предыдущий год.

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

Public Function level (key: Integer): Integer; Var cubeInst:IcubeInstance; Dest:ICubeInstanceDestination; DimS:ICubeInstanceDimensions; Coord: IMatrixCoord; elems:IDimElements; level,dimIndex,i: Integer; Begin cubeInst:=cubeclass.CurrentCube; Dest:=cubeInst.Destinations.DefaultDestination; DimS:=Dest.Dimensions; For i:=0 To DimS.Count-1 Do If DimS.Item(i).Key=key Then dimIndex:=i; End If; End For; Coord:=cubeclass.CurrentCoord; elems:=DimS.FindByKey(key).Elements; level:=elems.AttributeValue(Coord.Item(dimIndex),0) As Integer; Return level; End Function level;

Входным параметром данной функции является ключ календарного измерения куба.

В зависимости от уровня календаря, который нам вернет функция, в вычфакте мы будем использовать то или иное отношение. В этом случае выражение для вычфакта будет иметь следующий вид:

Iif(EXPMODUL.level(193806)=4,MONTH[@1],Iif(EXPMODUL.level(193806)=3,QUARTER[@1],Iif(EXPMODUL.level(193806)=1,YEAR[@1],0))) где EXPMODUL — идентификатор модуля с функцией, [@1] — факт, привязанный к набору данных, возвращающий значение за текущий период времени.

Накопительный итог

Еще одним показателем, который часто приходится выводить в отчетах, это накопительный (или нарастающий) итог. Данный показатель представляет собой сумму показателей с некоторого начального периода времени по текущий. То есть на примере месячной динамики: февраль=январь+февраль, март=январь+февраль+март, апрель= январь+февраль+март+апрель и т.д. Для расчета такого показателя в вычфактах есть специальные функции — SUM и SUM_S.

Функции имеют следующий синтаксис:

где F – показатель, L1 и L2 — наименования уровней. В качестве наименования уровней используются только строковые константы, обозначающие уровни календарного справочника: DAY, WEEK, MONTH, QUART, HYEAR, NINEMONTH, YEAR, ROOT.

Данные функции возвращают накопленную сумму факта F по уровню L1 в рамках периода накопления L2. Период накопления представляет собой уровень, в рамках которого происходит накопление. Накопление начинается заново с началом каждого периода. Главное отличие функций SUM и SUM_S в том, что SUM_S считает накопленную сумму только по отмеченным элементам.

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

Для каждого года накопление будет начинаться заново с начала года.

Аналогично, если накопительный итог нужно считать для различных уровней календаря, то нам на помощь опять придет пользовательская функция, описанная выше. Вычфакт тогда будет иметь следующий вид:

Iif(EXPMODUL.level(193760) = 1, SUM[@[1],YEAR,ROOT], Iif(EXPMODUL.level(193760) = 4, SUM[@[1],MONTH,YEAR], Iif(EXPMODUL.level(193760) = 3, SUM[@[1],QUART,YEAR], Null)))

Помимо функций, считающих сумму, в вычфактах есть также ряд других специальных функций, подробнее с которыми можно ознакомиться в нашей онлайн-справке в разделе о кубах.

Это далеко не все возможности вычфактов в стандартных кубах. Но я постаралась описать здесь различные приемы, используя и комбинируя которые, можно посчитать даже самые сложные показатели.

Комментарии

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