IMsCalculationChainMultiDimIterator.IterateByData

Синтаксис Fore

IterateByData: IMsDimIterateByDataOptions;

Синтаксис Fore.NET

IterateByData: Prognoz.Platform.Interop.Ms.IMsDimIterateByDataOptions;

Описание

Свойство IterateByData возвращает параметры итерации по данным.

Комментарии

Для настройки итераций по измерениям используйте свойство IMsCalculationChainMultiDimIterator.Dimensions.

Пример Fore

Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS_P», содержащего метамодель с идентификатором «METAMODEL_MULTIDIMITERATOR». Источником данных для данного контейнера является база данных временных рядов, содержащая атрибуты временных рядов с идентификаторами «CITY» и «INDICATOR». Данные атрибуты должны быть типа «Ссылка на справочник». Справочник, на который ссылается атрибут «CITY» должен содержать параметр логического типа с идентификатором «ISCAPITAL».

Также в репозитории должна быть расположена база данных временных рядов с идентификатором «TSDB», не являющаяся источником данных для контейнера моделирования «MS_P». Данная база данных временных рядов должна содержать атрибут временных рядов с идентификатором «INDICATOR». Атрибут должен быть типа «Ссылка на справочник».

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

Sub UserProc;
Var
    mb: IMetabase;
    MsKey: Integer;
    pMetaModel: IMsMetaModel;
    Ms: IMsModelSpace;
    DS, DSLinked: IRubricator;
    Attributes: IMetaAttributes;
    CDict, IDict: IMetabaseObjectDescriptor;
    Chain: IMsCalculationChainEntries;
    params: IMsModelParams;
    CParam, IParam: IMsModelParam;
    iterator: IMsCalculationChainMultiDimIterator;
    IteratorOpt: IMsDimIterateByDataOptions;
    IterStubs: IMsDimIterateByDataStubs;
    dimInstC, dimInstI, dimLinked: IDimInstance;
    IterDims: IMsDimIteratorDimensions;
    CIterDim, IIterDim: IMsDimIteratorDimension;
    Filter: IMsDimIteratorFilter;
    dimSelC, dimSelI: IDimSelection;
    IterStub: IMsDimIterateByDataStub;
    FilterDim: IMsDimIteratorFilteredDimension;
    IDimLink: IMsDimIteratorLink;
    model: IMsModel;
    Trans: IMsFormulaTransform;
    TransVar: IMsFormulaTransformVariable;
    slice: IMsFormulaTransformSlice;
    Selector: IMsFormulaTransformSelector;
    Formula: IMsFormula;
    Determ: IMsDeterministicTransform;
    TermInfo: IMsFormulaTermInfo;
    Expr: IExpression;
