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