Например, при возникновении ошибки редактирования набора данных код обработчика может выглядеть следующим образом:

ргссв±гге TForml.ClientDataSetEditError (DataSet: TTata&t;

Е: FIMabaseError; var Action: TTataAction) ; bagin

if Not (DataSet. State ill [dsEdit, ds Insert ] ) then

begin
DataSet.Edit;

Acticn := dafetxy; end

else Acticn := cMbort;
end;

Здесь, если набор данных не находится в состоянии редактирования, это упущение исправляется и операция повторяется.

Итак, с локальными ошибками все обстоит достаточно просто. А как клиентский набор данных "узнает" об ошибке на удаленном сервере? Очевидно, при помощи своего компонента-провайдера. Действительно, компонент TDataSetProvider не только возвращает клиенту несохраненные изменения в пакете Delta (см. выше), но и обеспечивает генерацию события, реакцией на которое является метод-обработчик

type

TReconcileErrorEvent = procedure(DataSet: TCustomClientDataSet;
E: EReconcileError;
UpdateKind: TUpdateKind;
var Action: TReconcileAction) of object;
property OnReconcileError: TReconcileErrorEvent;

Обратите внимание, что все параметры похожи на соответствующие параметры локальных обработчиков, но имеют собственные типы. Рассмотрим их.

Параметр UpdateKind содержит указание на тип операции, вызвавшей ошибку на сервере:

type

TUpdateKind = (ukModify, uklnsert, ukDeiete) ;

ukModify - изменение данных; ukinsert - добавление записей; ukDeiete - удаление записей.

Параметр Action позволяет разработчику предусмотреть реакцию клиентского набора данных на ошибку:

type

TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh);
raSkip - отменить операцию для записей, вызвавших ошибку, с их сохранением в буфере;
raAbort - отменить все изменения для операции, вызвавшей ошибку;
raMerge - совместить измененные записи с аналогичными записями сервера;
raCorrect - сохранить изменения, сделанные в данном методе-обработчике;
raCancel - отменить изменения, вызвавшие ошибку, заменив их исходными локальными значениями клиентского набора данных;

raRef resh - отменить изменения, вызвавшие ошибку, заменив их исходными значениями серверного набора данных.

Как видите, выбор возможных реакций на ошибку сервера несколько шире, чем на локальные ошибки.

Тип ошибки возвращается параметром Е, ДЛЯ которого предусмотрен специальный класс EReconcileError, имеющий несколько полезных свойств.

Свойство

property ErrorCode: DBResult;

возвращает код ошибки. Используемые коды ошибок можно найти в файле \Source\Vcl\DSIntf.pas. Код предьщущей ошибки возвращается свойством

property PreviousError: DBResult;
Программирование в Delphi 7

Рис. 22.4. Стандартный диалог обработки ошибок сервера

Используя представленную здесь информацию, вы можете самостоятельно управлять обработкой ошибок сервера на клиенте. Но можно поступить и более просто - использовать стандартный диалог обработки удаленных ошибок (рис. 22.4). Этот диалог можно подключить к вашему проекту (он содержится в модуле \ObjRepos\RecError.pas) и вызвать при помощи процедуры:

function HandleReconcileError (DataSet: TDataSet;
UpdateKind: TUpdateKind;
ReconcileError: EReconcileError) : TEeconcileAction;

⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Август
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс