
- •Введение
- •1. Базы данных и системы
- •1.1. Наборы записей RecordSet
- •1.2 Элементы управления Data
- •1.3.Свойства элемента управления Data
- •1.4. Методы элемента управления Data
- •Option Compare Text,
- •Option Compare Binary.
- •1.5. Реляционные связи
- •1.5.1. Первичный ключ
- •1.5.2. Внешний ключ
- •1.5.3 Индексы
- •2. Структура базы данных biblio
- •3. Проверка корректности данных
- •3.1 Событие Validate
- •3.2. Событие Error
- •4. Ввод данных
- •5. Доступ к полям в объектах recordset
- •6. Введение в sql
- •Select (список полей) from (список таблиц) [where (выражение)]
- •11. Пример использования внутреннего объединения.
- •6.2. Использование sql-операторов
- •7. Усовершенствованные элементы управления, связанные с данными
- •7.1. Связанный с данными элемент управления List
- •7.3. Связанный с данными элемент управления Grid
- •8. Отображение баз данных
- •8.1 Объект Database
- •8.2 Объект TableDef: определение таблиц
- •8.2.1 Идексы таблицы
- •8.2.2 Поля таблицы
- •8.3 Объект QueryDef: определение запросов
- •8.4. Описание проекта dbStructure
11. Пример использования внутреннего объединения.
Результат работы команды приведен на рис. 12
Рис 12. Пример сложного внутреннего объединения
В приведенном SQL-запросе в квадратные скобки заключены имена полей, которые содержат пробелы. Все имена полей предваряются соответствующим именем таблицы (хотя большинство имен полей уникально), чтобы сделать команду более легкой для чтения.
В списке полей устанавливаются следующие поля:
• Titles.Title - название книги;
• Titles.ISBN - ISBN код книги;
• Authors. Author - автор книги;
• Titles.[Year Published] - год публикации книги;
• Publishers.[Company Name] - издатель книги.
БД BIBLIO содержит четыре таблицы, а наш запрос требует данных из трех таблиц. Фактически никакие данные из таблицы Title Author в результатах запроса не отображаются, но эта таблица связывает названия и имена авторов (через ISBN код книги), поэтому ее необходимо использовать в SQL-запросе.
Поля не выбираются из каждой конкретной таблицы непосредственно. Их получают из ряда внутренних объединений. Первое внутреннее объединение такое:
[Title Author] INNER JOIN Titles ON [Title Author].ISBN = Titles.ISBN
Это выражение извлекает (и соединяет) каждое название издания с идентификатором его автора, если ISBN-код в обеих таблицах совпадает. В сущности будет получен идентификатор автора для каждого издания. Назовем это выражение (которое является объектом RecordSet) Title-AuthorIDs. Данный RecordSet помещен в круглые скобки и соединен с другим RecordSet.
(Title-AuthorIDs) INNER JOIN Authors ON [Title Author].Au_ID =Authors.Au_ID
Этот RecordSet соединяет идентификаторы авторов предыдущего RecordSet с фактическими именами авторов. Мы создали RecordSet с именами авторов и названиями изданий. Назовем его Titles-Author. Последняя операция объединения соединяет RecordSet, который содержит имена авторов и изданий с таблицей Publishers:
(Titles-Author) INNER JOIN Publishers ON Titles.PubID = Publishers.PubID
На этот раз идентификаторы издателей должны совпадать. Результирующий RecordSet содержит названия изданий, авторов и издателей и является источником данных. Последнее ключевое слово в этой SQL-команде, ORDER BY, задает порядок отображения заказов.
6.2. Использование sql-операторов
Свойство RecordSet элемента управления Data необязательно должно быть именем таблицы. Это свойство может быть представлено SQL-запросом. В качестве примера рассмотрим ранее приведенное выражение Data1, которое отображает несколько полей из таблицы Titles БД BIBLIO. Предположим, необходимо, чтобы приложение Datal отобразило наименование книг, изданных только в 1994 году. Для этого необходимо выполнить следующие действия.
1. Откройте приложение Datal и выберите элемент управления Data.
2. В окне Properties найдите свойство RecordSource и введите следующий SQL оператор (рис. 13):
SELECT * FROM Titles WHERE [Year Published] = 1994
3. Запустите приложение и используйте кнопки элемента управления Data для перемещения наименования книг, изданных в 1994 году.
Так как SQL-операторы широко используются при работе с БД, то допускается их непосредственное включение в БД. Если открыть список свойства RecordSource элемента управления Data, соединенного с БД BIBLIO, то видно, что он содержит не только имена таблиц. Он содержит имена SQL-операторов, сохраненных непосредственно в БД. Например, элемент All Titles не является именем таблицы. Это - имя запроса, который возвращает необходимый RecordSet (название изданий, их авторов и издателей)
Рис. 13. Присвоение свойству RecordSource
SQL-оператор для получения RecordSet
В качестве примера использования запросов модифицируем ранее рассмотренное приложение ManyTbls. Это приложение объединяет все таблицы БД BIBL1O для отображения названий книг с именами авторов и издателей. Как уже отмечалось, в этом приложении для объединения таблиц использование метода Seek не является эффективным. Главным было демонстрация использования индексов. Реализуем это приложение с использованием SQL-операторов в следующей последовательности:
Удалите все элементы управления Data формы и разместите в ней новый элемент управления Data (с именем Data1).
Соедините этот элемент управления с БД BIBLIO, указав в свойстве DatabaseName путь к БД.
Откройте список свойства RecordSource и выберите All Titles. Это имя SQL-запроса БД, который возвращает необходимый RecordSet (названия изданий, их авторов и издателей).
Так как RecordSet создан с помощью SQL-оператора, то он является набором записей типа DynaSet, и для элемента управления Data необходимо установить свойство RecordSetType в 1-DynaSet.
Теперь откорректируйте свойства DataSource и DataFields элементов управления, размещенных в форме, чтобы они были связаны с соответствующими полями RecordSet через элемент управления Data1. Для этого необходимо установить их свойство DataSource в значение Datal, а свойство DataField - в Title, Company Name, Year Published и Author.
Последние два поля в основной форме приложения (Descriptions и Comments) не являются частью запроса All Titles, поэтому удалите их из формы. Можно изменить запрос или создать новый (который содержит эти поля), основанный на запросе All Titles.