Delphi для профессионалов



 

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


После получения записей от провайдера набор данных сохраняется в локальном буфере памяти. И все вносимые изменения после применения метода Post также сохраняются локально и не пересылаются на сервер. Буфер изменений доступен при помощи свойства

property Delta: OleVariant;

Для передачи изменений на сервер используется метод

function ApplyUpdates(MaxErrors: Integer);

 Integer; virtual;

где параметр MaxErrors задает число ошибок, которые игнорируются при сохранении данных на сервере. Если параметр равен —1, сохранение на сервере прерывается при первой же ошибке. Метод возвращает число сохраненных записей.

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

Если клиентское приложение будет редко изменять свои наборы данных, сохранение изменений на сервере можно связать с методом-обработчиком

AfterPost:

procedure TForml.ClientDataSetAfterPost(DataSet: TDataSet); 

begin

ClientDataSet.ApplyUpdates(-1); 

end;

Свойство только для чтения

property ChangeCount: Integer;

возвращает общее число изменений, содержащееся в буфере Delta. Для очистки буфера изменений используется метод

procedure CancelUpdates;

После вызова метода свойство ChangeCount принимает значение 0.

До и после сохранения изменений на сервере соответственно вызываются методы-обработчики

property BeforeApplyUpdates: TRemoteEvent;

 property AfterApplyUpdates: TRemoteEvent;

Несмотря на сделанные локально многократные изменения, запись может быть восстановлена в первоначальном виде. Метод

procedure RefreshRecord;

получает от провайдера первоначальный вариант текущей записи, сохраненный на сервере.

При этом (и при всех других случаях, когда компонент запрашивает обновление текущей записи) вызываются методы-обработчики

property BeforeRowRequest: TRemoteEvent;

 property AfterRowRequest: TRemoteEvent;

Но что делать, если необходимо восстановить удаленную запись? В обычном наборе данных после сохранения это невозможно. В компоненте TClientDataSet существует метод

function UndoLastChange(FollowChange: Boolean): Boolean;

который возвращает набор данных к состоянию до последней выполненной операции редактирования, добавления или удаления записи. Если параметр FollowChange имеет значение True, курсор набора данных будет установлен на восстановленную запись.

О состоянии текущей записи позволяет судить метод

function UpdateStatus: TUpdateStatus; override;

который возвращает значение типа

TUpdateStatus = (usUnmodified, usModified, uslnserted, usDeleted);

означающее состояние текущей записи:

usUnmodified — запись осталась неизменной;

usModified — запись была изменена;

uslnserted — запись была добавлена;

usDeleted — запись была удалена.

Например, при закрытии набора данных можно выполнить проверку:

if ClientDataSet.UpdateStatus = usModified 

then ShowMessage('Record was changed');

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

property StatusFilter: TUpdateStatusSet;

определяет, какой тип записей будет отображаться в наборе данных. Например:

ClientDataSet.StatusFilter := usDeleted;

отобразит в наборе данных только удаленные записи (при этом изменения не сохранены на сервере).