Для выполнения примеров в репозитории предполагается наличие контейнера моделирования с идентификатором «CONT_MODEL». Данный контейнер должен содержать задачу с идентификатором «PROBLEM_1».
Добавьте ссылки на системные сборки «Metabase», «Ms».
Public Class MCallback: Object, IMsProblemCalculationCallback
Public Calculation: IMsProblemCalculation;
Public Sub OnError(Message: String);
Begin
Debug.WriteLine(Message);
End Sub OnError;
Public Sub OnFinish;
Begin
Debug.WriteLine("Расчет задачи завершен");
Calculation := Null;
End Sub OnFinish;
Public Sub OnMessage(Message: String);
Begin
Debug.Write(DateTime.Now);
Debug.WriteLine(": " + Message);
End Sub OnMessage;
Public Sub OnModelCalculation(Model: IMsModel);
Begin
Debug.WriteLine("Расчет модели: " + (Model As IMetabaseObject).Id);
End Sub OnModelCalculation;
Public Sub OnStep;
Begin
Debug.WriteLine("Выполнено шагов: " + Calculation.PointPassed.ToString +
" из " + Calculation.PointCount.ToString);
End Sub OnStep;
Public Sub OnBreak(Breakpoint: IMsBreakpoint);
Begin
Debug.WriteLine(Breakpoint.Name);
End Sub OnBreak;
Public Sub OnWarning(Message: string);
Begin
Debug.WriteLine("Предупреждение: " + Message);
End Sub OnWarning;
End Class MCallback;
Sub UserProc;
Var
MB: IMetabase;
Ms: IMetabaseObjectDescriptor;
Problem: IMsProblem;
CallBack: MCallback;
CalcSett: IMsProblemCalculationSettings;
Scens: IMsProblemScenarios;
Calculation: IMsProblemCalculation;
i: Integer;
Begin
MB := MetabaseClass.Active;
Ms := MB.ItemById("CONT_MODEL");
Problem := MB.ItemByIdNamespace("PROBLEM_1", Ms.Key).Bind As IMsProblem;
CallBack := New MCallback.Create;
CalcSett := Problem.CreateCalculationSettings;
CalcSett.Callback := CallBack;
Scens := Problem.Scenarios;
For i := 0 To Scens.Count - 1 Do
CalcSett.ScenarioIncluded(Scens.Item(i)) := True;
End For;
Calculation := Problem.Calculate(CalcSett);
Calculation.SaveHistory := True;
CallBack.Calculation := Calculation;
Calculation.Run;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Ms;
…
Public Class MCallback: Object, IMsProblemCalculationCallback
Public Calculation: IMsProblemCalculation;
Public Sub OnError(Message: String);
Begin
System.Diagnostics.Debug.WriteLine(Message);
End Sub OnError;
Public Sub OnFinish();
Begin
System.Diagnostics.Debug.WriteLine("Расчет задачи завершен");
Calculation := Null;
End Sub OnFinish;
Public Sub OnMessage(Message: String);
Begin
System.Diagnostics.Debug.Write(DateTime.Now);
System.Diagnostics.Debug.WriteLine(": " + Message);
End Sub OnMessage;
Public Sub OnModelCalculation(Model: IMsModel);
Begin
System.Diagnostics.Debug.WriteLine("Расчет модели: " + (Model As IMetabaseObject).Id);
End Sub OnModelCalculation;
Public Sub OnStep();
Begin
System.Diagnostics.Debug.WriteLine("Выполнено шагов: " + Calculation.PointPassed.ToString() +
" из " + Calculation.PointCount.ToString());
End Sub OnStep;
Public Sub OnBreak(Breakpoint: IMsBreakpoint);
Begin
System.Diagnostics.Debug.WriteLine(Breakpoint.Name);
End Sub OnBreak;
Public Sub OnWarning(Message: string);
Begin
System.Diagnostics.Debug.WriteLine("Предупреждение: " + Message);
End Sub OnWarning;
End Class MCallback;
Public Class Program
[STAThread]
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
Ms: IMetabaseObjectDescriptor;
Problem: IMsProblem;
CallBack: MCallback;
CalcSett: IMsProblemCalculationSettings;
Scens: IMsProblemScenarios;
Calculation: IMsProblemCalculation;
i: Integer;
Begin
MB := Params.Metabase;
Ms := MB.ItemById["CONT_MODEL"];
Problem := MB.ItemByIdNamespace["PROBLEM_1", Ms.Key].Bind() As IMsProblem;
CallBack := New MCallback.Create();
CalcSett := Problem.CreateCalculationSettings();
CalcSett.Callback := CallBack;
Scens := Problem.Scenarios;
For i := 0 To Scens.Count - 1 Do
CalcSett.ScenarioIncluded[Scens.Item[i]] := True;
End For;
Calculation := Problem.Calculate(CalcSett);
Calculation.SaveHistory := True;
CallBack.Calculation := Calculation;
Calculation.Run();
End Sub;
End Class;
После выполнения примера будет осуществлен расчет задачи с идентификатором «PROBLEM_1». Расчет будет производиться по всем сценариям, содержащимся в задаче. Для обработки событий, происходящих во время расчета, используется объект пользовательского класса «MCallback». История расчёта будет сохранена.
См. также: