LockWrite;
Метод LockWrite осуществляет блокировку на запись данных.
После окончания изменения данных для снятия блокировки выполните метод UnlockWrite.
Для выполнения примера предполагается наличие в репозитории куба с идентификатором «STD_CUBE». Для куба включена возможность кэширования данных.
Sub UserProc;
Var
MB: IMetabase;
CubeInst: ICubeInstance;
CubeDest: ICubeInstanceDestination;
Executor: ICubeInstanceDestinationExecutor;
Sels: IDimSelectionSet;
Sel: IDimSelection;
ResultMatrix: IMatrix;
Iter: IMatrixIterator;
IterMutex: IRWMutex;
Begin
MB := MetabaseClass.Active;
//Открываем куб
CubeInst := MB.ItemById("STD_CUBE").Open(Null) As ICubeInstance;
CubeDest := CubeInst.Destinations.DefaultDestination;
Executor := CubeDest.CreateExecutor;
//Отметка, в соответствии с которой будет формироваться матрица данных
Sels := CubeDest.CreateDimSelectionSet;
For Each Sel In Sels Do
Sel.SelectAll;
End For;
Executor.PrepareExecute(Sels);
//Получение матрицы из кэша
Executor.PerformExecuteO(CubeInstanceDestinationExecutorOptions.Cached);
ResultMatrix := Executor.Matrix;
Iter := ResultMatrix.CreateIterator;
//Если данные получены из кэша, то итератор поддерживает IRWMutex
//и необходима блокировка перед выполнением действий
If Iter Is IRWMutex Then
IterMutex := Iter As IRWMutex;
//Блокировка данных на чтение
IterMutex.LockWrite;
End If;
Iter.Move(IteratorDirection.First);
While Iter.Valid Do
//...
//Работа с итератором для изменения данных
//...
Iter.Move(IteratorDirection.Next);
End While;
//Снятие блокировки
If IterMutex <> Null Then
If IterMutex.HasWriteLock Then
IterMutex.UnlockWrite;
End If;
End If;
End Sub UserProc;
При выполнении примера из кэша куба будет получена матрица с данными. Для работы с матрицей и изменения данных в ней осуществляется блокировка кэша на запись.
См. также: