Привязка элементов управления к данным
А сейчас мы рассмотрим еще одну очень интересную возможность — привязку элементов управления к данным. Это значит, что вы можете, скажем, заполнять списки значениями, взятыми из записей набора данных, или заимствовать оттуда же начальные значения для полей ввода. Первое, во всяком случае, очень часто бывает нужно.
Давайте добавим в нашу гостевую книгу второе поле — тип записи. Тип записи будет показывать, что хотел сказать посетитель сайта: похвалить его разработчика, поругать или сделать нейтральное замечание. Соответственно, это поле может принимать три значения: положительное, нейтральное или отрицательное замечание.
Откроем базу данных Guestbook.mdb в Access и добавим в таблицу Guestbook еще одно поле sign . Зададим для него числовой тип. После этого создадим еще одну таблицу под названием signs , содержащую два поля: счетчик id и текстовое Desc . В поле id будет помещаться уникальный номер каждой записи, а в поле Desc — описание соответствующей оценки. Сделаем поле id ключевым. После этого привяжем поле sign таблицы Guestbook к полю id таблицы Signs .
Далее откроем таблицу signs и создадим в ней три записи: "Положительно", "Нейтрально" и "Отрицательно". Access автоматически проставит в полях id уникальные номера этих записей. Теперь осталось открыть таблицу Guestbook и проставить в поле sign для всех записей какое-либо значение, неважно, какое. На этом подготовительные действия можно считать законченными. Закройте Access и вернитесь в Dreamweaver .
Откройте страницу AddRecord.asp . Поместите в форму новый элемент управления — раскрывающийся список sign . Вставьте его между полем ввода content и кнопкой отправки данных. И сохраните страницу.
Откуда будут браться значения для заполнения нашего списка? Правильно, из набора данных. Страница AddRecord . asp не содержит никаких наборов данных, поэтому нам нужно его создать.
Выберите в меню кнопки со знаком "плюс" панели Bindings пункт Recordset ( Query ). В диалоговом окне Recordset , которое появится на экране после этого, задайте имя создаваемого набора данных signs , выберите базу данных Guestbook и таблицу signs . После нажатия кнопки ОК набор данных будет создан.
Теперь выделите только что созданный нами раскрывающийся список signs и нажмите кнопку Dynamic , которая появится в редакторе свойств. На экране появится диалоговое окно Dynamic List / Menu .
В раскрывающемся списке Menu выбирается нужный список. Но, поскольку мы его уже выделили на форме, этот список недоступен.
В раскрывающемся списке Options From Recordset выбирается набор данных, из которого будут браться значения для заполнения выделенного списка. Пункт None позволит вам "отвязать" список от наборов данных, т. е. создать обычный список с фиксированным набором пунктов. Поле набора данных, из которого будут браться значения для создания пунктов, выбирается в раскрывающемся списке Labels , а поле, из которого будут браться значения этих пунктов, — в списке Values .
Выберите в списке Options From Recordset набор данных signs , в списке Labels — поле Desc , а в списке Values — поле id . И продолжим разговор об окне Dynamic List / Menu .
Если вы хотите, чтобы при открытии страницы какой-то пункт списка отображался изначально выбранным, воспользуйтесь полем ввода Select Value Equal To . В него вводится значение пункта, который должен быть изначально выбранным. В нашем случае это число 1 — значение поля id первой записи таблицы signs .
Если вы хотите поместить в список свои собственные пункты, не взятые из набора данных (статические), воспользуйтесь списком Static Options . Этот список состоит из двух колонок: Value (значение пункта) и Label (название пункта). Чтобы ввести в этот список новый пункт, нажмите кнопку со знаком "плюс", и пункт будет добавлен. Поочередно щелкните по значениям, находящимся в обеих колонках, введите нужный текст и не забудьте нажать клавишу < Enter >. Точно так же вы можете изменить необходимое значение в колонке любого уже созданного пункта.
Если вы хотите удалить ненужный пункт из этого списка, выберите его и нажмите кнопку со знаком "минус". А кнопки
^
и
vпозволят вам переместить выбранный пункт соответственно выше или ниже на одну позицию.
Введя все данные, нажмите кнопку ОК. Вот и все.
Точнее, не все. Нам еще нужно изменить параметры поведения Insert Record так, чтобы значение выбранного в списке sign пункта помещалось в поле sign таблицы Guestbook . Для этого откройте панель Server Behaviors и дважды щелкните по пункту Insert Record ( from " AddRecord "), после чего на экране появится уже знакомое вам диалоговое окно Insert Record . Выберите в списке Form Elements пункт Sign < ignore >, после чего выберите в раскрывающемся списке Column пункт Sign , а в раскрывающемся списке Submit As — пункт Numeric (впрочем, сам Dreamweaver автоматически выберет этот пункт). И, конечно, нажмите кнопку ОК.
Вот теперь действительно все. Можете проверить страницу в действии.
Создание сложных наборов данных
Осталось изменить страницу Guestbook _ table.asp так, чтобы она отображала не только содержимое поля content , но и содержимое поля sign . Давайте сделаем это и попутно изучим построение сложных SQL -запросов и создание сложных наборов данных.
На первый взгляд, задача, стоящая перед нами, очень проста. В самом деле, мы уже знаем, как создать динамический текст и привязать его к полю набора данных. Мы уже, собственно, выполнили это, когда делали страницы Guestbook.asp и Guestbook _ table.asp . Теперь же нам ничего не стоит добавить в повторяющуюся область последней страницы новый динамический текст, привязанный к полю sign .
Давайте так и сделаем. И что получится в результате? А вот что.
Когда мы откроем доработанную страницу Guestbook _ table.asp в Web -обозревателе, то увидим, что вместо слов "Положительно", "Отрицательно" или "Нейтрально" стоят цифры от 1 до 3. Почему? Да потому, что созданное нами поле sign имеет числовой тип, и именно число, находящееся в нем, отображается на странице. Но мы-то хотим увидеть слова, а не цифры! Что делать?
Создать сложный набор данных, извлекающий данные не из одной, а из нескольких таблиц. А для этого нам придется построить сложный SQL-запрос, и сделать это нужно вручную.
Откройте страницу Guestbook _ table.asp и переключитесь на панель Bindings . Дважды щелкните по пункту Recordset ( Guestbook ), представляющему созданный нами ранее простой набор данных. (Простым набором данных называется тот, который извлекает данные из одной таблицы.) На экране появится диалоговое окно Recordset . Щелкните по кнопке Advanced — и это окно изменит свой вид.
В этом диалоговом окне нам понадобятся поле ввода SQL , список Database Items и кнопки SELECT , WHERE и ORDER BY . Многоколоночный список Variables и все относящиеся к нему кнопки мы пока трогать не будем.
В поле ввода SQL , как вы поняли, вводится текст SQL -запроса. В настоящее время он таков:
SELECT * FROM Guestbook
Выше мы уже рассмотрели этот запрос по частям, поэтому не будем здесь повторяться. Напомним только, что этот запрос извлекает все поля всех записей из таблицы Guestbook .
Поскольку мы хотим создать новый запрос SQL , то давайте сначала удалим все содержимое поля ввода SQL . И начнем, что называется, с чистого листа.
Прежде всего поочередно откроем ветви Tables и Guestbook и выберем пункт Content в списке Database Items . Далее нажмем кнопку SELECT , чтобы поместить в поле ввода SQL ключевое слово select с выбранным нами полем content . В поле ввода SQL появится такой код:
SELECT Content FROM Guestbook
Затем поместим текстовый курсор после слов " SELECT Content ", откроем ветви Tables и Signs и выберем пункт Desc . Опять нажмем кнопку SELECT . Код примет следующий вид:
SELECT Content , Desc FROM Guestbook , Signs
Как видите, мы извлекаем данные уже из двух таблиц: поле content из таблицы Guestbook и поле Desc из таблицы Signs .
Осталось только добавить условие, связывающее запись таблицы Guestbook с записью таблицы signs . Для этого добавим условие выборки записей. Выберем пункт Sign в подветви Guestbook ветви Tables и нажмем кнопку WHERE . Код в поле ввода SQL опять изменится :
SELECT Content, Desc FROM Guestbook, Signs WHERE Sign
Поставим текстовый курсор после текста " WHERE Sign ", введем знак "=", выберем пункт ID ветви Signs в ветви Tables и опять нажмем кнопку WHERE . Код в поле ввода SQL примет свой окончательный вид:
SELECT Content , Desc FROM Guestbook , Signs WHERE Sign = ID
Здесь ключевое слово where обозначает условие отбора записей. А код sign = io показывает, что в набор попадут только те записи таблицы Guestbook , значения поля sign которых равно значению поля id соответствующей записи таблицы signs .
Чтобы проверить созданный SQL-запрос, нажмите кнопку Test . Если он правилен, на экране появится диалоговое окно Text SQL Statement , содержащее записи созданного набора данных.
Нажмите кнопки ОК обоих диалоговых окон. И на всякий случай сохраните страницу. Сложный набор данных, извлекающий записи из двух таблиц, нами создан. Этот набор содержит два поля: content (содержимое записи гостевой книги), взятое из таблицы Guestbook , и Desc (оценка сайта посетителем), взятое из таблицы signs .
Что теперь? Может, создать новый динамический текст и привязать его к полю Desc ? Можно, конечно. Но мы поступим подругому. Как? Сейчас увидите.