The Root property determines a root node of statistics tree.
To execute th example, make sure that the repository contains a modeling container with the CONT_MODEL identifier and a modeling problem with the PROBLEM identifier.
Add links to the Metabase, Ms system assemblies.
Sub UserProc;
Var
Mb: IMetabase;
Problem: IMsProblem;
Settings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
Begin
Mb := MetabaseClass.Active;
// Get modeling problem
Problem := Mb.ItemByIdNamespace("PROBLEM", Mb.GetObjectKeyById("CONT_MODEL")).EditTemporary As IMsProblem;
Settings := Problem.CreateCalculationSettings;
// Set calculation statistics drill down
Settings.StatsLevel := MsCalculationStatsLevel.Basic;
Calc := Problem.Calculate(Settings);
// Calculate modeling problem and calculation statistics
Calc.Run;
// Display result in the console
ShowStats(Calc.Stats);
End Sub UserProc;
Sub ShowStats(Stats: IMsCalculationStats);
Var
Node: IMsCalculationStatNode;
Nodes: IMsCalculationStatNodes;
Begin
// Build calculation statistics tree
Node := Stats.Root;
Node.Name := "Calculation statistics:";
Debug.WriteLine(Node.Name);
Nodes := Stats.Root.Children;
For Each Node In Nodes Do
ShowNode(Node);
End For;
End Sub ShowStats;
Sub ShowNode(StatNode: IMsCalculationStatNode);
Var
j: Integer;
Node: IMsCalculationStatNode;
Value: Variant;
Values: Array Of Variant;
Combined: String;
Begin
// Build calculation statistics tree nodes
Debug.Indent;
Debug.Write(StatNode.Name + ": " + StatNode.Id + "; " + StatNode.Type.ToString);
Value := StatNode.Value;
If Value Is Array Then
Values := Value As Array;
For j := 0 To Values.Length - 1 Do
If Not Combined.IsEmpty Then
Combined := Combined + ", ";
End If;
Combined := Combined + Values[j];
End For;
Debug.Write("[" + Combined + "]");
Combined := "";
Elseif Value Is IMsDatePeriod Then
Debug.Write((Value As IMsDatePeriod).Start.ToString + " - " + (Value As IMsDatePeriod).End_.ToString);
Else
Debug.Write("; " + StatNode.Value);
End If;
Debug.WriteLine("");
If StatNode.Children.Count > 0 Then
For Each Node In StatNode.Children Do
ShowNode(Node);
End For;
End If;
Debug.Unindent;
End Sub ShowNode;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Ms;
…
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
Problem: IMsProblem;
Settings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
Begin
Mb := Params.Metabase;
// Get modeling problem
Problem := Mb.ItemByIdNamespace["PROBLEM", Mb.GetObjectKeyById("CONT_MODEL")].EditTemporary() As IMsProblem;
Settings := Problem.CreateCalculationSettings();
// Set calculation statistics drill down
Settings.StatsLevel := MsCalculationStatsLevel.mcslBasic;
Calc := Problem.Calculate(Settings);
// Calculate modeling problem and calculation statistics
Calc.Run();
// Display results
ShowStats(Calc.Stats);
End Sub;
Public Shared Sub ShowStats(Stats: IMsCalculationStats);
Var
Node: IMsCalculationStatNode;
Nodes: IMsCalculationStatNodes;
Begin
// Build calculation statistics tree
Node := Stats.Root;
Node.Name := "Calculation statistics:";
System.Diagnostics.Debug.WriteLine(Node.Name);
Nodes := Stats.Root.Children;
For Each Node In Nodes Do
ShowNode(Node);
End For;
End Sub ShowStats;
Public Shared Sub ShowNode(StatNode: IMsCalculationStatNode);
Var
j: Integer;
Node: IMsCalculationStatNode;
Value: Object;
Values: Array;
Combined: String;
Begin
// Build calculation statistics tree nodes
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.Write(StatNode.Name + ": " + StatNode.Id + "; " + StatNode.Type.ToString());
Value := StatNode.Value;
If Value Is Array Then
Values := Value As Array;
For j := 0 To Values.Length - 1 Do
If Not String.IsNullOrEmpty(Combined) Then
Combined := Combined + ", ";
End If;
Combined := Combined + Values[j];
End For;
System.Diagnostics.Debug.Write("[" + Combined + "]");
Combined := "";
Elseif Value Is IMsDatePeriod Then
System.Diagnostics.Debug.Write((Value As IMsDatePeriod).Start.ToString() + " - " + (Value As IMsDatePeriod).@End.ToString());
Else
System.Diagnostics.Debug.Write("; " + StatNode.Value);
End If;
System.Diagnostics.Debug.WriteLine("");
If StatNode.Children.Count > 0 Then
For Each Node In StatNode.Children Do
ShowNode(Node);
End For;
End If;
System.Diagnostics.Debug.Unindent();
End Sub ShowNode;
After executing the example, the specified modeling problem with the PROBLEM identifier is calculated.
The console displays calculation statistics with identifier, calculation type and value:
Calculation statistics:
Load data: LOADSTEP; 0;
Calculation time (sec): ELAPSEDTIME; 1; 0.094
Statistical data: TSDB_STAT; 0;
External matrix: EXTERNALMATRIX; 0; 0
Number of points: POINTCOUNT; 0; 31
Calculation: CALCSTEP; 0;
Calculation time (sec): ELAPSEDTIME; 1; 0
Multidimensional iterator: ; 0;
Save data: SAVESTEP; 0;
Calculation time (sec): ELAPSEDTIME; 1; 0
Statistical data: TSDB_STAT; 0;
External matrix: EXTERNALMATRIX; 0; 0
Number of points: POINTCOUNT; 0; 31
Number of changed points: CHANGEDPOINTCOUNT; 0; 0
See also: