Иллюстрированный самоучитель по Delphi 7 для профессионалов

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

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

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.