Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Базы данных , Записи

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

Автор: Андрей Марин
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]);

Функция Delphi под названием GetId, которая генерирует уникальный идентификатор для таблицы при вставке нового записи. Функция предполагает, что первое поле таблицы является целым и уникальным.

Рассмотрим шаг за шагом, как функция работает:

  1. Если таблица не имеет записей, она возвращает 0.
  2. Она сохраняет текущие имена индексных полей в переменной s.
  3. Она устанавливает первое поле как индексное поле с помощью Tab.IndexFieldNames := Tab.Fields[0].DisplayName;.
  4. Затем функция переходит к последнему записи таблицы и проверяет, если значение первого поля равно счету записей минус один. Если это так, то таблица заполнена, и нет пробелов в последовательности.
  5. Если таблица не заполнена, она устанавливает Tab.First для возврата к первой записи.
  6. Затем функция ищет пробел в последовательности, повторно проходимся по записям, начиная с первой, пока не найдем запись, где значение первого поля больше текущего результата плюс один.

Функция возвращает следующий доступный уникальный идентификатор.

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

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]);

В этом коде новая запись добавляется в таблицу Table2 с уникальным идентификатором, генерируемым функцией GetId(Table2).

Обратите внимание, что функция предполагает, что в таблице есть только одно индексное поле и оно всегда является первым полем. Если это не так, вам нужно изменить функцию соответствующим образом.

Функция GetId для получения уникального номера для вставки записи в таблицу, при условии что первое поле является уникальным и ключевым.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Записи ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:21:40/0.014382123947144/1