Compare(Right: IMsCalculationStats): IMsCalculationStatsDiffList;
Right. Сравниваемые статистики расчёта.
Метод Compare сравнивает статистики между собой.
Для сравнения статистик расчёта сохраните результат статистик в XML-файл с помощью метода IMsCalculationStats.SaveToXml.
Сравнение производится между одинаковыми статистиками. Результатом сравнения будет являться коллекция, содержащая информацию только по тем статистикам, значения которых различны.
Для выполнения примера предполагается наличие в репозитории контейнера моделирования с идентификатором «CONT_MODEL», в котором создана задача моделирования с идентификатором «PROBLEM». В файловой системе должен быть сохранён файл со статистиками предыдущего расчёта задачи «D:\Work\Stats.xml».
Добавьте ссылки на системные сборки: Metabase, Ms, Xml (в Fore.NET - сборка MsXml2).
Sub UserProc;
Var
Mb: IMetabase;
Problem: IMsProblem;
Settings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
OldStats, NewStats: IMsCalculationStats;
Doc: IXMLDOMDocument3;
Elem: IXmlDomElement;
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;
// Статистика выполнения задачи
NewStats := Calc.Stats;
// Загрузим предыдущую статистику из файла и сравним
Doc := New FreeThreadedDOMDocument60.Create;
Doc.load("D:\Work\Stats.xml");
Elem := doc.selectSingleNode("Stats") As IXmlDomElement;
OldStats := New MsCalculationStats.Create;
OldStats.LoadFromXml(Elem);
// Сравнение статистик
ShowCompareResult(NewStats.Compare(OldStats));
End Sub UserProc;
Sub ShowCompareResult(DiffList: IMsCalculationStatsDiffList);
Var
Diff: IMsCalculationStatsDiff;
Left, Right: IMsCalculationStatNode;
i: Integer;
Begin
Debug.WriteLine("Количество найденных различий: " + DiffList.Count.ToString);
Debug.Indent;
For i := 0 To DiffList.Count - 1 Do
Diff := DiffList.Item(i);
Left := Diff.Left;
Right := Diff.Right;
Debug.Write(Left.Name + ": ");
Debug.Write("Расчитанное значение: "); ShowValue(Left.Value);
Debug.Write(". Полученное из файла значение: "); ShowValue(Right.Value);
Debug.WriteLine("");
End For;
Debug.Unindent;
End Sub ShowCompareResult;
Sub ShowValue(Value: Variant);
Var
Values: Array Of Variant;
j: Integer;
Combined: String;
Begin
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(Value);
End If;
End Sub ShowValue;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.MsXml2;
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
Problem: IMsProblem;
Settings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
OldStats, NewStats: MsCalculationStats;
Doc: IXMLDOMDocument3 = New FreeThreadedDOMDocument60();
Elem: IXmlDomElement;
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();
// Статистика выполнения задачи
NewStats := Calc.Stats;
// Загрузим предыдущую статистику из файла и сравним
Doc.load("D:\Work\Stats.xml");
Elem := doc.selectSingleNode("Stats") As IXmlDomElement;
OldStats := New MsCalculationStatsClass();
OldStats.LoadFromXml(Elem);
// Сравнение статистик
ShowCompareResult(NewStats.Compare(OldStats));
End Sub;
Shared Sub ShowCompareResult(DiffList: IMsCalculationStatsDiffList);
Var
Diff: IMsCalculationStatsDiff;
Left, Right: IMsCalculationStatNode;
i: Integer;
Begin
System.Diagnostics.Debug.WriteLine("Количество найденных различий: " + DiffList.Count.ToString());
System.Diagnostics.Debug.Indent();
For i := 0 To DiffList.Count - 1 Do
Diff := DiffList.Item[i];
Left := Diff.Left;
Right := Diff.Right;
System.Diagnostics.Debug.Write(Left.Name + ": ");
System.Diagnostics.Debug.Write("Расчитанное значение: "); ShowValue(Left.Value);
System.Diagnostics.Debug.Write(". Полученное из файла значение: "); ShowValue(Right.Value);
System.Diagnostics.Debug.WriteLine("");
End For;
System.Diagnostics.Debug.Unindent();
End Sub;
Shared Sub ShowValue(Value: Object);
Var
Values: Array;
j: Integer;
Combined: String;
Begin
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(Value);
End If;
End Sub;
При выполнении примера будет запущен расчёт указанной задачи моделирования и получена статистика расчёта. После этого будет осуществлено сравнение полученной статистики со статистикой, сохранённой в файл. Если имеются различия, то они будут выведены в консоль среды разработки.
См. также: