IMsCalculationChainMultiDimIterator.IterateByData

Fore Syntax

IterateByData: IMsDimIterateByDataOptions;

Fore.NET Syntax

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

Description

The IterateByData property returns iteration parameters by data.

Comments

To set up iterations by dimensions, use the IMsCalculationChainMultiDimIterator.Dimensions property.

Fore Example

Executing the example requires that the repository contains a modeling container with the MS_P identifier that contains a metamodel with the METAMODEL_MULTIDIMITERATOR identifier. A data source for this container is a time series database containing time series attributes with the CITY and INDICATOR identifiers. Those attributes should be of the Link to dictionary type. The dictionary to which the CITY attribute is referred should contain parameter of a local type with the ISCAPITAL identifier.

The repository should also contain time series database with the TSDB identifier which is not a data source for the MS_P modeling container. This time series database should contain time series attribute with the INDICATOR identifier. The attribute should be of the Link to dictionary type.

Add links to the Cubes, Dal, Dimensions, Metabase, Ms, Rds, Transform system assemblies.

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
    // Get current repository
    mb := MetabaseClass.Active;
    // Get modelling container key
    MsKey := mb.GetObjectKeyById("MS_P");
    // Get the model
    pMetaModel := mb.ItemByIdNamespace("METAMODEL_MULTIDIMITERATOR", MsKey).edit As IMsMetaModel;
    // Get modeling container
    Ms := mb.Item(MsKey).Bind As IMsModelSpace;
    // Get time series database
    // which is a data source for modeling container
    DS := Ms.DefaultObject.Bind As IRubricator;
    // Get factor attributes
    Attributes := DS.Facts.Attributes;
    // Get dictionaries used as a base for the CITY and INDICATOR attributes
    CDict := Attributes.FindById("CITY").ValuesObject;
    IDict := Attributes.FindById("INDICATOR").ValuesObject;
    // Get and clear metamodel calculation chain
    Chain := pMetaModel.CalculationChain;
    Chain.Clear;
    // Get and clear metamodel parameters
    params := pMetaModel.Params;
    params.Clear;
    // Add a parameter based on dictionary of the CITY attribute
    CParam := params.Add;
    CParam.DataType := DbDataType.integer;
    CParam.DefaultValue := 1;
    CParam.Hidden := True;
    CParam.Id := "CITY";
    CParam.Name := "City";
    CParam.LinkedObject := CDict;
    CParam.ParamType := tsparamtype.Selection;
    dimInstC := CDict.OpenWithParam("TRUE"As IDimInstance;
    dimSelC := dimInstC.CreateSelection;
    dimSelC.SelectElement(1False);
    CParam.DefaultValue := dimSelC;
    // Add a parameter based on dictionary of the INDICATOR attribute
    IParam := params.Add;
    IParam.DataType := DbDataType.Integer;
    IParam.DefaultValue := 1;
    IParam.Hidden := True;
    IParam.Id := "INDICATOR";
    IParam.Name := "Factor";
    IParam.LinkedObject := IDict;
    IParam.ParamType := tsparamtype.Selection;
    dimInstI := IDict.Open(NullAs IDimInstance;
    dimSelI := dimInstI.CreateSelection;
    dimSelI.SelectElement(1False);
    IParam.DefaultValue := dimSelI;
    // Add a multidimensional iterator to metamodel calculation chain      
    iterator := Chain.AddMultiDimIterator("Multidimensional iterator");
    // Get iterator parameters by data
    IteratorOpt := Iterator.IterateByData;
    // Specify that it is active
    IteratorOpt.Active := True;
    // Set data source for iterator
    IterStubs := IteratorOpt.Stubs;
    IterStubs.Add(DS As IVariableStub);
    // Get iterated dimensions
    IterDims := Iterator.Dimensions;
    // Add a dimension based on dictionary of the CITY attribute
    CIterDim := IterDims.Add(dimInstC);
    // Specify that dimension is parametric
    CIterDim.Parameter := CParam;
    // Set data source for iterated dimension
    CIterDim.Stubs.Add(DS As IVariableStub);
    // Set filter of elements
    Filter := CIterDim.Filter;
    dimSelC.SelectAll;
    Filter.Selection := dimSelC;
    // Add a dimension based on dictionary of the INDICATOR attribute
    IIterDim := IterDims.Add(dimInstI);
    // Specify that dimension is parametric
    IIterDim.Parameter := IParam;
    // Set data source for iterated dimension
    IIterDim.Stubs.Add(DS As IVariableStub);
    // Set filter of elements
    Filter := IIterDim.Filter;
    dimSelI.SelectAll;
    Filter.Selection := dimSelI;
    // Get the TSDB time series database
    DSLinked := mb.ItemById("TSDB").Bind As IRubricator;
    // Get dictionary, on which the INDICATOR attribute is based
    Attributes := DSLinked.Facts.Attributes;
    dimLinked := Attributes.FindById("INDICATOR").ValuesObject.Open(NullAs IDimInstance;
    // Add dictionary as a linked dimension
    IDimLink := IIterDim.Links.Add(dimLinked);
    // Specify source attribute and consumer attribute
    IDimLink.SourceAttribute := dimSelI.Dimension.Attributes.FindById("NAME").Attribute;
    IDimLink.DestinationAttribute := dimLinked.Attributes.FindById("NAME").Attribute;
    // Specify data source of linked dimension
    IDimLink.Dimension.Stubs.Add(DSLinked As IVariableStub);
    // Get data source, using which iterations will be executed
    // and display its name in the console window      
    IterStub := IterStubs.Item(0);
    Debug.WriteLine("Data source used for iteration execution: " + IterStub.Stub.Name);
    // Add a filtering by dimension, on which the CITY attribute is based
    FilterDim := IterStub.Dimension(dimInstC.InstanceModel);
    Debug.WriteLine("  Filtering dimension: " + FilterDim.Dimension.Name);
    FilterDim.Filter.Selection := dimSelC;
    // Determine parameter used for dimension opening
    FilterDim.DimOpenParam.Values := (CDict.Bind).Params.CreateEmptyValues;
    FilterDim.DimOpenParam.Values.FindById("ISCAPITAL").Value := "TRUE";
    // Add a filtering by dimension, on which the INDICATOR attribute is based
    FilterDim := IterStub.Dimension(dimInstI.InstanceModel);
    FilterDim.Filter.Selection := dimSelI;
    Debug.WriteLine("  Filtering dimension: " + FilterDim.Dimension.Name);
    // Create a model inside multidimensional iterator
    model := Iterator.Contents.AddExclusiveModel.Model;
    // Set up model
    Trans := model.Transform;
    // Add a modelling variable which attributes are set by the parameters
    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;
    // Set up model calculation method: determinate equation
    Formula := Trans.Transform(Selector);
    Formula.Kind := MsFormulaKind.Deterministic;
    Determ := Formula.Method As IMsDeterministicTransform;
    // Add input variable which attributes are set by the parameters
    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;
    // Set expression for model calculation
    Expr := Determ.Expression;
    Expr.AsString := TermInfo.TermInnerText + "+1";
    If Expr.ErrorInfo <> Null Then
        debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
        Return;
    End If;
    // Save changes in model
    model.MetabaseObject.Save;
    // Save changes in metamodel
    (pMetaModel As IMetabaseObject).Save;
End Sub UserProc;

After executing the example, multidimensional data iterator will be created in metamodel.The model calculated only by the dimension points containing data is created inside the iterator.

Fore.NET Example

The requirements and result of the Fore.NET example execution match with those in the Fore example.

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
    // Get current repository
    mb := Params.Metabase;
    // Get modelling container key
    MsKey := mb.GetObjectKeyById("MS_P");
    // Get the model
    pMetaModel := mb.ItemByIdNamespace["METAMODEL_MULTIDIMITERATOR", MsKey].edit() As IMsMetaModel;
    // Get modeling container
    Ms := mb.Item[MsKey].Bind() As IMsModelSpace;
    // Get time series database
    // which is a data source for modeling container
    DS := Ms.DefaultObject.Bind() As IRubricator;
    // Get factor attributes
    Attributes := DS.Facts.Attributes;
    // Get dictionaries used as a base for the CITY and INDICATOR attributes
    CDict := Attributes.FindById("CITY").ValuesObject;
    IDict := Attributes.FindById("INDICATOR").ValuesObject;
    // Get and clear metamodel calculation chain
    Chain := pMetaModel.CalculationChain;
    Chain.Clear();
    // Get and clear metamodel parameters
    MmParams := pMetaModel.Params;
    MmParams.Clear();
    // Add a parameter based on dictionary of the CITY attribute
    CParam := MmParams.Add();
    CParam.DataType := DbDataType.ddtInteger;
    CParam.DefaultValue := 1;
    CParam.Hidden := True;
    CParam.Id := "CITY";
    CParam.Name := "City";
    CParam.LinkedObject := CDict;
    CParam.ParamType := tsparamtype.tsptSelection;
    dimInstC := CDict.OpenWithParam("TRUE"As IDimInstance;
    dimSelC := dimInstC.CreateSelection();
    dimSelC.SelectElement(1False);
    CParam.DefaultValue := dimSelC;
    // Add a parameter based on dictionary of the INDICATOR attribute
    IParam := MmParams.Add();
    IParam.DataType := DbDataType.ddtInteger;
    IParam.DefaultValue := 1;
    IParam.Hidden := True;
    IParam.Id := "INDICATOR";
    IParam.Name := "Factor";
    IParam.LinkedObject := IDict;
    IParam.ParamType := tsparamtype.tsptSelection;
    dimInstI := IDict.Open(NullAs IDimInstance;
    dimSelI := dimInstI.CreateSelection();
    dimSelI.SelectElement(1False);
    IParam.DefaultValue := dimSelI;
    // Add a multidimensional iterator to metamodel calculation chain      
    iterator := Chain.AddMultiDimIterator("Multidimensional iterator");
    // Get iterator parameters by data
    IteratorOpt := Iterator.IterateByData;
    // Specify that it is active
    IteratorOpt.Active := True;
    // Set data source for iterator
    IterStubs := IteratorOpt.Stubs;
    IterStubs.Add(DS As IVariableStub);
    // Get iterated dimensions
    IterDims := Iterator.Dimensions;
    // Add a dimension based on dictionary of the CITY attribute
    CIterDim := IterDims.Add(dimInstC);
    // Specify that dimension is parametric
    CIterDim.Parameter := CParam;
    // Set data source for iterated dimension
    CIterDim.Stubs.Add(DS As IVariableStub);
    // Set filter of elements
    Filter := CIterDim.Filter;
    dimSelC.SelectAll();
    Filter.Selection := dimSelC;
    // Add a dimension based on dictionary of the INDICATOR attribute
    IIterDim := IterDims.Add(dimInstI);
    // Specify that dimension is parametric
    IIterDim.Parameter := IParam;
    // Set data source for iterated dimension
    IIterDim.Stubs.Add(DS As IVariableStub);
    // Set filter of elements
    Filter := IIterDim.Filter;
    dimSelI.SelectAll();
    Filter.Selection := dimSelI;
    // Get the TSDB time series database
    DSLinked := mb.ItemById["TSDB"].Bind() As IRubricator;
    // Get dictionary, on which the INDICATOR attribute is based
    Attributes := DSLinked.Facts.Attributes;
    dimLinked := Attributes.FindById("INDICATOR").ValuesObject.Open(NullAs IDimInstance;
    // Add dictionary as a linked dimension
    IDimLink := IIterDim.Links.Add(dimLinked);
    // Specify source attribute and consumer attribute
    IDimLink.SourceAttribute := dimSelI.Dimension.Attributes.FindById("NAME").Attribute;
    IDimLink.DestinationAttribute := dimLinked.Attributes.FindById("NAME").Attribute;
    // Specify data source of linked dimension
    IDimLink.Dimension.Stubs.Add(DSLinked As IVariableStub);
    // Get data source, using which iterations will be executed
    // and display its name in the console window      
    IterStub := IterStubs.Item[0];
    System.Diagnostics.Debug.WriteLine("Data source used for iteration: " + IterStub.Stub.Name);
    // Add a filtering by dimension, on which the CITY attribute is based
    FilterDim := IterStub.Dimension[dimInstC.InstanceModel];
    System.Diagnostics.Debug.WriteLine("  Filtering dimension: " + FilterDim.Dimension.Name);
    FilterDim.Filter.Selection := dimSelC;
    // Determine parameter used for dimension opening
    FilterDim.DimOpenParam.Values := (CDict.Bind()).Params.CreateEmptyValues();
    FilterDim.DimOpenParam.Values.FindById("ISCAPITAL").Value := "TRUE";
    // Add a filtering by dimension, on which the INDICATOR attribute is based
    FilterDim := IterStub.Dimension[dimInstI.InstanceModel];
    FilterDim.Filter.Selection := dimSelI;
    System.Diagnostics.Debug.WriteLine("  Filtering dimension: " + FilterDim.Dimension.Name);
    // Create a model inside multidimensional iterator
    model := Iterator.Contents.AddExclusiveModel().Model;
    // Set up model
    Trans := model.Transform;
    // Add a modelling variable which attributes are set by the parameters
    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;
    // Set up model calculation method: determined equation
    Formula := Trans.Transform[Selector];
    Formula.Kind := MsFormulaKind.mfkDeterministic;
    Determ := Formula.Method As IMsDeterministicTransform;
    // Add input variable which attributes are set by parameters
    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;
    // Set expression to calculate model
    Expr := Determ.Expression;
    Expr.AsString := TermInfo.TermInnerText + "+1";
    If Expr.ErrorInfo <> Null Then
        System.Diagnostics.Debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
        Return;
    End If;
    // Save changes in model
    model.MetabaseObject.Save();
    // Save changes in metamodel
    (pMetaModel As IMetabaseObject).Save();
End Sub;

See also:

IMsCalculationChainMultiDimIterator