- •Компонент tClientDataSet – основной компонент синтеза эд
- •Получение данных от компонента - провайдера
- •Кэширование и редактирование данных
- •Управление запросом на сервере
- •Использование индексов
- •Сохранение набора данных в файлах
- •Работа с данными типа blob
- •Объекты-агрегаты
- •Агрегатные поля
- •Группировка и использование индексов
- •Вложенные наборы данных
Кэширование и редактирование данных
После получения записей от провайдера набор данных сохраняется в локальном буфере памяти. И все вносимые изменения после применения метода Post также сохраняются локально и не пересылаются на сервер. Буфер изменений доступен при помощи свойства Delta. Для передачи изменений на сервер используется метод ApplyUpdates. После выполнения метода ApplyUpdates все записи, сохранить которые не удалось, возвращаются клиенту в локальный буфер Delta.
Если клиентское приложение будет редко изменять свои наборы данных, сохранение изменений на сервере можно связать с обработчиком события AfterPost:
procedure TForml.ClientDataSetAfterPost(DataSet: TDataSet);
begin ClientDataSet.ApplyUpdates(-1); end;
Свойство, (только для чтения) ChangeCount возвращает общее число изменений, содержащееся в буфере Delta. Для очистки буфера изменений используется метод CancelUpdates. После вызова указанного метода свойство ChangeCount принимает значение 0.
Несмотря на сделанные локально многократные изменения, запись может быть восстановлена в первоначальном виде. Метод RefreshRecord получает от провайдера первоначальный вариант текущей записи, сохраненный на сервере.
Но что делать, если необходимо восстановить удаленную запись? В обычном наборе данных после сохранения это невозможно. В компоненте TClientDataSet существует метод UndoLastChange, который возвращает набор данных к состоянию до последней выполненной операции редактирования, добавления или удаления записи. Если параметр FollowChange имеет значение True, курсор набора данных будет установлен на восстановленную запись.
О состоянии текущей записи позволяет судить метод UpdateStatus, который возвращает значение типа TUpdateStatus = (usUnmodified, usModified, uslnserted, usDeleted), означающее состояние текущей записи:
usUnmodified — запись осталась неизменной;
usModified — запись была изменена;
uslnserted — запись была добавлена;
usDeleted — запись была удалена.
Например, при закрытии набора данных можно выполнить проверку:
if ClientDataSet.UpdateStatus = usModified then ShowMessage('Record was changed');
На основе типа можно управлять видимостью записей в наборе данных. Свойство StatusFilter определяет, какой тип записей будет отображаться в наборе данных. Например:
ClientDataSet.StatusFilter := usDeleted;
отобразит в наборе данных только удаленные записи (при этом изменения не сохранены на сервере).
Управление запросом на сервере
Компонент TClientDataSet может не только эффективно управлять своим набором данных, но и влиять на выполнение серверного компонента, с которым он связан через провайдер.
Свойство CornmandText содержит текст запроса SQL, имя таблицы или хранимой процедуры в зависимости от типа серверного компонента.
Изменив значение этого свойства на клиенте, можно, например, модифицировать запрос SQL на сервере. Но для этого в свойстве Options соответствующего компонента-провайдера TDataSetProvider должно быть установлено значение poAliowCommandText := True;
Новое значение свойства CommandText отправляется на сервер только после открытия клиентского набора данных или выполнения метода Execute. Для запросов или хранимых процедур можно задавать параметры, которые сохраняются в свойстве Params.
До выполнения запроса присваиваются значения входным параметрам. После выполнения хранимой процедуры в выходных параметрах размещаются полученные от сервера значения.
Обратите внимание на тот факт, что при выполнении запросов или хранимых процедур может измениться порядок следования параметров. Поэтому обращаться к параметрам желательно по их именам. Например, так:
Editl.Text := ClientDataSet.Params .ParamByName('OutputParam') .AsString;
Для того чтобы получить текущие значения параметров компонента набора данных на сервере, достаточно использовать метод FetchParams.
До и после получения параметров от провайдера, клиентский набор данных вызывает методы-обработчики событий: BeforeGetParams и AfterGetParams.