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(2000, 1, 1);
ParamValues.EndDate := DateTime.ComposeDay(2020, 1, 1);
// Способ обработки ошибок, которые могут возникнуть при расчёте
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;
При выполнении примера для алгоритма расчёта будут заданы начало и окончание периода расчёта. Будет получена и запущена задача моделирования, которая используется алгоритмом. При возникновении какой-либо ошибки расчёт будет остановлен. Результаты расчёта сохраняются только в базу данных без обновления кеша приёмников. Если для кубов-приёмников включено ведении истории изменений, то новой ревизии в истории создано не будет.
См. также: