Copying Expression for Metamodel Calculation Condition

Contents

Description

Requirements

Fore Example

Fore.NET Example

Result of the Fore and Fore.NET Examples Execution

Description

Consider copying an expression for calculation condition from one metamodel to another one.

Requirements

Executing the example requires that the repository contains a modeling container with the MS identifier, which contains metamodels with the METAMODEL, METAMODEL_DEST identifiers and a models with the MODEL_DEFAULT and MODEL identifiers. Models are based on the data from the time series database containing mandatory attribute being a link to the MDM dictionary with the DICT_COUNTRY identifier. This dictionary is stored in the MDM repository with the MDM_REPO identifier. The METAMODEL_DEST metamodel must contain calculation condition.

Add links to the Dal, Metabase, Ms system assemblies. For the Fore.NET example add a link to the Fore, ForeSystem system assemblies.

Fore Example

Sub UserProc;
Var
    mb: IMetabase;
    MsKey: Integer;
    pMetaModelSrc, pMetaModelDest: IMsMetaModel;
    param: IMsModelParam;
    params: IMsModelParams;
    branchScr, branchDest: IMsCalculationChainBranch;
    cas, casDest: IMsBranchCase;
    pCondExpr, pCondExprDest: IMsBranchConditionExpression;
    expr, exprDest: IExpression;
    CalcChain: IMsCalculationChainEntries;
    CalcEntry: IMsCalculationChainEntry;
    i, k, n: Integer;
    CondDest: IMsBranchCondition;
    gen: IMsTransformStringGenerator;
    s: String;
Begin
    mb := MetabaseClass.Active;
    // Get modeling container
    MsKey := mb.GetObjectKeyById("MS");
    // Get metamodel
    pMetaModelSrc := mb.ItemByIdNamespace("METAMODEL", MsKey).Edit As IMsMetaModel;
    // Create a parameter in the metamodel    
    params := pMetaModelSrc.Params;
    params.Clear;
    param := params.Add;
    param.Hidden := True;
    param.LinkedObject := mb.ItemByIdNamespace("DIC_COUNTRY", mb.GetObjectKeyById("MDM_REPO")).Bind;
    param.DataType := DbDataType.String;
    // Clear metamodel calculation chain
    pMetaModelSrc.CalculationChain.Clear;
    // Add condition to the metamodel calculation chain
    branchScr := pMetaModelSrc.CalculationChain.AddBranch("Condition");
    // Specify condition parameter
    branchScr.Parameter := param;
    // Create condition branch
    cas := branchScr.CaseList.Add;
    // Specify a model which will be calculated if no condition branch is executed
    branchScr.DefaultContents.AddModel(mb.ItemByIdNamespace("MODEL_DEFAULT", MsKey).Bind As IMsModel);
    // Specify a model which is calculated on executing a condition
    cas.Contents.AddModel(mb.ItemByIdNamespace("MODEL", MsKey).Bind As IMsModel);
    // Specify branch calculation condition
    pCondExpr := cas.Conditions.Add(MsBranchConditionType.Expression) As IMsBranchConditionExpression;
    expr := pCondExpr.Expression;
    expr.AsString := "{" + param.Id + "}=" + """" + "World" + """";
    If expr.ErrorInfo <> Null
        Then
            // If the expression contains error, display it in the console window
            Debug.WriteLine(expr.ErrorInfo.ErrorMessage);
        Else
            // Save changes in the metamodel
            (pMetaModelSrc As IMetabaseObject).Save;
            // Get the metamodel to which the expression for calculating the condition will be copied
            pMetaModelDest := mb.ItemByIdNamespace("METAMODEL_DEST", MsKey).Edit As IMsMetaModel;
            // Create a parameter in the metamodel    
            params := pMetaModelSrc.Params;
            params.Clear;
            param := params.Add;
            param.Hidden := True;
            param.LinkedObject := mb.ItemByIdNamespace("DIC_COUNTRY", mb.GetObjectKeyById("MDM_REPO")).Bind;
            param.DataType := DbDataType.String;
            // Get metamodel calculation chain
            CalcChain := pMetaModelDest.CalculationChain;
            For i := 0 To CalcChain.Count - 1 Do
                CalcEntry := CalcChain.Item(i);
                // Get conditions from the calculation chain
                If CalcEntry.Type = MsCalculationChainEntryType.Branch Then
                    branchDest := CalcEntry As IMsCalculationChainBranch;
                    // Search in condition branches
                    For k := 0 To branchDest.CaseList.Count - 1 do
                        casDest := branchDest.CaseList.Item(k);
                        // Pick conditional branches
                        For n := 0 To casDest.Conditions.Count - 1 Do
                            CondDest := casDest.Conditions.Item(n);
                            // Copy condition expression from one branch to another
                            If CondDest.Type = MsBranchConditionType.Expression Then
                                pCondExprDest := CondDest As IMsBranchConditionExpression;
                                gen := pCondExpr.Transform.CreateStringGenerator;
                                s := gen.Execute;
                                s := String.Remove(s, 03);
                                exprDest := pCondExprDest.Expression;
                                exprDest.AsString := s;
                                If exprDest.ErrorInfo <> Null Then
                                    // If the branch contains error, display it in the console window
                                    Debug.WriteLine("Condition expression contains error: " + exprDest.ErrorInfo.ErrorMessage);
                                    Else
                                        // Save changes in the metamodel
                                        (pMetaModelDest As IMetabaseObject).Save;
                                End If;
                            End If;
                        End For;
                    End For;
                End If;
            End For;
    End If;
