Создание уникального ID для новой записи

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

Американская школа для одаренных детей, 1970 год, урок информатики…

— А теперь, детки, какие програмки вы бы хотели написать, когда подрастете? Вот ты, Питер?

— Я бы написал такую крутую утилитку, которая бы быстро так лечила бы винчестер от ошибок!

— Молодец, Питер! А ты, Юджин?

— А я бы сделал такую программу, которая бы быстро и без глюков сжимала файлы!

— Умница, Юджин! А ты, Билли, чего молчишь?

— Ну, ничего-ничего!… Будет вам всем быстро, будет вам без глюков…

Существует несколько способов задавать в таблице уникальный ID.

Вы можете использовать поле с автоприращением

Этот метод не очень надежен. Если ваша таблица каким-то образом испортится, и вам понадобиться ее пересобрать, автоинкрементальные поля будут перенумерованы. Хотя это легкий способ для ситуации, когда вы не ссылаетесь на id таблицы в других таблицах, но это не очень мудрое решение в других случаях.

Вы можете использовать ID-таблицу

Если у вас имеется приложение, где нескольким таблицам необходимы уникальные ID, создайте ID-таблицу с двумя полями:

Table Name A (первичный ключ)

Last Id N

В методе BeforePost таблицы, которой необходим уникальный ID, делайте примерно так:

TableBeforePost(Sender: TObject)

var

Id: Integer;

begin

with TTable(Sender) do

begin

{проверяем, существует ли ID для этой записи}

if Field[0].AsInteger = 0 then

begin

{ищем имя таблицы в ID-Таблице}

IDTable.FindKey[Name]

{извлекаем последний Id — подразумеваем блокировку записи}

Id := IDTable.FieldByName[‘Last Id’].AsInteger;

Inc(Id);

{записываем новый Id в ID-таблицу — подразумеваем разблокировку таблицы}

IDTable.FieldByName[‘Last Id’].AsInteger := Id;

IDTable.Post;

{записываем извлеченный ID в вашу таблицу}

Field[0].AsInteger := Id;

end;

end;

end;

Если вы поместите этот код в обработчик события таблицы BeforePost, вы убедитесь в том, что все ID будут последовательными (без «дырок»). Недостаток: если пользовать во время попытки добавления новой записи вдруг передумает, вы будете иметь запись с заполненным только полем ID.

В случае, если вы решили воспользоваться данным способом (последовательные ID), поместите приведенный выше код в обработчик события таблицы OnNewRecord.

Вы можете использовать ID-файл

Используйте те же принципы, что и в предыдущем способе, но вместо ID-таблицы используется ID-Файл. Это дает преимущество за счет более высокой скорости работы, но в многопользовательской среде вы должны сами заботиться о блокировке записей.

{/codecitation}

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