Для работы с данными реляционных источников данных предназначен интерфейс 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(Null) As 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(Null) As 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:
Append - добавление новой записи в конец и переход к ее редактированию;
Insert - добавление новой записи в текущей позиции и переход к ее редактированию;
Delete - удаление текущей записи;
Edit - открытие на редактирование текущей записи;
Post - сохранение внесенных изменений;
Cancel - отмена внесенных изменений и выход из режима редактирования;
Truncate - удаление всех записей.
Примечание. Данные методы доступны для использования, только если реляционный источник допускает редактирование записей.
Для выполнения примеров предполагается наличие в репозитории таблицы с идентификатором «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(Null) As 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(Null) As 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» кратно двум.
См. также: