Delphi и базы данных "Поисковые поля" и SQL запросы:
Начиная с этого номера, в качестве примеров я буду использовать базу данных описанную мной в статье "Язык запросов SQL" прошлого номера. Это будет удобней для понимания обоих материалов.
Рис 1. Окно DataModule
Ещё одно отличие от предыдущих номеров - все компоненты для работы с таблицами (TDataSource, TТable и др.) будут хранится в отдельном модуле (Data Module). Для его создания нужно щёлкнуть по "New" из меню "File" и выбрать "Data Module". На появившейся форме (рис 2), можно расставлять компоненты для работы с базой данных также, как мы это делали раньше.
Рис 2. Project Manager
Теперь у нас в проекте две формы. Для того, чтобы открыть любую из них можно воспользоваться Project Manager-ом (рисунок 2).
Как всегда, для понимания материала тебе понадобятся исходники сегодняшней проги. Я не буду здесь их приводить, если нужно, то забрать их можно здесь. Всё готово, можно переходить к рассмотрению примера. Приготовся, занятие будет насыщенное.
Перейди в окно DataModule (рисунок 1). Как настроены связи я рассказывать не буду, потому что это мы уже проходили. Теперь дважды щёлкни по Table2. Что здесь нового? Ты наверно сразу не заметишь, но новое здесь есть - это "поисковое поле" (ого какое я слово выдумал). Ты можешь заметить что-то неладное, если обратишь внимание на то, что у нас два похожих поля "Country" и "Countr". Второе нас сейчас и будет интересовать.
Создание "поискового поля". Сначала я объясню, для чего оно нужно. У таблицы 2 в поле "Country" хранится ссылка на поле из таблицы "Country". Поэтому в DBGrid будет показываться индекс (я так и назвал это поле "индекс страны", это поле ты можешь сделать невидимым). Теперь щёлкни правой кнопкой мыши в окошке свойств полей (рисунок 3). Выбери пункт "New field".
В появившемся окне, нужно заполнить свойства:
Рис 3. Создание нового поля
Name - любое, как тебе удобно
Component - тоже любое, как тебе удобно
Type - В нашем случае название страны - это строка.
Size - Размер (если нужен).
Field type - Тип поля. В нашем случае это Lookup (поисковое).
Key field - связующие поле из этой таблицы.
Dataset - Dataset указывающий на таблицу-справочник.
Lookup field - связующие поле из справочника. Связь будет осуществляться как "Key field" - "Lookup field".
Result field - Значение этого поля справочника будет показываться вместо индекса.
Теперь остановись и внимательно обдумай всё что я здесь сказал. Попробуй пощёлкать по спискам, но ничего не меняй.
Итак, у нас получается, что поле "Countr" будет показываться поле "Country" из справочника, соответствующее полю "Country" из Table2. Запусти программу, и посмотри на результат в работе.
Рис 4. Свойства нового поля
Если что-то непонятно, то скоро будет ещё яснее. Сейчас мы познакомимся с компонентом TDBLookupComboBox , результат действия которого будет примерно таким же. Вот свойства, которые должны быть заполнены для получения такого эффекта:
DataSource - Таблицы, в которую сохраняется значение. В нашем случае это "User1.db".
DataField - Поле в этой таблице, где будет сохраняться значение. В нашем случае это "Country".
ListSource - Таблица, которая будет использоваться в качестве элементов выпадающего списка. В нашем случае это "Country.db".
ListFieldIndex - Поле из этой таблицы, которым будет запелнен выпадающий список. В нашем случае это "Country".
KeyField - Поле, по которому будет происходить связь между таблицами. В нашем случае это "key1".
В итоге получается похожий эффект. Попробую объяснить на словах. У компонента похожего на TСomboBox, выпадающий список заполняется значениями поля указанного в ListFieldIndex из таблицы ListSource. Когда пользователь выбирает значение из списка, то в поле указанное в DataField таблицы DataSource заноситься текущее значение поля KeyField из таблицы ListSource. Остановись и хорошенько обдумай всё, что я сказал. Если что-то непонятно, то придётся тебе играть с программой и смотреть, что в это время происходит в базе данных. Если и это не поможет, то иди мыть унитазы, программирование не для тебя.
Теперь рассмотрим простейший пример SQL запроса. Поставь в DataModule два компонента: TDataSource и TQuery. Соедини их так же как ты соединял TDataSource и TTable. У TQuery установи свойство DatabaseName также как и у TTable. Это нужно, чтобы запрос смог найти базу данных. Теперь дважды щёлкни по свойству SQL. В появившемся окне напиши:
SELECT *
FROM user1.db
Теперь установи свойство Active в "TRUE", и твой запрос выполнится. Результат запроса я отобразил в "DBGrid3" (расположен внизу формы). В нашем случае запрос очень простой, поэтому в нём нет ничего особенного, но со временем ты научишься писать достаточно серьёзные запросы к базам данных.
TQuery и TTable очень похожи и большинство из того, что мы проходили по TTable, ты можешь применить и к TQuery.
На этом наше занятие считаю оконченным. Удачи тебе.