Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_Komponent_TClientDataSet.doc
Скачиваний:
3
Добавлен:
25.08.2019
Размер:
79.87 Кб
Скачать

Кэширование и редактирование данных

После получения записей от провайдера набор данных сохраняется в локальном буфере памяти. И все вносимые изменения после применения метода 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.