Private Sub TITLES_Reposition()
PUBLISHERS.Recordset.Seek "=", TITLES.Recordset.Fields("PubID")
If PUBLISHERS.Recordset.NoMatch Then lblPublisher.Caption = "***"
AuthorISBN.Recordset.Seek "=", TITLES.Recordset.Fields("ISBN")
If authorISBN.Recordset.NoMatch Then
lblAuthor.Caption = "***"
Exit Sub
End If
Authors.Recordset.Seek "=", AuthorISBN.Recordset.Fields("Au_ID")
End Sub
Каждый раз, когда пользователь изменяет позицию элемента управления Data в объекте RecordSet (переходит на другую запись в таблице TITLES), программа выполняет следующее.
1. Используется метод Seek для PUBLISHERS RecordSet, чтобы установить запись, в которой значение поля PubID соответствует значению полю PubID в таблице Titles. Если такой записи нет, то она печатает звездочки в текстовом поле, в котором могло быть имя издателя. Если нужная запись найдена, программа ничего не выполняет. Метод Seek помещает элемент управления PUBLISHERS Data на строку таблицы Publishers с именем издателя, связанным с названием книги. Соответствующее текстовое поле, связанное с данными, обновляется автоматически.
2. Затем программа находит запись таблицы Title Author, у которой поле ISBN равно ISBN текущей записи в таблице Titles. Если подобной записи не существует, печатаются звездочки и происходит выход из подпрограммы. Если запись найдена, то значение поля AuID становится ключом для поиска записи в таблице Authors, у которой значение поля AuID соответствует значению поля AuID в таблице Title Authors.
Метод Seek достаточно оперативный: поля в форме обновляются немедленно. Даже работа с большими файлами не приводит к значительным задержкам.
Примечание
Данная программа отображает только первого автора каждого издания. Очевидно, что более эффективно показать всех авторов каждого издания. Для усовершенствования приложения необходимо учесть, что методы Move объекта RecordSet работают с учетом значения индекса RecordSet. Например, вызов метода MoveNext для объекта RecordSet с индексом осуществляет переход на следующую запись в индексе. Для нашего случая имена второго и третьего авторов любого издания можно получить после первой совпадающей записи в таблице Title Authors. С этой целью можно вызвать метод MoveNext для объекта AuthorISBN RecordSet и если его поле ISBN такое, как ISBN текущей книги, то у книги- другой автор и его имя можно отобразить. Если поле ISBN отличается от поля ISBN текущей книги, значит авторов данной книги больше нет. Добавление имен авторов можно выполнять с помощью элемента управления ComboBox uли ListBox.
ВВЕДЕНИЕ В SQL
SQL (Structured Query Language - язык структурированных запросов) - это универсальный язык, используемый для управления БД. Он был разработан в 70-х годах доктором Коддом (E.F.Codd) в компании IBM.
Для экспериментов с SQL-операторами используется приложение SQLExec, рассмотренное далее в этом разделе. Это приложение позволяет выбрать БД, выполнить SQL-операторы и просмотреть результаты их работы.
SQL-операторы используются для создания новой БД, добавления в нее таблиц и индексов (в работе эти возможности не рассматриваются). Наиболее часто SQL-операторы используются для выборки данных из БД. SQL-операторы, используемые для выборки записей из таблиц БД, называются SQL-запросами и имеют следующий формат:
SELECT (список полей) FROM (список таблиц) [WHERE (выражение)]
[ORDER BY поле1, поле2, поле3, ….полеN]
Ключевые слова SQL не чувствительны к регистру и обозначают следующее:
1. (список полей).Эта часть команды SQL задает имена полей (разделены запятыми), которые будут включены в запрос. Если имя элемента (поля или таблицы) содержит пробел, необходимо заключить его в квадратные скобки ([ ]). Например, чтобы включить в запрос поле Jear Published (Год издания), нужно ввести [Year Published]. Полное имя каждого поля предваряется именем таблицы, которой оно принадлежит. Эта запись обеспечивает уникальность имен полей, даже если несколько таблиц имеют поля с одинаковыми именами. Например, полное имя поля Title в таблице Titles: [Titles]. Title. Если имя поля Title не появляется ни в какой другой таблице, то имя таблицы можно опустить и обратиться к этому полю как к Title. Результат выполнения запроса содержит записи таблицы, соответствующие заданным критериям, и строку заголовков. Заголовки - это имена полей, задаваемые при проектировании БД. Чтобы изменить заголовки используется ключевое слово AS после имени поля. Например, если имеется поле Year Published в таблице Titles, то можно изменить заголовок следующим образом:
[Titles].[Year Published ] AS [Год издания]
Чтобы выбрать все поля в таблице, используйте звездочку (*) вместо перечисления имен всех полей. Например, следующая команда выбирает все поля в таблице Titles:
SELECT * FROM Titles.
2. (список таблиц).Эта часть команды содержит имена всех таблиц, на которых основан запрос. При выборе полей из нескольких таблиц необходимо указать как связать таблицы. Если вы укажете только их имена, то результат запроса будет содержать все возможные комбинации полей в каждой таблице. Чтобы связать поля из нескольких таблиц необходимо создать объединение (join), являющееся фундаментальным понятием в командах выбора SQL.
3. (Выражение).Эта часть команды представляет собой логическое выражение, использующееся для отбора данных и возвращающее объект RecordSet. Для формирования этого выражения можно использовать большинство встроенных функций и операторов Visual Basic, а так же SQL-операторы.
Наиболее широкое распространение имеют следующие SQL-операторы:
1) field_name BETWEEN value1 AND value2. Возвращаются только строки, в которых поле field_name имеет значение в диапазоне от value1 до value2. Если поля имеют тип DATA, то внутри выражения они представляются по американской системе (месяц/день/год) и значения дат заключаются в “решетки”. Например, следующая SQL-команда возвращает из БД записи, в которых поле с именем Dат содержит значения в пределах 1994 года:
SELECT <поля таблиц БД> FROM <имя таблиц БД> WHERE Dat BETWEEN #l/l/94# AND #12/31/94#
2) field_name IN (value1, value2, ...) Возвращаются только те строки, в которых поле field_name совпадает с одним из значений в круглых скобках. Внутри скобок задается любое число элементов (см. рис. 9).
Рис 9. Пример использования SQL-оператора IN
3)LIKE. Этот оператор – один из наиболее мощных и сложных в SQL. Он предназначен для выбора строк по шаблону. Для формирования выражения используются специальные символы, перечисленные в табл. 8.
Таблица 8. Специальные символы, используемые в операторе LIKE
*
| Любая группа символов
| Па* определяет Пар, Парилка
| ?
| Любая одиночная буква
| ?к определяет ак, вк
| #
| Любая одиночная цифра
| 34#67 определяет 34567, 34167
| []
| Один символ из заключенных в скобки
| [ki]r определяет kr и ir
| [!]
| Любой символ не из скобок
| [!k]r определяет tr, но не kr
| [-]
| Любой символ из диапазона
| [a-c]t определяет at, bt
|
Пример использования LIKEпоказан на рис. 10.
Рис 10. Пример использования SQL-оператора LIKE
4.ORDER BY (field_name1, field_name2,...). Этот оператор упорядочивает строки RecordSet по значениям указанных полей (см. рис. 9-10).
SQL-объединения
Объединения определяют, как связываются несколько таблиц в запросе. Существуют три типа объединений:
• Left Outer (Левое внешнее);
• Right Outer (Правое внешнее);
• Inner(Внутреннее).
Операция объединения соединяет все строки одной таблицы со строками другой таблицы. Объединения обычно сопровождаются условием, которое определяет, какая запись на каждой стороне объединения появится в RecordSet.
Left Outer(Левое внешнее объединение). Это объединение отображает все записи из левой таблицы и только те записи правой таблицы, которые удовлетворяют задаваемым пользователем критериям. Этообъединение имеет следующий синтаксис:
FROM (первичная таблица) LEFT JOIN (вторичная таблица) ON
(первичная таблица).(поле) (сравнение) (вторичная таблица).(поле)
В левом внешнем объединении всем записям в первичной таблице поставлены в соответствие записи из вторичной таблицы, отвечающие заданным критериям. Записи из левой таблицы (имя которой указано слева от ключевого слова LEFT JOIN) включаются даже тогда, если для них нет соответствующих записей во вторичной таблице.
Right Outer (Правое внешнее объединение). Это объединение подобно левому внешнему объединению, но в данном случае отображаются все записи правой таблицы и соответствующие критерию записи левой таблицы. Это объединение имеет следующий синтаксис:
FROM (вторичная таблица) RIGHT JOIN (первичная таблица) ON
(вторичная таблица).(поле) (сравнение) (первичная таблица).(поле)
Внешние объединения возвращают огромные наборы записей. Поэтому необходим избегать их использования без особой необходимости. С другой стороны, внутренние объединения просты и с ними строят большинство команд SQL.
Inner (Внутреннее объединение). Это объединение возвращает строки обеих включаемых в операцию таблиц, которые соответствуют заданным критериям. Внутреннее объединение имеет следующий синтаксис:
FROM (первичная таблица) INNER JOIN (вторичная таблица) ON
(первичная таблица).(поле) (сравнение) (вторичная таблица).(поле)
Рассмотрим несколько примеров. В простейшем виде внутренние объединения похожи на предложения WHERE. Следующий SQL-оператор объединяет записи из таблиц Titles и Publishers БД BIBLIO, если у них совпадают поля PublD. Возвращается набор записей с именами всех книг и их издателей.
SELECT Titles.Title, Publishers.Name FROM Titles, Publishers
WHERE Titles.PubID = Publishers.PubID
Можно получить такой же RecordSet, используя внутреннее объединение (см. рис.11)
SELECT Titles.Title, Publishers.Name FROM Publishers INNER JOIN
Titles ON Titles.PubID = Publishers.PubID
Рассмотрим более сложную операцию объединения. На этот раз необходимо получить из БД BIBLIO все названия изданий наряду с их авторами и издателями:
SELECT Titles.Title, Titles.ISBN, Authors.Author, Titles.[Year Published], Publishers.[Company Name] FROM (( [Title Author] INNER JOIN Titles ON [Title Author].ISBN = Titles.ISBN) INNER JOIN Authors ON [Title Author].Au_ID = Authors.Au_Id) INNER JOIN Publishers ON Titles.PubId = Publishers.PubId ORDER BY Titles.Title
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, задает порядок отображения заказов.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|