Меню сайта
Мини-чат
Чтобы добавить сообщение, необходимо авторизоваться.
Главная » Статьи » Не стандартные примеры на Delphi » Базы Данных

Создание уникального табличного индекса
Вот что пишет Галимарзанов Фанис:

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

Категория: Базы Данных | Добавил: DelphiAiX (20.05.2012)
Просмотров: 287 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]