Создание стандартного куба

Рассмотрим пример создания стандартного куба с использованием языка Fore/Fore.NET. Для создания куба необходимо наличие в репозитории следующих объектов:

  1. Справочник фактов с идентификатором «FACTS».

  2. Справочник стран с идентификатором «COUNTRY».

  3. Календарный справочник с идентификатором «CALENDAR».

  4. Таблица с идентификатором «STD_DATA», имеющая в своей структуре следующие поля:

Указанный ниже пример создает в корневой папке репозитория новый объект - Стандартный куб и производит настройку его параметров:

Для выполнения примеров добавьте ссылки на системные сборки: Cubes, Db, Dimensions, Metabase. Для Fore.NET пример также пропишите соответствующие строки Imports.

Пример Fore

Sub CreateStdCube;
Var
    MB: IMetabase;
    CrInfo: IMetabaseObjectCreateInfo;
    MObj: IMetabaseObject;
    StdCube: IStandardCube;
    StdDims: IStandardCubeDimensions;
    StdDatasets: IStandardCubeDatasets;
    FactDim, CountryDim, CalendarDim: IStandardCubeDimension;
    StdDataset: IStandardCubeDataset;
    FactDimInst: IDimInstance;
    KeyAttribute: IDimAttributeInstance;
    FactBindings: IStandardCubeFactBindings;
    DimBinding: IStandardCubeDimensionBinding;
    DimIndex: IDimIndex;
    Relation: IStandardCubeRelation;
    DataSet_ID: String = "STD_DATA";
Begin
    MB := MetabaseClass.Active;
    //Информация для создания нового объекта репозитория
    CrInfo := MB.CreateCreateInfo;
    CrInfo.ClassID := MetabaseObjectClass.KE_CLASS_STDCUBE;
    CrInfo.Id := "New_Std_Cube";
    CrInfo.Name := "Новый стандартный куб";
    CrInfo.Parent := MB.Root;
    //Создание куба
    MObj := MB.CreateObject(CrInfo).Edit;
    StdCube := MObj As IStandardCube;
    //Настройка параметров куба
    StdDims := StdCube.Dimensions;
    StdDatasets := StdCube.Datasets;
    //Задаем в качестве измерения фактов - существующий справочник репозитория
    FactDim := StdDims.Add(MB.ItemById("FACTS").Bind As IDimensionModel);
    StdCube.ExternalFactDimension := True;
    FactDim.FactDimension := True;
    //Добавляем источник данных
    StdDataset := StdDatasets.Add(MB.ItemById(DataSet_ID).Bind As IDatasetModel);
    //Привязка факта куба
    FactDimInst := FactDim.OpenDimension;
    KeyAttribute := FactDimInst.Attributes.FindById("KEY");
    FactBindings := FactDim.FactBindings(StdDataset);
    FactBindings.Binding(KeyAttribute.Value(0)).Formula.AsString := DataSet_ID + ".VALUE";
    //Добавление измерений
    CountryDim := StdDims.Add(MB.ItemById("COUNTRY").Bind As IDimensionModel);
    CalendarDim := StdDims.Add(MB.ItemById("CALENDAR").Bind As IDimensionModel);
    //Привязка измерений
    //"Страны"
    DimIndex := CountryDim.Dimension.Indexes.PrimaryIndex;
    DimBinding := CountryDim.Binding(StdDataset);
    DimBinding.Index := DimIndex;
    DimBinding.Binding(DimIndex.Attributes.Item(0)).AsString := DataSet_ID + ".COUNTRY_KEY";
    //"Календарь"
    DimIndex := CalendarDim.Dimension.Blocks.Item("YEARS").Indexes.FindById("INDEX_BLOCK");
    DimBinding := CalendarDim.Binding(StdDataset);
    DimBinding.Index := DimIndex;
    DimBinding.Binding(DimIndex.Attributes.Item(0)).AsString := DataSet_ID + ".V_DATE";
    //Создание и настройка отношения
    Relation := StdCube.Relations.Add;
    Relation.Name := "Сдвиг на точку";
    Relation.Id := "BEFORE";
    Relation.Relation(CalendarDim).AsString := "T.PREV";
    //Задание формулы для вычисляемого факта
    StdCube.CalcBindings.Binding(KeyAttribute.Value(1)).Formula.AsString := "@[" + KeyAttribute.Value(0) + "]-BEFORE[@[" + KeyAttribute.Value(0) + "]]";
    MObj.Save;
