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