Поскольку мы хотим создать новый запрос 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 И ПОЛ6 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? Можно, конечно. Но мы поступим по-другому. Как? Сейчас увидите.
Работа с динамическими атрибутами
Когда мы говорили о шаблонах (см. главу 9), то выяснили, что атрибуты тегов можно сделать изменяемыми. В Web-страницах, созданных на основе шаблона, мы можем задавать значения для этих атрибутов и, таким образом, менять их внешний вид в более широких пределах. Но атрибуты тегов можно сделать и динамическими, т. е. брать их значения из полей набора данных. Здесь мы рассмотрим, как работать с такими атрибутами.
Давайте сделаем так, чтобы содержимое разных записей набора данных Guestbook отображалось различным цветом в зависимости от значения, содержащегося в поле sign. Пусть, например, содержимое поля Content отображается темно-синим цветом, если в поле sign содержится единица ("Положительно"), темно-красным — если содержится тройка ("Отрицательно"), черным — в остальных случаях (двойка, "Нейтрально"). Соответствующие коды цветов в этом случае:
· темно-синий — #000099;
· темно-красный — #990000;
· черный — #000000.
Откроем базу данных Guestbook.mdb в Access и создадим новое поле в таблице signs. Дадим этому полю имя Color, текстовый тип и установим его длину в 7 символов — этого хватит, чтобы хранить коды цветов. После чего откроем таблицу signs и введем коды цветов в соответствующие записи таблицы. После этого закроем Access.
Далее переключимся в Dreamweaver, вызовем диалоговое окно Recordset для набора данных Guestbook и добавим в него вновь созданное поле. Попробуйте сделать это самостоятельно. Если же вы хотите сразу перейти к работе с динамическими атрибутами, просто введите в поле ввода SQL такой код:
SELECT Content, Desc, Color FROM Guestbook, Signs WHERE Sign=ID
Теперь выделим содержимое повторяющейся области страницы, щелкнув по тексту "{Guestbook.Content}", и зададим для него черный цвет. Для этого воспользуемся хорошо знакомым селектором цвета в редакторе свойств. В результате Dreamweaver поместит содержимое повторяющейся области в тег <FONT> с атрибутом COLOR — как вы помните, именно с их помощью задается цвет текста.
Теперь выделите содержимое тега <FONT>, щелкнув по соответствующей кнопке секции тегов. И переключитесь в режим отображения кода. Хотя в интерактивном руководстве и описано, как привязать атрибут к полю набора данных в режиме отображения страницы, но почему-то в данном случае Dreamweaver ведет себя очень странно. В частности, раскрывающийся список Bind To, с помощью которого и выполняется привязка поля набора данных к атрибуту тега, остается недоступным. Поэтому мы поступим иначе.
Выделите значение атрибута COLOR тега <FONT>. А теперь просто перетащите на него пункт Color панели Bindings. Значение атрибута COLOR примет такой вид (выделено полужирным шрифтом):
<FONT COLOR="<%=(Guestbook.Fields.Item("Color").Value)%>">
Код, который Dreamweaver подставил в качестве значения атрибута COLOR, извлекает из поля Color набора данных значение цвета и присваивает его атрибуту COLOR. Как видите, все достаточно просто и, опять же, "прозрачно".
Точно таким же образом вы можете создавать другие динамические атрибуты. Главное - "попасть" мышью в нужный фрагмент исходного кода. Но, вероятно, вы с этим справитесь и сами.
Вот и все. Теперь можете открыть вашу страницу в Web-обозревателе и посмотреть на получившийся результат.
Получение данных от другой Web-страницы
Мы выяснили, как передать данные, введенные в форму, в таблицу, создав, таким образом, новую запись. Но не всегда данные, переданные с другой страницы, нужно сохранять в базе. Иногда их необходимо обработать на другой странице, нигде не сохраняя.
Давайте сделаем следующее. Создадим небольшую статичную Web-страничку с тремя гиперссылками, направляющими посетителя па страницу Guestbook_table.asp и заставляющими последнюю показать только записи, удовлетворяющие определенному условию. Пусть первая из них будет показывать записи, значения поля sign которых равно 1, вторая — записи с полем sign, равным 2, третья — 3. Назовем эту страницу Selector.htm.
Интернет-адрес первой гиперссылки страницы Selector.htm будет таков:
Guestbook_table.asp?sign=1
Здесь мы передаем методом GET странице Guestbook_table.asp параметр sign, равный 1. (Вспомните главу 15, где описывались оба метода передачи данных.) Соответственно, адреса других гиперссылок будут отличаться от этого только значением параметра sign.
А для того чтобы отобрать нужные записи из набора данных Guestbook страницы Guestbook_table.asp, мы используем фильтр, сравнивающий значение поля sign со значением параметра sign, переданного нам от страницы Selector.htm. Как видите, все очень просто и довольно наглядно.
Нет смысла подробно описывать, как создается страница Selector.htm — это вы уже знаете. Вместо этого сосредоточимся на странице Guestbook_table.asp и фильтре, отбирающем записи из таблиц в набор. Откройте данную страницу, если вы ее уже закрыли. И переключитесь в панель Bindings.
Для того чтобы получить данные от другой Web-страницы, нам нужно создать параметр гиперссылки. Этот параметр впоследствии примет значение, переданное от другой страницы методом GET. А уж принятое им значение мы сможем использовать где угодно.
Чтобы создать параметр гиперссылки, выберите в меню кнопки "плюс" панели Bindings пункт Request Variable. После этого на экране появится диалоговое окно Request Variable.
В раскрывающемся списке Туре выберите пункт Request.QueryString, а в
поле ввода Name введите имя создаваемого параметра (в нашем случае -sign). Затем нажмите кнопку ОК. После этого в списке панели Bindings появится новая ветвь Request с единственным пунктом QueryString.sign.
Внимание!
Вы не сможете изменить созданный вами параметр гиперссылки, так что вводите данные внимательно. Если вы все же ошиблись, удалите неверно заданный параметр и создайте его заново.
Если же вы передаете данные методом POST, вам будет нужно создать параметр формы. Для этого выберите в меню кнопки "плюс" все тот же пункт Request Variable, но в раскрывающемся списке Туре диалогового окна Request Variable выберите пункт Request.Form.
Создание фильтров
А теперь можно приступить к созданию фильтра, отбирающего записи из таблицы в набор.
Помните, как мы создали сложный набор данных? Если не помните, рассмотрим код SQL-запроса, созданного нами:
SELECT Content, Desc, Color FROM Guestbook, Signs WHERE Sign=ID
Ключевое слово WHERE языка SQL задает условие, согласно которому из таблицы будут извлекаться записи. В приведенном выше примере мы уже фактически создали условие, отбирающее только те записи таблицы Guestbook, для которых в таблице signs имеется "пара". Причем "пары" мы отбирали по значениям поля sign таблицы Guestbook и поля ID таблицы signs. Такие условия называются условиями связи таблиц.
Фильтром же называется условие отбора записей. Это условие используется не для связи таблиц, а для отбора записей из таблицы. Например, в приведенном ниже SQL-запросе используется именно условие отбора записей, иначе говоря, фильтр:
SELECT Content FROM Guestbook WHERE Sign=2
Этот запрос создаст набор данных, включающий только те записи таблицы Guestbook, поля sign которых содержат значение 2 ("Нейтрально").
Чтобы создать фильтр, нам придется добавить условие отбора записей к уже существующему условию связи таблиц. Это совсем просто. Вызовите диалоговое окно Recordset для нашего набора данных Guestbook. Если оно отобразилось в обычном виде, щелкните кнопку Advanced, чтобы переключить его в расширенный вид. И посмотрите на содержимое поля ввода SQL.
Итак, нам нужно добавить в SQL-запрос Новое условие. Мы будем сравнивать значение поля sign и...
Но с чем мы его будем сравнивать?
Ах, да, с параметром sign, переданным страницей Selector.htm. Но как его сюда ввести?
Очень просто. Для этого нам понадобится создать переменную SQL-запроса, представляющую некий параметр, полученный от другой Web-страницы или в результате каких-то вычислений. И в этом нам поможет список Variables диалогового окна Recordset и относящиеся к нему элементы управления.