Использования табличного справочника НСИ в качестве измерения стандартного куба

На языке Fore и Fore.NET приведены примеры использования табличного справочника НСИ в качестве измерения стандартного куба.

Для выполнения примеров предполагается наличие репозитория НСИ с идентификатором «RDS_REPO», базы данных с идентификатором «DB» и стандартного куба с идентификатором «CUBE».

Результат выполнения примеров: в репозитории «RDS_REPO» будет создан табличный справочник НСИ, содержащий уникальный ключ. Затем данный справочник будет добавлен в качестве измерения в стандартный куб «CUBE». Привязка осуществляется по первичному индексу первого блока измерения.

Пример Fore

Добавьте ссылки на системные сборки «Metabase», «Cubes», «Rds», «Dimensions» и «Db».

Sub UserProc;
Var
    Mb: IMetabase;
    Inf: IMetabaseObjectCreateInfo;
    Des: IMetabaseObjectDescriptor;
    RdsDict: IRdsDictionary;
    UniqKey: IRdsUniqueKey;
    Cube: IStandardCube;
    CubeDims: IStandardCubeDimensions;
    Dim: IDimensionModel;
    StdDim: IStandardCubeDimension;
    i: Integer;
    StDataset: IStandardCubeDataset;
    StDimBind: IStandardCubeDimensionBinding;
    Index: IDimIndex;
    Attr: IDimAttribute;
    Field: IDatasetModelField;
    Dataset: IDatasetModel;
Begin
    Mb := MetabaseClass.Active;
// Создаем табличный справочник НСИ.
    Inf := Mb.CreateCreateInfo;
    Inf.ClassId := MetabaseObjectClass.KE_CLASS_METADICTIONARYRDS;
    Inf.Name := Inf.DefaultName;
    Inf.Parent := Mb.ItemById("RDS_REPO");
    Inf.KeepEdit := True;
    Des := Mb.CreateObject(Inf);
    RdsDict := Des As IRdsDictionary;
    RdsDict.Database := Mb.ItemById("DB").Bind As IDatabase;
// Создаем уникальный ключ справочника
    UniqKey := RdsDict.UniqueKeys.Add;
    UniqKey.Id := "UniqKey_1";
    UniqKey.Name := "Уникальный ключ";
    UniqKey.Contains(RdsDict.Attributes.Key) := True;
    (RdsDict As IMetabaseObject).Save;
// Задаем этот справочник в качестве измерения стандартного куба.
// Привязываем по первичным индексам.
    Cube := Mb.ItemById("CUBE").Edit As IStandardCube;
    CubeDims := Cube.Dimensions;
    Dim := Des As IDimensionModel;
    StdDim := CubeDims.Add(Dim);
    Index := Dim.Indexes.PrimaryIndex;
    Attr := Index.Attributes.Item(0);
    For i := 0 To Cube.Datasets.Count - 1 Do
        StDataset := Cube.Datasets.Item(i);
        StDimBind := StdDim.Binding(StDataset);
        Index := Dim.Indexes.PrimaryIndex;
        StDimBind.Index := Index;
        Dataset := StDataset.Dataset;
        Field := Dataset.Fields.Item(0);
        StDimBind.Binding(Attr).AsString := (Dataset As IMetabaseObject).Id + "." + Field.Id;
    End For;
    (Cube As IMetabaseObject).Save;
End Sub UserProc;

Пример Fore.NET

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

Public Shared Sub Main(Params: StartParams);
Var
    Mb: IMetabase;
    Inf: IMetabaseObjectCreateInfo;
    Des: IMetabaseObjectDescriptor;
    RdsDict: IRdsDictionary;
    UniqKey: IRdsUniqueKey;
    Cube: IStandardCube;
    CubeDims: IStandardCubeDimensions;
    Dim: IDimensionModel;
    StdDim: IStandardCubeDimension;
    i: Integer;
    StDataset: IStandardCubeDataset;
    StDimBind: IStandardCubeDimensionBinding;
    Index: IDimIndex;
    Attr: IDimAttribute;
    Field: IDatasetModelField;
    Dataset: IDatasetModel;
Begin
    Mb := Params.Metabase;
// Создаем табличный справочник НСИ.
    Inf := Mb.CreateCreateInfo();
    Inf.ClassId := MetabaseObjectClass.KE_CLASS_METADICTIONARYRDS As integer;
    Inf.Name := Inf.DefaultName;
    Inf.Parent := Mb.ItemById["RDS_REPO"];
    Inf.KeepEdit := True;
    Des := Mb.CreateObject(Inf);
    RdsDict := Des As IRdsDictionary;
    RdsDict.Database := Mb.ItemById["DB"].Bind() As IDatabase;
// Создаем уникальный ключ справочника
    UniqKey := RdsDict.UniqueKeys.Add();
    UniqKey.Id := "UniqKey_1";
    UniqKey.Name := "Уникальный ключ";
    UniqKey.Contains[RdsDict.Attributes.Key] := True;
    (RdsDict As IMetabaseObject).Save();
// Задаем этот справочник в качестве измерения стандартного куба.
// Привязываем по пользовательским индексам.
    Cube := Mb.ItemById["CUBE"].Edit() As IStandardCube;
    CubeDims := Cube.Dimensions;
    Dim := Des As IDimensionModel;
    StdDim := CubeDims.Add(Dim);
    Index := Dim.Indexes.PrimaryIndex;
    Attr := Index.Attributes.Item[0];
    For i := 0 To Cube.Datasets.Count - 1 Do
        StDataset := Cube.Datasets.Item[i];
        StDimBind := StdDim.Binding[StDataset];
        StDimBind.Index := Index;
        Dataset := StDataset.Dataset;
        Field := Dataset.Fields.Item[0];
        StDimBind.Binding[Attr].AsString := (Dataset As IMetabaseObject).Id + "." + Field.Id;
    End For;
    (Cube As IMetabaseObject).Save();
End Sub;

См. также:

Примеры | IRdsDictionary