Недавно добавленные исходники

•  Animation Loaders  1 045

•  DeLiKaTeS Tetris (Тетрис)  5 978

•  TDictionary Custom Sort  7 914

•  Fast Watermark Sources  7 575

•  3D Designer  10 815

•  Sik Screen Capture  8 151

•  Patch Maker  8 341

•  Айболит (remote control)  8 392

•  ListBox Drag & Drop  7 243

•  Доска для игры Реверси  101 464

•  Графические эффекты  8 449

•  Рисование по маске  7 814

•  Перетаскивание изображений  6 408

•  Canvas Drawing  6 790

•  Рисование Луны  6 723

•  Поворот изображения  5 833

•  Рисование стержней  4 779

•  Paint on Shape  3 476

•  Генератор кроссвордов  4 489

•  Головоломка Paletto  3 617

•  Теорема Монжа об окружностях  4 404

•  Пазл Numbrix  2 857

•  Заборы и коммивояжеры  3 808

•  Игра HIP  2 577

•  Игра Go (Го)  2 591

•  Симулятор лифта  2 969

•  Программа укладки плитки  2 400

•  Генератор лабиринта  3 152

•  Проверка числового ввода  2 634

•  HEX View  3 045

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

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



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

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





Похожие по теме исходники

Создание таблиц в Paradox




Copyright © 2004-2026 "Delphi Sources" by «SiteAnalyzer». Delphi World FAQ

Группа ВКонтакте