Свойство Root определяет корневую вершину дерева статистик.
Для выполнения примера убедитесь, что в репозитории содержится контейнер моделирования с идентификатором CONT_MODEL и задача моделирования с идентификатором PROBLEM.
Добавьте ссылки на системные сборки: Metabase, Ms.
Sub UserProc;
Var
Mb: IMetabase;
Problem: IMsProblem;
Settings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
Begin
Mb := MetabaseClass.Active;
// Получим задачу моделирования
Problem := Mb.ItemByIdNamespace("PROBLEM", Mb.GetObjectKeyById("CONT_MODEL")).EditTemporary As IMsProblem;
Settings := Problem.CreateCalculationSettings;
// Зададим детализацию статистик расчета
Settings.StatsLevel := MsCalculationStatsLevel.Basic;
Calc := Problem.Calculate(Settings);
// Рассчитаем задачу моделирования и статистики расчета
Calc.Run;
// Выведем результат в консоль
ShowStats(Calc.Stats);
End Sub UserProc;
Sub ShowStats(Stats: IMsCalculationStats);
Var
Node: IMsCalculationStatNode;
Nodes: IMsCalculationStatNodes;
Begin
// Построим дерево статистик расчета
Node := Stats.Root;
Node.Name := "Статистики расчета:";
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
// Построим вершины дерева статистик расчета
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;
// Получим задачу моделирования
Problem := Mb.ItemByIdNamespace["PROBLEM", Mb.GetObjectKeyById("CONT_MODEL")].EditTemporary() As IMsProblem;
Settings := Problem.CreateCalculationSettings();
// Зададим детализацию статистик расчета
Settings.StatsLevel := MsCalculationStatsLevel.mcslBasic;
Calc := Problem.Calculate(Settings);
// Рассчитаем задачу моделирования и статистики расчета
Calc.Run();
// Вывод результатов
ShowStats(Calc.Stats);
End Sub;
Public Shared Sub ShowStats(Stats: IMsCalculationStats);
Var
Node: IMsCalculationStatNode;
Nodes: IMsCalculationStatNodes;
Begin
// Построим дерево статистик расчета
Node := Stats.Root;
Node.Name := "Статистики расчета:";
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
// Построим вершины дерева статистик расчета
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;
После выполнения примера будет запущен расчет заданной задачи моделирования с идентификатором PROBLEM.
В консоль будут выведены статистики расчета с идентификатором, типом расчета и значением:
Статистики расчета:
Загрузка данных: LOADSTEP; 0;
Время расчета (с): ELAPSEDTIME; 1; 0.094
Статистические данные: TSDB_STAT; 0;
Внешняя матрица: EXTERNALMATRIX; 0; 0
Количество точек: POINTCOUNT; 0; 31
Расчет: CALCSTEP; 0;
Время расчета (с): ELAPSEDTIME; 1; 0
Многомерный итератор: ; 0;
Сохранение данных: SAVESTEP; 0;
Время расчета (с): ELAPSEDTIME; 1; 0
Статистические данные: TSDB_STAT; 0;
Внешняя матрица: EXTERNALMATRIX; 0; 0
Количество точек: POINTCOUNT; 0; 31
Количество изменённых точек: CHANGEDPOINTCOUNT; 0; 0
См. также: