ICubeCacheSaver.GetGlobalWriteLock

Синтаксис Fore

GetGlobalWriteLock(

DestKey: Integer;

ParamValues: IMetabaseObjectParamValues;

Selections: IDimSelectionSet): ILock;

Синтаксис Fore.NET

GetGlobalWriteLock(

DestKey: UInteger;

ParamValues: Prognoz.Platform.Interop.Metabase.IMetabaseObjectParamValues;

Selections: Prognoz.Platform.Interop.Dimensions.IDimSelectionSet): Prognoz.Platform.Interop.ForeSystem.ILock;

Параметры

DestKey. Ключ необходимого варианта отображения куба.

ParamValues. Набор значений параметров, для которых сохранен объект кэширования.

Selections. Коллекция отметок в указанном варианте отображения куба.

Описание

Метод GetGlobalWriteLock возвращает объект, управляющий блокировкой кэшированных данных на запись для указанных параметров куба.

Комментарии

Блокировка на запись требуется с целью исключения случая, когда несколько пользователей одновременно могут изменить одни и те же данные. Такая вероятность существует, если работа с кэшем куба происходит в коде, выполнение которого осуществляться через веб-сервисы BI-сервера продукта «Форсайт. Аналитическая платформа».

Пример Fore

Для выполнения примера предполагается наличие в репозитории куба с идентификатором «STD_CUBE». Для куба включена возможность кэширования данных.

Sub UserProc;
Var
    MB: IMetabase;
    MDesc, CacheDesc: IMetabaseObjectDescriptor;
    Cache: ICubeCacheSaver;
    CubeInst: ICubeInstance;
    Dest: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Sel: IDimSelection;
    Matr: IMatrix;
    Lock: ILock;
Begin
    MB := MetabaseClass.Active;
    MDesc := MB.ItemById("STD_CUBE");
    CacheDesc := GetCache(MDesc);
    If CacheDesc <> Null Then
        Cache := CacheDesc.Edit As ICubeCacheSaver;
        CubeInst := MDesc.Open(NullAs ICubeInstance;
        Dest := CubeInst.Destinations.DefaultDestination;
        Sels := Dest.CreateDimSelectionSet;
        For Each Sel In Sels Do
            Sel.SelectAll;
        End For;
        //Получение кэшированной матрицы с данными
        Matr := Cache.GetGlobalCache(Dest.Key, Null, Sels);
        If Matr <> Null Then
            Lock := Cache.GetGlobalWriteLock(Dest.Key, Null, Sels);
            //...
            //Дальнейшая работа с матрицей данных
            //...
            //Сохранение обновленной матрицы в кэш
            Cache.SaveCache(Dest.Key, Null, Sels, Matr);
            Lock.Unlock;
            Lock := Null;
        End If;
    End If;
End Sub UserProc;

Function GetCache(MObj: IMetabaseObjectDescriptor): IMetabaseObjectDescriptor;
Var
    Desc: IMetabaseObjectDescriptor;
Begin
    For Each Desc In MObj.Children Do
        If Desc.ClassId = MetabaseObjectClass.KE_CLASS_CUBE_CACHE_SAVER Then
            Return Desc;
        End If;
    End For;
    Return Null;
End Function GetCache;

При выполнении примера для указанных параметров куба будет получена матрица кэшированных данных. Для изменения данных осуществляется их блокировка. После обновления данных в кэше блокировка будет снята.

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;

Public Shared Sub Main(Params: StartParams);
Var
    MB: IMetabase;
    MDesc, CacheDesc: IMetabaseObjectDescriptor;
    Cache: ICubeCacheSaver;
    CubeInst: ICubeInstance;
    Dest: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Sel: IDimSelection;
    Matr: IMatrix;
    Lock: ILock;
Begin
    MB := Params.Metabase;
    MDesc := MB.ItemById["STD_CUBE"];
    CacheDesc := GetCache(MDesc);
    If CacheDesc <> Null Then
        Cache := CacheDesc.Edit() As ICubeCacheSaver;
        CubeInst := MDesc.Open(NullAs ICubeInstance;
        Dest := CubeInst.Destinations.DefaultDestination;
        Sels := Dest.CreateDimSelectionSet();
        For Each Sel In Sels Do
            Sel.SelectAll();
        End For;
        //Получение кэшированной матрицы с данными
        Matr := Cache.GetGlobalCache(Dest.Key, Null, Sels);
        If Matr <> Null Then
            Lock := Cache.GetGlobalWriteLock(Dest.Key, Null, Sels);
            //...
            //Дальнейшая работа с матрицей данных
            //...
            //Сохранение обновленной матрицы в кэш
            Cache.SaveCache(Dest.Key, Null, Sels, Matr);
            Lock.Unlock();
            Lock := Null;
        End If;
    End If;
End Sub;

Public Shared Function GetCache(MObj: IMetabaseObjectDescriptor): IMetabaseObjectDescriptor;
Var
    Desc: IMetabaseObjectDescriptor;
Begin
    For Each Desc In MObj.Children Do
        If Desc.ClassId = MetabaseObjectClass.KE_CLASS_CUBE_CACHE_SAVER As integer Then
            Return Desc;
        End If;
    End For;
    Return Null;
End Function;

См. также:

ICubeCacheSaver