OnBeforeSaveData(Stub: IVariableStub; Matrix: IMatrix; Var ValueFlag: Integer; Var Cancel: Boolean);
OnBeforeSaveData(Stub: Prognoz.Platform.Interop.Cubes.IVariableStub; Matrix: Prognoz.Platform.Interop.Matrix.IMatrix; Var ValueFlag: Integer; Var Cancel: Boolean);
Stub. Источник, в который сохраняются данные.
Matrix. Матрица с сохраняемыми значениями.
ValueFlag. Флаг, который имеют изменившиеся значения в матрице Matrix.
Cancel. Признак отмены сохранения данных.
Метод OnBeforeSaveData реализует событие, происходящее перед сохранением данных.
В переменной Matrix будут доступны исходные и расчётные данные. Исходные данные будут иметь флаг изменившихся значений 0. Расчётные данные будут иметь флаг, равный значению параметра ValueFlag. ValueFlag будет соответствовать значению, заданному в свойстве IMsProblem.ValueFlag или IMsProblemCalculationSettings.ValueFlag. При необходимости можно изменить данные в матрице, а также изменить флаг в параметре ValueFlag. Сохранены будут только те значения, у которых флаг изменившихся значений совпадает со значением параметра ValueFlag.
После сохранения данных будет сгенерировано событие OnSaveData.
Если необходимо отменить сохранение данных, то задайте в параметре Cancel значение True или в параметре ValueFlag значение 0.
Для выполнения примера предполагается наличие базы данных временных рядов с идентификатором «TSDB». В контейнере моделирования, который является дочерним объектом базы, создана задача моделирования с идентификатором «TSDB_PROBLEM».
Добавьте ссылки на системные сборки: Cubes, Matrix, Metabase, Ms, Ui.
Sub UserProc;
Var
Mb: IMetabase;
Rub: IRubricator;
Problem: IMsProblem;
Calculation: IMsProblemCalculation;
CalcSettings: IMsProblemCalculationSettings;
Begin
Mb := MetabaseClass.Active;
Rub := MB.ItemById("TSDB").Bind As IRubricator;
// Получаем задачу в контейнере моделирования БДВР
Problem := Mb.ItemByIdNamespace("TSDB_PROBLEM", Rub.ModelSpace.Key).Edit As IMsProblem;
// Флаг, который будет присвоен изменившимся данным
Problem.ValueFlag := 2;
// Задаем параметры расчёта задачи
CalcSettings := Problem.CreateCalculationSettings;
CalcSettings.FactIncluded := True;
CalcSettings.BreakOnError := True;
Calculation := Problem.Calculate(CalcSettings);
// Задаем обработчик событий
Calculation.Callback := New MCallback.Create;
// Выполняем расчёт
Calculation.Run;
End Sub UserProc;
Public Class MCallback: ProblemCalculationCallback
Public Sub OnBeforeSaveData(Stub: IVariableStub; Matrix: IMatrix; Var ValueFlag: Integer; Var Cancel: Boolean);
Var
Iter: IMatrixIterator;
Begin
If Not WinApplication.ConfirmationBox("Сохранить данные?", Null) Then
Cancel := True;
End If;
Iter := Matrix.CreateIterator;
Iter.Move(IteratorDirection.First);
While Iter.Valid Do
If Iter.ValueFlag <> 0 Then
If Iter.Value < 100 Then
Iter.ValueFlag := ValueFlag + 1;
End If;
End If;
Iter.Move(IteratorDirection.Next);
End While;
// Увеличим значение флага изменённых данных, которые будут сохранены, на 1
ValueFlag := ValueFlag + 1;
End Sub OnBeforeSaveData;
Public Sub OnSaveData(Stub: IVariableStub; Matrix: IMatrix; ValueFlag: Integer; AuditRecordKey: Variant);
Var
Iter: IMatrixIterator;
RecordCount: Integer;
Begin
Iter := Matrix.CreateIterator;
Iter.Move(IteratorDirection.First);
While Iter.Valid Do
If Iter.ValueFlag = ValueFlag Then
RecordCount := RecordCount + 1;
End If;
Iter.Move(IteratorDirection.Next);
End While;
Debug.WriteLine("Данные сохранены на ValueFlag: " + ValueFlag.ToString + #13 + #10 +
"Количество сохранённых значений: " + RecordCount.ToString + #13 + #10 +
"Ключ записи в протоколе доступа: " + AuditRecordKey);
End Sub OnSaveData;
End Class MCallback;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.Ui;
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
Rub: IRubricator;
Problem: IMsProblem;
Calculation: IMsProblemCalculation;
CalcSettings: IMsProblemCalculationSettings;
Begin
Mb := Params.Metabase;
Rub := MB.ItemById["TSDB"].Bind() As IRubricator;
// Получаем задачу в контейнере моделирования БДВР
Problem := Mb.ItemByIdNamespace["TSDB_PROBLEM", Rub.ModelSpace.Key].Edit() As IMsProblem;
// Флаг, который будет присвоен изменившимся данным
Problem.ValueFlag := 2;
// Задаем параметры расчёта задачи
CalcSettings := Problem.CreateCalculationSettings();
CalcSettings.FactIncluded := True;
CalcSettings.BreakOnError := True;
Calculation := Problem.Calculate(CalcSettings);
// Задаем обработчик событий
Calculation.Callback := New MCallback();
// Выполняем расчёт
Calculation.Run();
End Sub;
Public Class MCallback: IMsProblemCalculationCallback
Public Sub OnBeforeSaveData(Stub: IVariableStub; Matrix: IMatrix; Var ValueFlag: Integer; Var Cancel: Boolean);
Var
WinAppCls: WinApplicationClass = New WinApplicationClassClass();
Iter: IMatrixIterator;
Begin
If Not WinAppCls.ConfirmationBox("Сохранить данные?", Null) Then
Cancel := True;
End If;
Iter := Matrix.CreateIterator();
Iter.Move(IteratorDirection.itdFirst);
While Iter.Valid Do
If Iter.ValueFlag <> 0 Then
If Double.Parse(Iter.Value.ToString()) < 100 Then
Iter.ValueFlag := 3;
End If;
End If;
Iter.Move(IteratorDirection.itdNext);
End While;
// Увеличим значение флага изменённых данных, которые будут сохранены, на 1
ValueFlag := 3;
End Sub;
Public Sub OnSaveData(Stub: IVariableStub; Matrix: IMatrix; ValueFlag: Integer; AuditRecordKey: Object);
Var
Iter: IMatrixIterator;
RecordCount: Integer;
Begin
Iter := Matrix.CreateIterator();
Iter.Move(IteratorDirection.itdFirst);
While Iter.Valid Do
If Iter.ValueFlag = ValueFlag Then
RecordCount := RecordCount + 1;
End If;
Iter.Move(IteratorDirection.itdNext);
End While;
System.Diagnostics.Debug.WriteLine("Данные сохранены на ValueFlag: " + ValueFlag.ToString() + char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10) +
"Количество сохранённых значений: " + RecordCount.ToString() + char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10) +
"Ключ записи в протоколе доступа: " + AuditRecordKey);
End Sub;
Public Sub OnBreak(Breakp: IMsBreakpoint);
Begin
End Sub;
Public Sub OnMessage(Message: String);
Begin
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " > " + Message);
End Sub;
Public Sub OnError(Message: String);
Begin
End Sub;
Public Sub OnFinish();
Begin
End Sub;
Public Sub OnModelCalculation(Model: IMsModel);
Begin
End Sub;
Public Sub OnStep();
Begin
End Sub;
Public Sub OnWarning(Message: string);
Begin
End Sub;
Public Sub OnStageStart(Stage: MsProblemCalculationStage; Data: object);
Begin
End Sub;
Public Sub OnStageFinish(Stage: MsProblemCalculationStage; Duration: Integer; Data: object);
Begin
End Sub;
Public Function OnGetActiveEvents(): MsProblemCalculationCallbackEvents;
Begin
Return MsProblemCalculationCallbackEvents.mspceAll
End Function;
End Class;
В результате выполнения примера будет осуществлён расчёт задачи моделирования. Рассчитанные значения будут иметь флаг 2 (ValueFlag = 2).
В событии, которое отслеживает сохранение данных, будет выдан запрос на сохранение. При утвердительном ответе для рассчитанных значений меньше 100 будет установлен флаг 3. После этого все значения, имеющие флаг 3, будут сохранены в базу данных временных рядов. После сохранения в консоль среды разработки будет выведена информация о количестве сохранённых значений и ключе записи в протоколе доступа, соответствующей сохранению данных.
См. также: