Получение уникального номера, под которым можно вставить запись в таблицу

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

Автор: Андрей Марин

WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Получение уникального номера, под которым можно вставить запись в таблицу

Эта функция может быть использована только для тех таблиц,

у которых первое поле — уникальное и ключевое, и при этом

больше ключевых полей нет. Первое поле может иметь как целый тип,

так и вещественный, но содержать только целые значения.

Вместо этой функции можно было бы использовать значение

Table.RecordCount если бы не было необходимости удалять

записи из таблицы. При удалении записи из таблицы возрастание

номеров идёт с разрывами. В принципе, эта проблема может быть

решена и возвращением номера, на единицу боьше последнего,

однако такой вариант плох для таблиц с количеством записей,

сопоставимым с максимальным значением переменной типа Cardinal

и/или для таблиц, с которыми часто совершаются операции

добавления и удаления записей. Предполагается, что первое

значение — 0, второе — 1 и т.д.

Зависимости: DBTables

Автор: Андрей Марин, andrei_marin@mail.ru, Москва

Copyright: Собственное написание Андрея Марина

Дата: 27 сентября 2002 г.

***************************************************** }

function GetId(Tab: TTable): Cardinal;

var

i: Integer; // предполагается, что первое поле — целое, ключевое и при этом

s: string; // больше ключевых полей в этой таблице нет

begin

if Tab.RecordCount = 0 then

begin

Result := 0;

Exit

end;

s := Tab.IndexFieldNames; // сохранение индекса

Tab.IndexFieldNames := Tab.Fields[0].DisplayName;

// установка первого поля в качестве индексного

Tab.Last;

if Tab.Fields[0].AsInteger = Tab.RecordCount — 1 then

begin // если числовой ряд полон

Result := Tab.RecordCount;

Tab.IndexFieldNames := s;

Exit

end;

Tab.First; // в противном случае поиск «дырки»

i := Tab.Fields[0].AsInteger;

if i > 0 then

Result := 0 // если ряд начинается не с нуля, то результат — ноль

else

repeat // собственно поиск

i := Tab.Fields[0].AsInteger;

Tab.Next;

Result := i 1;

if Tab.Fields[0].AsInteger > i 1 then

Break

until Tab.Eof;

Tab.IndexFieldNames := s

end;

Пример использования:

Table2.AppendRecord([GetId(Table2), i 1, BaloonAreas.Pages[i].Tag, p.fi, p.l,

q.fi, q.l, Radius1.Value, R2, R3, BalBeginAngle.Value, BalEndAngle.Value,

BalSectorGroup.ItemIndex, p1.fi, p1.l, q1.fi, q1.l]);

{/codecitation}

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