Получение уникального номера, под которым можно вставить запись в таблицуDelphi , Базы данных , ЗаписиПолучение уникального номера, под которым можно вставить запись в таблицу
Автор: Андрей Марин { **** 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 для получения уникального номера для вставки записи в таблицу, при условии что первое поле является уникальным и ключевым. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |