Расчёт отношений в стандартном кубе с помощью пользовательской функции

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

  1. На странице «Факты» задайте два факта: «Значение» и «Предыдущий год».

  2. На странице «Привязка фактов» добавьте в источники данных таблицу и свяжите числовое поле таблицы с фактом «Значение».

  3. На странице «Измерения» добавьте в качестве измерения куба календарный справочник и привяжите измерение к полю источника данных, содержащего дату, по индексу «Первичный ключ блока дни».

Добавьте ссылки на системные сборки: Cubes, Dimensions.

Function GetLag(DimInst: IDimInstance; El: Integer): Integer;
Var
    Result: Integer;
Begin
    // Выполняем вычисления
    If CalendarDimension.Level(DimInst, El) = DimCalendarLevel.Day Then
        Result := CalendarDimension.Day(DimInst, CalendarDimension.Shift(DimInst, El, 365));
    Else
        Result := -1;
    End If;
    // Возвращаем результат
    Return Result;
End Function GetLag;

Public Function Lag(T: Variant): Variant;
Var
    Cube: ICubeInstance;
    CubeDest: ICubeInstanceDestination;
    DimInsts: ICubeInstanceDimensions;
    DimInst: IDimInstance;
    Res: Array Of Integer;
    I: Integer;
    Cnt: Integer;
Begin
    // Получаем текущий куб
    Cube := CubeClass.CurrentCube;
    CubeDest := Cube.Destinations.DefaultDestination;
    // Находим календарное измерение
    DimInsts := CubeDest.Dimensions;
    Cnt := DimInsts.Count;
    For I := 0 To Cnt - 1 Do
        If DimInsts.Item(I).Dimension.IsCalendar Then
            DimInst := DimInsts.Item(I);
        End If;
    End For;
    // Укажем возможность наличия массива в качестве входного параметра T
    If T.VarType = ForeVariantType.Matrix Then
        Res := T As Array Of Integer;
        Cnt := Res.Length;
        For I := 0 To Cnt - 1 Do
            Res[I] := GetLag(DimInst, Res[I]);
        End For;
        // Возвращаем результат
        Return Res;
    Else
        //Возвращаем целоечисленное значение    
        Return GetLag(DimInst, T);
    End If;
End Function Lag;

После создания модуля откройте мастер редактирования стандартного куба и выполните действия:

  1. На странице «Отношения» добавьте отношение c наименованием «Значение за предыдущий год», идентификатором YEAR_BEFORE и настройте отношение в формате пользовательской функции вида [Идентификатор модуля].Lag(T) для Fore.

  2. На странице «Вычисляемые факты» для факта «Предыдущий год» укажите формулу «Значение за предыдущий год[Значение]» через редактор формул. После сохранения формула будет иметь вид YEAR_BEFORE[@[1]]. В окне редактирования вычисляемого факта установите флажок «Рассчитать по фактическим данным», чтобы при расчёте отношений пользовательская функция обрабатывала и возвращала массив целочисленных значений.

В результате использования отношения в формуле вычисляемого факта значение для факта «Предыдущий год» будет браться из того же дня предыдущего года, например:

См. также:

Примеры