|
Американская школа для одаренных детей, 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-Файл. Это дает преимущество за
счет более высокой скорости работы, но в многопользовательской
среде вы должны сами заботиться о блокировке записей. |