End Sub UserProc;

Fore.NET Example

Imports Prognoz.Platform.Interop.Dal;
Imports Prognoz.Platform.Interop.Fore;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Ms;

Public Shared Sub UserProc(Par: StartParams);
Var
    mb: IMetabase;
    MsKey: uinteger;
    pMetaModelSrc, pMetaModelDest: IMsMetaModel;
    param: IMsModelParam;
    params: IMsModelParams;
    branchScr, branchDest: IMsCalculationChainBranch;
    cas, casDest: IMsBranchCase;
    pCondExpr, pCondExprDest: IMsBranchConditionExpression;
    expr, exprDest: IExpression;
    CalcChain: IMsCalculationChainEntries;
    CalcEntry: IMsCalculationChainEntry;
    i, k, n: Integer;
    CondDest: IMsBranchCondition;
    gen: IMsTransformStringGenerator;
    sClass: StringClass;
    s: String;
Begin
    mb := Par.Metabase;
    // Get modeling container
    MsKey := mb.GetObjectKeyById("MS");
    // Get metamodel
    pMetaModelSrc := mb.ItemByIdNamespace["METAMODEL", MsKey].Edit() As IMsMetaModel;
    // Create a parameter in the metamodel    
    params := pMetaModelSrc.Params;
    params.Clear();
    param := params.Add();
    param.Hidden := True;
    param.LinkedObject := mb.ItemByIdNamespace["DIC_COUNTRY", mb.GetObjectKeyById("MDM_REPO")].Bind();
    param.DataType := DbDataType.ddtString;
    // Clear metamodel calculation chain
    pMetaModelSrc.CalculationChain.Clear();
    // Add condition to the metamodel calculation chain
    branchScr := pMetaModelSrc.CalculationChain.AddBranch("Condition");
    // Specify condition parameter
    branchScr.Parameter := param;
    // Create condition branch
    cas := branchScr.CaseList.Add();
    // Specify a model which will be calculated if no condition branch is executed
    branchScr.DefaultContents.AddModel(mb.ItemByIdNamespace["MODEL_DEFAULT", MsKey].Bind() As IMsModel);
    // Specify a model which is calculated on executing a condition
    cas.Contents.AddModel(mb.ItemByIdNamespace["MODEL", MsKey].Bind() As IMsModel);
    // Specify branch calculation condition
    pCondExpr := cas.Conditions.Add(MsBranchConditionType.mbctExpression) As IMsBranchConditionExpression;
    expr := pCondExpr.Expression;
    expr.AsString := "{" + param.Id + "}=" + """" + "World" + """";
    If expr.ErrorInfo <> Null
        Then
            // If the expression contains error, display it in the console window
            System.Diagnostics.Debug.WriteLine(expr.ErrorInfo.ErrorMessage);
        Else
            // Save changes in the metamodel
            (pMetaModelSrc As IMetabaseObject).Save();
            // Get the metamodel to which the expression for calculating the condition will be copied
            pMetaModelDest := mb.ItemByIdNamespace["METAMODEL_DEST", MsKey].Edit() As IMsMetaModel;
            // Create a parameter in the metamodel    
            params := pMetaModelSrc.Params;
            params.Clear();
            param := params.Add();
            param.Hidden := True;
            param.LinkedObject := mb.ItemByIdNamespace["DIC_COUNTRY", mb.GetObjectKeyById("MDM_REPO")].Bind();
            param.DataType := DbDataType.ddtString;
            // Get metamodel calculation chain
            CalcChain := pMetaModelDest.CalculationChain;
            For i := 0 To CalcChain.Count - 1 Do
                CalcEntry := CalcChain.Item[i];
                // Get conditions from the calculation chain
                If CalcEntry.Type = MsCalculationChainEntryType.mccetBranch Then
                    branchDest := CalcEntry As IMsCalculationChainBranch;
                    // Search in condition branches
                    For k := 0 To branchDest.CaseList.Count - 1 do
                        casDest := branchDest.CaseList.Item[k];
                        // Pick conditional branches
                        For n := 0 To casDest.Conditions.Count - 1 Do
                            CondDest := casDest.Conditions.Item[n];
                            // Copy condition expression from one branch to another
                            If CondDest.Type = MsBranchConditionType.mbctExpression Then
                                pCondExprDest := CondDest As IMsBranchConditionExpression;
                                gen := pCondExpr.Transform.CreateStringGenerator();
                                sClass := New StringClass.Create();
                                s := sClass.Remove(gen.Execute(), 03);
                                exprDest := pCondExprDest.Expression;
                                exprDest.AsString := s;
                                If exprDest.ErrorInfo <> Null Then
                                    // If the branch contains error, display it in the console window
                                    System.Diagnostics.Debug.WriteLine("Condition expression contains error: " + exprDest.ErrorInfo.ErrorMessage);
                                    Else
                                        // Save changes in the metamodel
                                        (pMetaModelDest As IMetabaseObject).Save();
                                End If;
                            End If;
                        End For;
                    End For;
                End If;
            End For;
    End If;
End Sub UserProc;

Result of the Fore and Fore.NET Examples Execution

After executing the example the calculation condition is added in the METAMODEL metamodel. Expression of this condition is copied to the calculation condition of the METAMODEL_DEST metamodel.

See also:

Examples | IMsBranchCondition | IMsMetaModel