Создание уникального табличного индекса

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Галимарзанов Фанис

Очень часто требуется решить проблему уникальности индекса для таблиц — не всегда можно дополнять ключ меткой времени. Для этого можно использовать метод 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 ссылку на метод первой таблицы, для которой мы писали код.

{/codecitation}

Добавить комментарий