На этом шаге мы рассмотрим создание полей выбора данных.
Кроме обычных полей и вычисляемых полей, в Delphi имеется возможность создания полей выбора данных (Lookup-полей).
Поле выбора данных одного НД содержит значения из другого набора данных, связанных по ключу с НД, к которому принадлежит это поле. Первый НД - родительский, а второй - дочерний. Lookup-поля и специализированные компоненты TDBLookupListBox, TDBLookupComboBox используют схожий механизм, основанный на реляционной связи двух НД, однако эти компоненты выбора не создают новых полей.
В нашей программе FIRMA в таблице наименования товара содержится поле NSklad (номер склада). Давайте дополним наше приложение таким образом, чтобы при выборе записи из таблицы "Наличие товара" как дополнительная информация выводился бы номер склада, на котором этот товар находится.
Создайте новое поле в НД Table2 с именем NSklad типа Integer. Установите переключатель в положение Lookup. После выбора переключателя становятся доступными элементы группы Lookup definition, с помощью которых устанавливаются параметры связи наборов данных (рисунок 1 и таблица 1).
Рис.1. Диалоговое окно New Field
Название | Назначение |
---|---|
DataSet | Определяет имя родительского НД |
Key Fields | Определяет список ключевых полей родительского НД. По этим полям построен индекс для связи родительского НД с дочерним. Если в индексе несколько полей, они разделяются точками с запятыми |
Lookup Fields | Определяет список ключевых полей дочернего НД. По этим полям построен индекс для связи дочернего НД с родительским |
Result Fields | Поле родительского НД, возвращаемое в качестве результата. Необходимо следить, чтобы тип вновь создаваемого поля совпадал с типом указанного здесь поля |
Установите у этих элементов следующие значения:
Элемент | Значение |
---|---|
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. Результат работы приложения
На следующем шаге мы рассмотрим работу с наборами данных.