End Sub CreateStdCube;

Пример Fore.NET

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Db;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Metabase;

Public Sub CreateStdCube(MB: IMetabase);
Var
    CrInfo: IMetabaseObjectCreateInfo;
    MObj: IMetabaseObject;
    StdCube: IStandardCube;
    StdDims: IStandardCubeDimensions;
    StdDatasets: IStandardCubeDatasets;
    FactDim, CountryDim, CalendarDim: IStandardCubeDimension;
    StdDataset: IStandardCubeDataset;
    FactDimInst: IDimInstance;
    KeyAttribute: IDimAttributeInstance;
    FactBindings: IStandardCubeFactBindings;
    DimBinding: IStandardCubeDimensionBinding;
    DimIndex: IDimIndex;
    Relation: IStandardCubeRelation;
    DataSet_ID: String = "STD_DATA";
Begin
    //Информация для создания нового объекта репозитория
    CrInfo := MB.CreateCreateInfo();
    CrInfo.ClassID := MetabaseObjectClass.KE_CLASS_STDCUBE As Integer;
    CrInfo.Id := "New_Std_Cube";
    CrInfo.Name := "Новый стандартный куб";
    CrInfo.Parent := MB.Root;
    //Создание куба
    MObj := MB.CreateObject(CrInfo).Edit();
    StdCube := MObj As IStandardCube;
    //Настройка параметров куба
    StdDims := StdCube.Dimensions;
    StdDatasets := StdCube.Datasets;
    //Задаем в качестве измерения фактов - существующий справочник репозитория
    FactDim := StdDims.Add(MB.ItemById["FACTS"].Bind() As IDimensionModel);
    StdCube.ExternalFactDimension := True;
    FactDim.FactDimension := True;
    //Добавляем источник данных
    StdDataset := StdDatasets.Add(MB.ItemById[DataSet_ID].Bind() As IDatasetModel);
    //Привязка факта куба
    FactDimInst := FactDim.OpenDimension;
    KeyAttribute := FactDimInst.Attributes.FindById("KEY");
    FactBindings := FactDim.FactBindings[StdDataset];
    FactBindings.Binding[KeyAttribute.Value[0]].Formula.AsString := DataSet_ID + ".VALUE";
    //Добавление измерений
    CountryDim := StdDims.Add(MB.ItemById["COUNTRY"].Bind() As IDimensionModel);
    CalendarDim := StdDims.Add(MB.ItemById["CALENDAR"].Bind() As IDimensionModel);
    //Привязка измерений
    //"Страны"
    DimIndex := CountryDim.Dimension.Indexes.PrimaryIndex;
    DimBinding := CountryDim.Binding[StdDataset];
    DimBinding.Index := DimIndex;
    DimBinding.Binding[DimIndex.Attributes.Item[0]].AsString := DataSet_ID + ".COUNTRY_KEY";
    //"Календарь"
    DimIndex := CalendarDim.Dimension.Blocks.Item["YEARS"].Indexes.FindById("INDEX_BLOCK");
    DimBinding := CalendarDim.Binding[StdDataset];
    DimBinding.Index := DimIndex;
    DimBinding.Binding[DimIndex.Attributes.Item[0]].AsString := DataSet_ID + ".V_DATE";
    //Создание и настройка отношения
    Relation := StdCube.Relations.Add();
    Relation.Name := "Сдвиг на точку";
    Relation.Id := "BEFORE";
    Relation.Relation[CalendarDim].AsString := "T.PREV";
    //Задание формулы для вычисляемого факта
    StdCube.CalcBindings.Binding[KeyAttribute.Value[1]].Formula.AsString := "@[" + KeyAttribute.Value[0] + "]-BEFORE[@[" + KeyAttribute.Value[0] + "]]";
    MObj.Save();
End Sub;

См. также:

Примеры