IMsProblemCalculationCallback.OnBeforeSaveData

Синтаксис

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("Сохранить данные?"NullThen
            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("Сохранить данные?"NullThen
            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, будут сохранены в базу данных временных рядов. После сохранения в консоль среды разработки будет выведена информация о количестве сохранённых значений и ключе записи в протоколе доступа, соответствующей сохранению данных.

См. также:

IMsProblemCalculationCallback