IMsProblemCalculationCallback.OnBeforeSaveDataEx

Синтаксис

OnBeforeSaveDataEx(Args: IMsProblemCalculationCallbackOnBeforeSaveDataArgs);

Параметры

Args. Аргументы события.

Описание

Метод OnBeforeSaveDataEx реализует событие, происходящее перед сохранением данных с возможностью задать дополнительные параметры сохранения.

Комментарии

Событие OnBeforeSaveDataEx наступает после OnBeforeSaveData.

Пример

Для выполнения примера предполагается наличие в репозитории алгоритма расчёта с идентификатором ALGORITHM. В алгоритме расчёта должны содержаться настроенные объекты, для источников данных включено кеширование.

Добавьте ссылки на системные сборки: Algo, Metabase, Ms. Также добавьте ссылку на сборку, необходимую для работы с алгоритмом расчёта.

Sub UserProc;
Var
    MB: IMetabase;
    MObj: IMetabaseObjectDescriptor;
    Algo: ICalcObject;
    CalcAlgo: ICalcAlgorithm;
    BaseExecutor: IAlgorithmBaseExecutor;
    ParamValues: IAlgorithmParameterValues;
    MsProblem: IMsProblem;
    ProblemCalculation: IMsProblemCalculation;
    CalcSettings: IMsProblemCalculationSettings;
Begin
    MB := MetabaseClass.Active;
    // Алгоритм расчёта
    MObj := MB.ItemById("ALGORITHM");
    Algo := CalcObjectFactory.CreateCalcObject(MObj, True);
    CalcAlgo := Algo As ICalcAlgorithm;
    // Объект для расчёта задачи моделирования
    BaseExecutor := CalcAlgo As IAlgorithmBaseExecutor;
    // Параметры алгоритма расчёта
    ParamValues := BaseExecutor.ParamValues;
    ParamValues.StartDate := DateTime.ComposeDay(200011);
    ParamValues.EndDate := DateTime.ComposeDay(202011);
    // Способ обработки ошибок, которые могут возникнуть при расчёте
    BaseExecutor.ErrorState := SkipErrorState.Abort;
    // Получаем задачу моделирования, на основе которой строится алгоритм.
    // И рассчитываем её с настройками по умолчанию.
    MsProblem := BaseExecutor.MsProblem;
    Debug.WriteLine("Запуск задачи моделирования алгоритма: '" + MObj.Name + "'");
    CalcSettings := MsProblem.CreateCalculationSettings;
    // Обработчик событий
    CalcSettings.Callback := New MCallback.Create;
    // Объект, осуществляющий расчёт
    ProblemCalculation := MsProblem.Calculate(CalcSettings);
    // Запуск расчёта
    ProblemCalculation.Run;
    Debug.WriteLine("Расчёт завершён.");
End Sub UserProc;

Public Class MCallback: ProblemCalculationCallback
    Public Sub OnBeforeSaveDataEx(Args: IMsProblemCalculationCallbackOnBeforeSaveDataArgs);
    Begin
        Args.NeedSaveChangeHistory := False;
        Args.SaveDataMode := CubeStorageSaveDataMode.Db;
    End Sub OnBeforeSaveDataEx;

    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;

При выполнении примера для алгоритма расчёта будут заданы начало и окончание периода расчёта. Будет получена и запущена задача моделирования, которая используется алгоритмом. При возникновении какой-либо ошибки расчёт будет остановлен. Результаты расчёта сохраняются только в базу данных без обновления кеша приёмников. Если для кубов-приёмников включено ведении истории изменений, то новой ревизии в истории создано не будет.

См. также:

IMsProblemCalculationCallback