Delphi 3 и создание приложений баз данных

       

Использование параметра UpdateAction


Изменяемый параметр UpdateAction определяет действие, которое следует произвести в отношении ошибочной записи. Действие указывается перед выходом из обработчика:

procedure TForm1.TovaryUpdateError(DataSet: TDataSet;

E: EDatabaseError; UpdateKind: TUpdateKind;

var UpdateAction: TUpdateAction);

begin

// какие-либо операторы, если нужны

UpdateAction := uaSkip;

end;

Можно указать следующие действия:



Значение Что влечет
uaFail Отменить изменения для записи, выдать сообщение об ошибке.
uaAbort Отменить изменения для записи, сообщение об ошибке не выдавать. Применяется также в случаях, когда генерируется сообщение об ошибке, отличное от выдаваемого системой.
uaSkip Не отменять изменений для записи, но запись физически в таблицу БД не переносить (что, собственно, и невозможно без изменения значений записи, повлекших ошибку).
uaRetry Повторить попытку подтверждения изменений для записи. Предполагается, что на момент повторения попытки значения полей данной записи скорректированы программным способом. В противном случае произойдет зацикливание.

Можно заметить, что при применении способа обработки ошибочной записи uaSkip в физической ТБД будут подтверждены изменения не всех записей. а только тех из изменений, для которых не произошла ошибка при подтверждении кэшированных изменений.

Такой подход противоречит транзакционному подходу, согласно котором) либо запоминаются все изменения, либо происходит их одновременный откат

Пример.

Пусть имеется таблица "Товары" и дочерняя таблица "Расход товара". Пусть эти таблицы соединены по полю связи "Товар"(рис. 33.1).

Как видно из рисунка, в таблице "Товары" для товаров "Сахар" и "Сыр гудаутский" имеются дочерние записи в таблице "Расход". Изменим в таблице "Товары" наименования всех товаров и попытаемся подтвердить кэшированные изменения:

Database1.StartTransaction;

TRY

Tovary.ApplyUpdates;

Databasel.Commit;

Tovary.CommitUpdates;

EXCEPT

Databasel.Rollback;

END;//try

Тогда изменение значения в поле "Товар" для товаров "Сахар" и "Сыр гудаутский" приведет к нарушению целостности БД, поскольку в таблице "Расход" наименования товаров в поле "Товар" мы изменять не будем.

Напишем обработчик On UpdateError для НД "Товар":

procedure TForm1.TovaryUpdateError(DataSet: TDataSet;

E: EDatabaseError; UpdateKind: TUpdateKind;

var UpdateAction: TUpdateAction) ;

begin

CASE RadioGroup1.Itemlndex OF

0 : UpdateAction := uaFail;

1 : UpdateAction := uaAbort;

2 : UpdateAction := uaSkip;

3 : UpdateAction := uaRetry;

END;//case

end;

Компонент RadioGroupl содержит возможность выбора одного из значений изменяемого параметра UpdateAction.

Изменяя значение параметра UpdateAction, посмотрим, изменение каких записей будет подтверждено при возникновении ошибки при выполнении метода Tovary ApplyUpdates',

• UpdateAction = uaFail.

Как показано на рис.33.2.а) и б), в режиме uaFail результаты кэшированных изменений полностью отменены:



Содержание раздела