Обработка ошибок
Параметр Action позволяет разработчику предусмотреть реакцию клиентского набора данных на ошибку:
type TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh);
Где:
- raSkip – отменить операцию для записей, вызвавших ошибку, с их сохранением в буфере;
- raAbort – отменить все изменения для операции, вызвавшей ошибку;
- raMerge – совместить измененные записи с аналогичными записями сервера;
- racorrect – сохранить изменения, сделанные в данном методе-обработчике;
- racancel – отменить изменения, вызвавшие ошибку, заменив их исходными локальными значениями клиентского набора данных;
- raRefresh – отменить изменения, вызвавшие ошибку, заменив их исходными значениями серверного набора данных.
Как видите, выбор возможных реакций на ошибку сервера несколько шире, чем на локальные ошибки.
Тип ошибки возвращается параметром Е, для которого предусмотрен специальный класс EReconcileError, имеющий несколько полезных свойств.
Свойство:
property ErrorCode: DBResult;
…возвращает код ошибки. Используемые коды ошибок можно найти в файле \Source\Vcl\DSIntf.pas. Код предыдущей ошибки возвращается свойством:
property PreviousError: DBResult;
Используя представленную здесь информацию, вы можете самостоятельно управлять обработкой ошибок сервера на клиенте. Но можно поступить и более просто – использовать стандартный диалог обработки удаленных ошибок (рис. 22.4).
Рис. 22.4. Стандартный диалог обработки ошибок сервера
Этот диалог можно подключить к вашему проекту (он содержится в модуле \ObjRepos\RecError.pas) и вызвать при помощи процедуры:
function HandleReconcileError(DataSet: TDataSet; UpdateKind: TUpdateKind; ReconcileError: EReconcileError): TReconcileAction;
В параметры этой функции подставляются параметры метода-обработчика OnReconciieError, а возвращает данная функция действие, выбранное пользователем в диалоге (см. рис. 22.4). Таким образом, ее использование очень просто:
procedure TForml.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction); begin Action: = HandleReconcileError(DataSet, UpdateKind, E); end;