Работа с кэшем источника данных

Для работы с данными реляционных источников данных предназначен интерфейс IDatasetInstance. Свойства и методы данного интерфейса позволяют получить информацию о структуре источника, а также данные всех записей источника. Если возникает необходимость изменить какие-либо записи либо добавить новые, то в этом случае используется кэш реляционного источника данных. Кэш источника представляет собой буфер в памяти компьютера, в котором содержатся записи, с которыми осуществляется работа в текущий момент. Для работы с кэшем реляционного источника данных предназначен интерфейс ICachedDataset. Для открытия кэша предназначен метод OpenCached. В кэше доступна фильтрация и поиск записей, изменение существующих и создание новых записей.

Фильтрация данных

Для настройки фильтрации предназначены свойства Filter и Filtered кэша источника данных.

Для выполнения примера предполагается наличие в репозитории таблицы с идентификатором «Table_1». Данная таблица содержит поле «ID», в котором хранятся числовые идентификаторы записей, а также какие-либо другие поля.

Sub UserProc;
Var
    MB: IMetabase;
    DSInst: IDatasetInstance;
    Cache: ICachedDataset;
    FieldsInst: IDatasetInstanceFields;
    FieldInst: IDatasetInstanceField;
Begin
    MB := MetabaseClass.Active;
    DSInst := MB.ItemById("Table_1").Open(NullAs IDatasetInstance;
    Cache := DSInst.OpenCached;
    Cache.Filter.AsString := "(ID>=100)AND(ID<=1000)";
    Cache.Filtered := True;
    Cache.First;
    While Not Cache.Eof Do
        FieldsInst := Cache.Fields;
        For Each FieldInst In FieldsInst Do
            Debug.Write(FieldInst.Value + " ");
        End For;
        Debug.WriteLine("");
        Cache.Next;
    End While;
End Sub UserProc;

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

Поиск данных

Для поиска записей в кэше используются свойства и методы интерфейса ICachedDatasetLookup. Создание объекта поиска осуществляется при вызове метода CreateLookup. В кэше возможен поиск только первой записи, содержащей искомые значения полей. Если в источнике более чем одной записи с искомыми значениями, то рекомендуется настроить фильтрацию кэша.

Для выполнения примера предполагается наличие в репозитории таблицы с идентификатором «Table_1». Данная таблица содержит поля «ID» и «NAME», а также какие-либо другие поля.

Sub UserProc;
Var
    MB: IMetabase;
    DSInst: IDatasetInstance;
    Cache: ICachedDataset;
    CacheLookup: ICachedDatasetLookup;
    SoughtFlds, FoundFlds: IDatasetInstanceFields;
Begin
    MB := MetabaseClass.Active;
    DSInst := MB.ItemById("Table_1").Open(NullAs IDatasetInstance;
    Cache := DSInst.OpenCached;
    //Создание объекта для поиска по значениям поля ID
    CacheLookup := Cache.CreateLookup("ID");
    SoughtFlds := CacheLookup.Fields;
    //Указываем искомое значение
    SoughtFlds.Item(0).Value := 100;
    //Поиск записи
    If CacheLookup.Locate Then
        FoundFlds := CacheLookup.Lookup("NAME");
        Debug.WriteLine(FoundFlds.Item(0).Value);
    End If;
End Sub UserProc;

При выполнении примера осуществляется открытие указанной таблицы репозитория. По данным таблицы будет осуществлен поиск записи, в которой значение поля «ID» равно указанному значению. В случае удачного поиска в консоль среды разработки будет выведено значение поля «NAME» найденной записи.

Изменение данных

Для редактирования существующих, а также для  удаления и создания новых записей в кэше предусмотрен ряд методов интерфейса ICachedDataset:

Примечание. Данные методы доступны для использования, только если реляционный источник допускает редактирование записей.

Для выполнения примеров предполагается наличие в репозитории таблицы с идентификатором «Table_1». Данная таблица содержит поля «ID» и «NAME», а также какие-либо другие поля.

Пример 1:

Sub UserProc;
Var
    MB: IMetabase;
    DSInst: IDatasetInstance;
    Cache: ICachedDataset;
    fID: IDatasetInstanceField;
Begin
    MB := MetabaseClass.Active;
    DSInst := MB.ItemById("Table_1").Open(NullAs IDatasetInstance;
    Cache := DSInst.OpenCached;
    While Not Cache.Eof Do
        Cache.Edit;
        fID := Cache.Fields.FindById("ID");
        fID.Value := (fID.Value As Integer) + 1;
        Cache.Post;
        Cache.Next;
    End While;
End Sub UserProc;

При выполнении примера значения поля «ID» во всех записях будут увеличены на единицу.

Пример 2:

Sub UserProc;
Var
    MB: IMetabase;
    DSInst: IDatasetInstance;
    Cache: ICachedDataset;
    fID: IDatasetInstanceField;
Begin
    MB := MetabaseClass.Active;
    DSInst := MB.ItemById("Table_1").Open(NullAs IDatasetInstance;
    Cache := DSInst.OpenCached;
    While Not Cache.Eof Do
        fID := Cache.Fields.FindById("ID");
        If ((fID.Value As Integer) Mod 2) = 0 Then
            Cache.Delete
        End If;
        Cache.Next;
    End While;
End Sub UserProc;

При выполнении примера из источника данных будут удалены все записи, в которых значение поля «ID» кратно двум.

См. также:

Примеры