Шаг 46.
Работа с локальными БД в Delphi. Работа с полями. Использование объектов класса TField. Создание полей выбора данных (Lookup-полей)

    На этом шаге мы рассмотрим создание полей выбора данных.

    Кроме обычных полей и вычисляемых полей, в Delphi имеется возможность создания полей выбора данных (Lookup-полей).

    Поле выбора данных одного НД содержит значения из другого набора данных, связанных по ключу с НД, к которому принадлежит это поле. Первый НД - родительский, а второй - дочерний. Lookup-поля и специализированные компоненты TDBLookupListBox, TDBLookupComboBox используют схожий механизм, основанный на реляционной связи двух НД, однако эти компоненты выбора не создают новых полей.

    В нашей программе FIRMA в таблице наименования товара содержится поле NSklad (номер склада). Давайте дополним наше приложение таким образом, чтобы при выборе записи из таблицы "Наличие товара" как дополнительная информация выводился бы номер склада, на котором этот товар находится.

    Создайте новое поле в НД Table2 с именем NSklad типа Integer. Установите переключатель в положение Lookup. После выбора переключателя становятся доступными элементы группы Lookup definition, с помощью которых устанавливаются параметры связи наборов данных (рисунок 1 и таблица 1).


Рис.1. Диалоговое окно New Field

Таблица 1. Параметры связи наборов данных
Название Назначение
DataSet Определяет имя родительского НД
Key Fields Определяет список ключевых полей родительского НД. По этим полям построен индекс для связи родительского НД с дочерним. Если в индексе несколько полей, они разделяются точками с запятыми
Lookup Fields Определяет список ключевых полей дочернего НД. По этим полям построен индекс для связи дочернего НД с родительским
Result Fields Поле родительского НД, возвращаемое в качестве результата. Необходимо следить, чтобы тип вновь создаваемого поля совпадал с типом указанного здесь поля

    Установите у этих элементов следующие значения:

Таблица 2. Значения свойств
Элемент Значение
DataSet Table1
Key Fields Naim
Lookup Fields Naim
Result Fields NSklad

    Таким образом, родительский НД Table1 связан с дочерним НД Table2 по полю Naim, и создаваемому нами полю присваивается значение из поля NSklad НД Table1.

    Выберите в редакторе полей НД Table2 созданный вновь объект TField NSklad и присвойте его свойству Visible значение False (таким образом, поле NSklad не будет отображаться в DBGrid2). Поместите на форму компонент TLabel с вкладки Standard, TDBText с вкладки Data Controls, присвоив их свойствам следующие значения:

DBText1
DataSource DataSource2
DataField NSklad
Label1
Caption Номер склада

    Запустив программу, вы убедитесь, что при перемещении по таблице "Наличие товара", в DBLabel1 показывается номер склада, на котором находится этот товар. Как видно, значение берется из Table1 (рисунок 2).


Рис.2. Приложение с Lookup-полем

Созданное приложение можно взять здесь.

    С помощью Lookup-полей можно не только показывать дополнительную информацию из другого НД, но и использовать их для автоматической установки нового значения в другое поле НД.

    Изменим нашу БД таким образом: пусть каждый товар будет находиться на отдельном складе с номерами 1, 2, 3 и т.д. Свойство Visible компонента TField NSklad установите в True. Теперь в DBGrid2 отображается номер склада, на котором находится товар, а при редактировании этого поля появляется комбинированный список и после выбора значения автоматически обновляется поле Naim. Заметим, что список выбора раскрывается, несмотря на то, что свойство ReadOnly (только чтение) компонента DBGrid2 установлено в True.


Рис.3. Результат работы приложения

Созданное приложение можно взять здесь.

    На следующем шаге мы рассмотрим работу с наборами данных.




Предыдущий шаг Содержание Следующий шаг