Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 36

стр.

>if Source.IndexDefs.Count > 0 then…

Вам нужно будет это сделать, поскольку метод TIndexDefs.Assign не проверяет это перед копированием индекс-информации. Также вам нет необходимости вызывать Clear до работы с IndexDefs, поскольку метод Assign сделает это и без вашего участия.

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

Delphi 1

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

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

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


2. Вы можете использовать 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;


>end;

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

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

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

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

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


Delphi в режиме разработки позволяет быстро добавлять и настраивать в вашем проекте компоненты для работы с базами данных, но есть ситуации, когда вам нужно создавать и конфигурировать объекты во время выполнения программы. Например, во время выполнения программы вам может понадобиться добавить колонку с вычисляемым полем (используя алгоритмы пользователя). Поэтому вопрос: как, не используя среды разработки, Инспектора Объектов и редактора TFields, создавать и сконфигурировать TField и другие компоненты для связки данных?

В следующем примере показано динамическое создание TTable, таблицы базы данных в связке с TTable, TFieldDefs, TFields, вычисляемых полей и подключение обработчика для события OnCalc.

Для начала выберите пункт New Application меню File. Будет создан новый проект с пустой формой, на которой мы и будет создавать на лету наши компоненты.

В секцию interface вашего модуля формы добавьте, как показано ниже, объявление обработчика события OnCalcFields и поля TaxAmount. Позже мы создадим TTable и назначим этот обработчик событию TTable OnCalcFields, который позволит при чтении каждой записи вызывать событие OnCalcFields, которое, в свою очередь, выполнит нашу процедуру TaxAmountCalc.

>type TForm1 = class(TForm)

procedure TaxAmountCalc(DataSet: TDataset);

>private

> TaxAmount: TFloatField;

>end;

В секции implementation создайте обработчик события OnCalc как показано ниже:

>procedure TForm1.TaxAmountCalc(DataSet: TDataset);

>begin

> Dataset['TaxAmount'] := Dataset['ItemsTotal'] * (Dataset['TaxRate'] / 100);

>end;

Создайте обработчик формы OnCreate как показано ниже (для получения дополнительной информации о создании обработчиков событий обратитесь к Delphi Users Guide, Chapter 4 «Working With Code»).