Для выполнения примера убедитесь, что в репозитории находятся таблица с данными по дням, календарный справочник, содержащий уровень «Дни» и стандартный куб. Для стандартного куба настройте:
На странице «Факты» задайте два факта: «Значение» и «Предыдущий год».
На странице «Привязка фактов» добавьте в источники данных таблицу и свяжите числовое поле таблицы с фактом «Значение».
На странице «Измерения» добавьте в качестве измерения куба календарный справочник и привяжите измерение к полю источника данных, содержащего дату, по индексу «Первичный ключ блока дни».
Добавьте ссылки на системные сборки: 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;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
…
Function GetLag(DimInst: IDimInstance; El: Integer): Integer;
Var
Result: Integer;
CalendarDimension: CalendarDimension;
Begin
// Выполняем вычисления
If CalendarDimension.Level(DimInst, uinteger.Parse(El.ToString())) = DimCalendarLevel.dclDay Then
Result := CalendarDimension.Day(DimInst, CalendarDimension.Shift(DimInst, uinteger.Parse(El.ToString()), 365)) As Integer;
Else
Result := -1;
End If;
// Возвращаем результат
Return Result;
End Function GetLag;
Public Function Lag(T: Object): Object;
Var
cClass: CubeClassClass;
Cube: ICubeInstance;
CubeDest: ICubeInstanceDestination;
DimInsts: ICubeInstanceDimensions;
DimInst: IDimInstance;
Res: Array Of Integer;
I: Integer;
Cnt: Integer;
Begin
// Получаем текущий куб
cClass := New CubeClassClass.Create();
Cube := cClass.CurrentCube[Null];
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 Is Array 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, Integer.Parse(T.ToString()));
End If;
End Function Lag;
После создания модуля откройте мастер редактирования стандартного куба и выполните действия:
На странице «Отношения» добавьте отношение c наименованием «Значение за предыдущий год», идентификатором YEAR_BEFORE и настройте отношение в формате пользовательской функции вида [Идентификатор модуля].Lag(T) для Fore.
На странице «Вычисляемые факты» для факта «Предыдущий год» укажите формулу «Значение за предыдущий год[Значение]» через редактор формул. После сохранения формула будет иметь вид YEAR_BEFORE[@[1]]. В окне редактирования вычисляемого факта установите флажок «Рассчитать по фактическим данным», чтобы при расчёте отношений пользовательская функция обрабатывала и возвращала массив целочисленных значений.
В результате использования отношения в формуле вычисляемого факта значение для факта «Предыдущий год» будет браться из того же дня предыдущего года, например:
См. также: