Автор: Галимарзанов Фанис
Очень часто требуется решить проблему уникальности индекса для
таблиц - не всегда можно дополнять ключ меткой времени. Для этого
можно использовать метод TTable.OnPostError. При создании таблицы
добавляем поле Ax типа ftInteger или ftSmallInt, которое будет
замыкать ключевые поля. К примеру, необходимо создать таблицу
платежей абонентов, в которой могут существовать несколько платежей,
проведенных в один день. abKod : код абонента, входит в первичный ключ
Data : дата платежа, входит в первичный ключ
Ax : дополнительное поле, входит в первичный ключ и замыкает
его
TypeOpl : тип оплаты
Summ : сумма платежа
В примере уникальность ключа можно обеспечить за счет поля Data,
но это достигается за счет включения кода вида
taOplData.Value:=taOplData.Value+Time;
|
т.к. оператор обычно вводит только день, месяц и год, остальное -
по умолчанию.
В нашем случае при попытке записи не уникального ключа
возбуждается исключение и программа переходит на обработку этого
исключения
const
eKeyViol = 9729; // код ошибки BDE - нарушение уникальности записи
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if (E is EDBEngineError) then // здесь обычный код распознавания кода ошибки
if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
begin
DataSet.FieldByName('Ax').Value := DataSet.FieldByName('Ax').Value + 1;
// Увеличиваем значение поля Ax и повторяем попытку Post
Action := daRetry; // повторить операцию сохранения
end;
end;
|
Этот метод я применяю во всех приложениях. Кстати - для
начинающих, пишем код метода OnPostError только для одной таблицы,
для остальных. имеющих поле Ах, - с помощью инспектора
свойств-событий назначаем для события OnPostError ссылку на метод
первой таблицы, для которой мы писали код.
|