Begin
    // Получаем текущий репозиторий
    mb := MetabaseClass.Active;
    // Получаем ключ контейнера моделирования
    MsKey := mb.GetObjectKeyById("MS_P");
    // Получаем модель
    pMetaModel := mb.ItemByIdNamespace("METAMODEL_MULTIDIMITERATOR", MsKey).edit As IMsMetaModel;
    // Получаем контейнер моделирования
    Ms := mb.Item(MsKey).Bind As IMsModelSpace;
    // Получаем базу данных временных рядов,
    // являющуюся источником данных для контейнера моделирования
    DS := Ms.DefaultObject.Bind As IRubricator;
    // Получаем атрибуты показателей
    Attributes := DS.Facts.Attributes;
    // Получаем справочники, на которых основаны атрибуты CITY и INDICATOR
    CDict := Attributes.FindById("CITY").ValuesObject;
    IDict := Attributes.FindById("INDICATOR").ValuesObject;
    // Получаем и очищаем цепочку расчета метамодели
    Chain := pMetaModel.CalculationChain;
    Chain.Clear;
    // Получаем и очищаем параметры метамодели
    params := pMetaModel.Params;
    params.Clear;
    // Добавляем параметр, основанный на справочнике атрибута CITY
    CParam := params.Add;
    CParam.DataType := DbDataType.integer;
    CParam.DefaultValue := 1;
    CParam.Hidden := True;
    CParam.Id := "CITY";
    CParam.Name := "Город";
    CParam.LinkedObject := CDict;
    CParam.ParamType := tsparamtype.Selection;
    dimInstC := CDict.OpenWithParam("TRUE"As IDimInstance;
    dimSelC := dimInstC.CreateSelection;
    dimSelC.SelectElement(1False);
    CParam.DefaultValue := dimSelC;
    // Добавляем параметр, основанный на справочнике атрибута INDICATOR
    IParam := params.Add;
    IParam.DataType := DbDataType.Integer;
    IParam.DefaultValue := 1;
    IParam.Hidden := True;
    IParam.Id := "INDICATOR";
    IParam.Name := "Показатель";
    IParam.LinkedObject := IDict;
    IParam.ParamType := tsparamtype.Selection;
    dimInstI := IDict.Open(NullAs IDimInstance;
    dimSelI := dimInstI.CreateSelection;
    dimSelI.SelectElement(1False);
    IParam.DefaultValue := dimSelI;
    // Добавляем многомерный итератор в цепочку расчета метамодели      
    iterator := Chain.AddMultiDimIterator("Многомерный итератор");
    // Получаем параметры итератора по данным
    IteratorOpt := Iterator.IterateByData;
    // Указываем, что он активный
    IteratorOpt.Active := True;
    // Задаем источник данных для итератора
    IterStubs := IteratorOpt.Stubs;
    IterStubs.Add(DS As IVariableStub);
    // Получаем итерируемые измерения
    IterDims := Iterator.Dimensions;
    // Добавляем измерение, основанное на справочнике атрибута CITY
    CIterDim := IterDims.Add(dimInstC);
    // Указываем, что измерение параметрическое
    CIterDim.Parameter := CParam;
    // Задаем источник данных для итерируемого измерения
    CIterDim.Stubs.Add(DS As IVariableStub);
    // Задаем фильтр элементов
    Filter := CIterDim.Filter;
    dimSelC.SelectAll;
    Filter.Selection := dimSelC;
    // Добавляем измерение, основанное на справочнике атрибута INDICATOR
    IIterDim := IterDims.Add(dimInstI);
    // Указываем, что измерение параметрическое
    IIterDim.Parameter := IParam;
    // Задаем источник данных для итерируемого измерения
    IIterDim.Stubs.Add(DS As IVariableStub);
    // Задаем фильтр элементов
    Filter := IIterDim.Filter;
    dimSelI.SelectAll;
    Filter.Selection := dimSelI;
    // Получаем базу данных временных рядов TSDB
    DSLinked := mb.ItemById("TSDB").Bind As IRubricator;
    // Получаем справочник, на котором основан атрибут INDICATOR
    Attributes := DSLinked.Facts.Attributes;
    dimLinked := Attributes.FindById("INDICATOR").ValuesObject.Open(NullAs IDimInstance;
    // Добавляем справочник в качестве связанного измерения
    IDimLink := IIterDim.Links.Add(dimLinked);
    // Указываем атрибут-источник и атрибут-приёмник
    IDimLink.SourceAttribute := dimSelI.Dimension.Attributes.FindById("NAME").Attribute;
    IDimLink.DestinationAttribute := dimLinked.Attributes.FindById("NAME").Attribute;
    // Указываем источник данных связанного измерения
    IDimLink.Dimension.Stubs.Add(DSLinked As IVariableStub);
    // Получаем источник данных, по которому которому будут выполняться итерации
    // и выводим его наименование в окно консоли        
    IterStub := IterStubs.Item(0);
    Debug.WriteLine("Источник данных, по которому выполняется итерация: " + IterStub.Stub.Name);
    // Добавляем фильтрацию по измерению, на котором основан атрибут CITY
    FilterDim := IterStub.Dimension(dimInstC.InstanceModel);
    Debug.WriteLine("  Измерение фильтрации: " + FilterDim.Dimension.Name);
    FilterDim.Filter.Selection := dimSelC;
    // Указываем параметр, с которым будет открыто измерение
    FilterDim.DimOpenParam.Values := (CDict.Bind).Params.CreateEmptyValues;
    FilterDim.DimOpenParam.Values.FindById("ISCAPITAL").Value := "TRUE";
    // Добавляем фильтрацию по измерению, на котором основан атрибут INDICATOR
    FilterDim := IterStub.Dimension(dimInstI.InstanceModel);
    FilterDim.Filter.Selection := dimSelI;
    Debug.WriteLine("  Измерение фильтрации: " + FilterDim.Dimension.Name);
    // Создаем внутри многомерного итератора модель
    model := Iterator.Contents.AddExclusiveModel.Model;
    // Настраиваем модель
    Trans := model.Transform;
    // Добавляем моделируемую переменную, атрибуты которой заданы параметрами
    TransVar := Trans.Outputs.Add(DS As IVariableStub);
    Slice := TransVar.Slices.Add(Null);
    Slice.ParametrizedDimensions.Item(0).Parameter := IParam;
    Slice.ParametrizedDimensions.Item(1).Parameter := CParam;
    Selector := Trans.CreateSelector;
    Selector.Slice := Slice;
    // Настраиваем метод расчета модели: детерминированное уравнение
    Formula := Trans.Transform(Selector);
    Formula.Kind := MsFormulaKind.Deterministic;
    Determ := Formula.Method As IMsDeterministicTransform;
    // Добавляем входную переменную, атрибуты которой заданы параметрами
    TransVar := Trans.Inputs.Add(DS As IVariableStub);
    Slice := TransVar.Slices.Add(Null);
    Slice.ParametrizedDimensions.Item(0).Parameter := IParam;
    Slice.ParametrizedDimensions.Item(1).Parameter := CParam;
    TermInfo := Trans.CreateTermInfo;
    TermInfo.Slice := Slice;
    // Задаем выражение для расчета модели
    Expr := Determ.Expression;
    Expr.AsString := TermInfo.TermInnerText + "+1";
    If Expr.ErrorInfo <> Null Then
        debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
        Return;
    End If;
    // Сохраняем изменения в модели
    model.MetabaseObject.Save;
    // Сохраняем изменения в метамодели
    (pMetaModel As IMetabaseObject).Save;
End Sub UserProc;

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

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dal;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.Rds;
Imports Prognoz.Platform.Interop.Transform;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    MsKey: uinteger;
    pMetaModel: IMsMetaModel;
    Ms: IMsModelSpace;
    DS, DSLinked: IRubricator;
    Attributes: IMetaAttributes;
    CDict, IDict: IMetabaseObjectDescriptor;
    Chain: IMsCalculationChainEntries;
    MmParams: IMsModelParams;
    CParam, IParam: IMsModelParam;
    iterator: IMsCalculationChainMultiDimIterator;
    IteratorOpt: IMsDimIterateByDataOptions;
    IterStubs: IMsDimIterateByDataStubs;
    dimInstC, dimInstI, dimLinked: IDimInstance;
    IterDims: IMsDimIteratorDimensions;
    CIterDim, IIterDim: IMsDimIteratorDimension;
    Filter: IMsDimIteratorFilter;
    dimSelC, dimSelI: IDimSelection;
    IterStub: IMsDimIterateByDataStub;
    FilterDim: IMsDimIteratorFilteredDimension;
    IDimLink: IMsDimIteratorLink;
    model: IMsModel;
    Trans: IMsFormulaTransform;
    TransVar: IMsFormulaTransformVariable;
    slice: IMsFormulaTransformSlice;
    Selector: IMsFormulaTransformSelector;
    Formula: IMsFormula;
    Determ: IMsDeterministicTransform;
    TermInfo: IMsFormulaTermInfo;
    Expr: IExpression;
Begin
    // Получаем текущий репозиторий
    mb := Params.Metabase;
    // Получаем ключ контейнера моделирования
    MsKey := mb.GetObjectKeyById("MS_P");
    // Получаем модель
    pMetaModel := mb.ItemByIdNamespace["METAMODEL_MULTIDIMITERATOR", MsKey].edit() As IMsMetaModel;
    // Получаем контейнер моделирования
    Ms := mb.Item[MsKey].Bind() As IMsModelSpace;
    // Получаем базу данных временных рядов,
    // являющуюся источником данных для контейнера моделирования
    DS := Ms.DefaultObject.Bind() As IRubricator;
    // Получаем атрибуты показателей
    Attributes := DS.Facts.Attributes;
    // Получаем справочники, на которых основаны атрибуты CITY и INDICATOR
    CDict := Attributes.FindById("CITY").ValuesObject;
    IDict := Attributes.FindById("INDICATOR").ValuesObject;
    // Получаем и очищаем цепочку расчета метамодели
    Chain := pMetaModel.CalculationChain;
    Chain.Clear();
    // Получаем и очищаем параметры метамодели
    MmParams := pMetaModel.Params;
    MmParams.Clear();
    // Добавляем параметр, основанный на справочнике атрибута CITY
    CParam := MmParams.Add();
    CParam.DataType := DbDataType.ddtInteger;
    CParam.DefaultValue := 1;
    CParam.Hidden := True;
    CParam.Id := "CITY";
    CParam.Name := "Город";
    CParam.LinkedObject := CDict;
    CParam.ParamType := tsparamtype.tsptSelection;
    dimInstC := CDict.OpenWithParam("TRUE"As IDimInstance;
    dimSelC := dimInstC.CreateSelection();
    dimSelC.SelectElement(1False);
    CParam.DefaultValue := dimSelC;
    // Добавляем параметр, основанный на справочнике атрибута INDICATOR
    IParam := MmParams.Add();
    IParam.DataType := DbDataType.ddtInteger;
    IParam.DefaultValue := 1;
    IParam.Hidden := True;
    IParam.Id := "INDICATOR";
    IParam.Name := "Показатель";
    IParam.LinkedObject := IDict;
    IParam.ParamType := tsparamtype.tsptSelection;
    dimInstI := IDict.Open(NullAs IDimInstance;
    dimSelI := dimInstI.CreateSelection();
    dimSelI.SelectElement(1False);
    IParam.DefaultValue := dimSelI;
    // Добавляем многомерный итератор в цепочку расчета метамодели      
    iterator := Chain.AddMultiDimIterator("Многомерный итератор");
    // Получаем параметры итератора по данным
    IteratorOpt := Iterator.IterateByData;
    // Указываем, что он активный
    IteratorOpt.Active := True;
    // Задаем источник данных для итератора
    IterStubs := IteratorOpt.Stubs;
    IterStubs.Add(DS As IVariableStub);
    // Получаем итерируемые измерения
    IterDims := Iterator.Dimensions;
    // Добавляем измерение, основанное на справочнике атрибута CITY
    CIterDim := IterDims.Add(dimInstC);
    // Указываем, что измерение параметрическое
    CIterDim.Parameter := CParam;
    // Задаем источник данных для итерируемого измерения
    CIterDim.Stubs.Add(DS As IVariableStub);
    // Задаем фильтр элементов
    Filter := CIterDim.Filter;
    dimSelC.SelectAll();
    Filter.Selection := dimSelC;
    // Добавляем измерение, основанное на справочнике атрибута INDICATOR
    IIterDim := IterDims.Add(dimInstI);
    // Указываем, что измерение параметрическое
    IIterDim.Parameter := IParam;
    // Задаем источник данных для итерируемого измерения
    IIterDim.Stubs.Add(DS As IVariableStub);
    // Задаем фильтр элементов
    Filter := IIterDim.Filter;
    dimSelI.SelectAll();
    Filter.Selection := dimSelI;
    // Получаем базу данных временных рядов TSDB
    DSLinked := mb.ItemById["TSDB"].Bind() As IRubricator;
    // Получаем справочник, на котором основан атрибут INDICATOR
    Attributes := DSLinked.Facts.Attributes;
    dimLinked := Attributes.FindById("INDICATOR").ValuesObject.Open(NullAs IDimInstance;
    // Добавляем справочник в качестве связанного измерения
    IDimLink := IIterDim.Links.Add(dimLinked);
    // Указываем атрибут-источник и атрибут-приёмник
    IDimLink.SourceAttribute := dimSelI.Dimension.Attributes.FindById("NAME").Attribute;
    IDimLink.DestinationAttribute := dimLinked.Attributes.FindById("NAME").Attribute;
    // Указываем источник данных связанного измерения
    IDimLink.Dimension.Stubs.Add(DSLinked As IVariableStub);
    // Получаем источник данных, по которому которому будут выполняться итерации
    // и выводим его наименование в окно консоли        
    IterStub := IterStubs.Item[0];
    System.Diagnostics.Debug.WriteLine("Источник данных, по которому выполняется итерация: " + IterStub.Stub.Name);
    // Добавляем фильтрацию по измерению, на котором основан атрибут CITY
    FilterDim := IterStub.Dimension[dimInstC.InstanceModel];
    System.Diagnostics.Debug.WriteLine("  Измерение фильтрации: " + FilterDim.Dimension.Name);
    FilterDim.Filter.Selection := dimSelC;
    // Указываем параметр, с которым будет открыто измерение
    FilterDim.DimOpenParam.Values := (CDict.Bind()).Params.CreateEmptyValues();
    FilterDim.DimOpenParam.Values.FindById("ISCAPITAL").Value := "TRUE";
    // Добавляем фильтрацию по измерению, на котором основан атрибут INDICATOR
    FilterDim := IterStub.Dimension[dimInstI.InstanceModel];
    FilterDim.Filter.Selection := dimSelI;
    System.Diagnostics.Debug.WriteLine("  Измерение фильтрации: " + FilterDim.Dimension.Name);
    // Создаем внутри многомерного итератора модель
    model := Iterator.Contents.AddExclusiveModel().Model;
    // Настраиваем модель
    Trans := model.Transform;
    // Добавляем моделируемую переменную, атрибуты которой заданы параметрами
    TransVar := Trans.Outputs.Add(DS As IVariableStub);
    Slice := TransVar.Slices.Add(Null);
    Slice.ParametrizedDimensions.Item[0].Parameter := IParam;
    Slice.ParametrizedDimensions.Item[1].Parameter := CParam;
    Selector := Trans.CreateSelector();
    Selector.Slice := Slice;
    // Настраиваем метод расчета модели: детерминированное уравнение
    Formula := Trans.Transform[Selector];
    Formula.Kind := MsFormulaKind.mfkDeterministic;
    Determ := Formula.Method As IMsDeterministicTransform;
    // Добавляем входную переменную, атрибуты которой заданы параметрами
    TransVar := Trans.Inputs.Add(DS As IVariableStub);
    Slice := TransVar.Slices.Add(Null);
    Slice.ParametrizedDimensions.Item[0].Parameter := IParam;
    Slice.ParametrizedDimensions.Item[1].Parameter := CParam;
    TermInfo := Trans.CreateTermInfo();
    TermInfo.Slice := Slice;
    // Задаем выражение для расчета модели
    Expr := Determ.Expression;
    Expr.AsString := TermInfo.TermInnerText + "+1";
    If Expr.ErrorInfo <> Null Then
        System.Diagnostics.Debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
        Return;
    End If;
    // Сохраняем изменения в модели
    model.MetabaseObject.Save();
    // Сохраняем изменения в метамодели
    (pMetaModel As IMetabaseObject).Save();
End Sub;

См. также:

IMsCalculationChainMultiDimIterator