Страница qomFromBase - страница, где информация, необходимая пользователю, читается из базы данных
Напомню, эта страница вызывается после нажатия любой из трех командных кнопок с заголовками: "Посмотреть мои вопросы и ответы на них", "Посмотреть все вопросы и ответы на них", "Посмотреть отзывы и оценки". При вызове странице ей передаются три параметра - имя нажатой кнопки, название книги и фамилия автора.
Теперь нам предстоит рассмотреть серверный код, позволяющий принять параметры, проанализировать и выполнить запрос пользователя на получение нужной ему информации. Ну и, конечно же, потребуется сформировать динамически HTML-код, представляющий результаты запроса на странице в приемлемой форме.
На этапе проектирования эта страница, также как и предыдущая, пуста. Все, что на ней появится, когда она откроется на клиентском компьютере, будет определяться результатами выполнения серверного кода.
Действия, а, следовательно, и программный код этой страницы во многом аналогичен коду предыдущей страницы. По этой причине я не буду приводить весь серверный код, а ограничусь некоторыми фрагментами. В этот раз начну с исполняемой части кода:
<SCRIPT LANGUAGE=vbscript RUNAT=Server> '********************************************************** '** Исполняемый код на серверной стороне ** '************ на серверной стороне ************************ 'Инициализация переменных InitVars 'Анализ запроса и выполнение действия, заданного пользователем SelectAndExec </SCRIPT>
Как можно видеть, этот фрагмент практически совпадает с исполняемым кодом предыдущей страницы. Хотя вызываемые процедуры сохранили свои имена и назначение, но имеют, конечно, другое содержание. Поскольку информация на страницу передавалась не так как в предыдущем случае, то и процедура InitVars использует другие методы для извлечения этой информации. Вот код этой процедуры:
Sub InitVars() Set Con1=Server.CreateObject("ADODB.Connection")
pUser=Session("UserId") pUser =CLng(pUser) pAction = Request.QueryString("btnName") pAuthor =Request.QueryString("Author") pTitle =Request.QueryString("Title") End Sub 'InitVars
Основное отличие этой процедуры от своего аналога состоит в том, что используется метод QueryString объекта Request, а не метод Form, как ранее.
Одноименная процедура SelectAndExec, сохраняя свое назначение, также в ряде деталей отличается от своего аналога:
Sub SelectAndExec() Select Case LCase(pAction) Case "lookallq" LookQA_All Case "lookmyq" LookQA_my(pUser) Case "lookom" LookOM 'Case Else Response.Write "Else" End Select Response.Write "<p><A href=""qpage.asp"">" & _ "<font size=7 color = ""#FF6666""> Вернуться </font> </a>" Response.Write "на страницу Читатели" End Sub 'SelectAndExec
Здесь в операторе Select анализируется, какие данные о книге желает получить пользователь и в зависимости от этого вызывается одна из трех процедур - LookQA_All, LookQA_my, LookOM, которые соответственно позволяют просмотреть ответы на все вопросы, вопросы конкретного пользователя, отзывы и оценки по книге. Поскольку все эти процедуры принципиально устроены одинаково, то я ограничусь рассмотрением первой из них.
Процедура LookQA_All выполняет хранимый запрос на получение всех вопросов и ответов к заданной книге и формирует HTML-код, отображающий результаты запроса на экране. Вот как она выглядит:
Sub LookQA_All() 'Показ всех вопросов 'Получение данных из базы данных CreateConnection 'Получение набора записей CreateRSAllQ 'Перепись данных в таблицу на html-странице strTitle = "Вопросы и ответы к книге '" & pAuthor & _ ":" & pTitle & "'" CreateTHead(strTitle) 'Заголовок таблицы CreateTBody 'Тело таблицы End Sub
Как видите, она состоит из вызовов четырех процедур, решающих частные задачи. О процедуре CreateConnection говорить не буду, а другие давайте рассмотрим. Процедура CreateRSAllQ создает требуемый набор записей. Задача эта уже неоднократно встречалась, но все-таки посмотрим, как она решается в данной ситуации:
Sub CreateRSAllQ() 'Создание команды и набора записей с вопросами и ответами Dim par 'Параметр запроса Set Cmd1=Server.CreateObject("ADODB.Command") Set Rst1=Server.CreateObject("ADODB.Recordset") With Cmd1 'Конфигурирование объекта Command .ActiveConnection = Con1 .CommandText ="QAAll" .CommandType = 4 'adCmdStoredProc Set par= .CreateParameter("repAuthor",202,1,255) par.value=pAuthor .Parameters.Append par Set par= .CreateParameter("repTitle",202,1,255) par.value=pTitle .Parameters.Append par 'Формирование набора записей Rst1.Open Cmd1 End With End Sub 'CreateRSAllQ
И здесь используется хранимый запрос с параметрами, с помощью которого и создается искомый набор записей. Приведу сам запрос:
PARAMETERS repAuthor Text ( 255 ), repTitle Text ( 255 ); SELECT QA.Question, QA.QDate, QA.Answer, QA.ADate FROM QA WHERE (((QA.Author)=[repAuthor]) AND ((QA.Title)=[repTitle]));
Замечу, что таблица QA базы данных хранит вопросы пользователей и ответы на эти вопросы, сделанные авторами, редакторами, переводчиками. Я оставляю вне рассмотрения то, как даются ответы, для этого нужно было бы рассмотреть не только страницу читателей, но и страницу писателей.
Рассмотрим теперь, как результаты запроса, представленные полученным в процедуре CreateRSAllQ набором записей Rst1, преобразуются в таблицу, отображаемую на экране пользователя. Конечно, для "красивого" отображения необходим хороший дизайн, а, следовательно, и более глубокое знание языка HTML. Я приведу тексты процедур, решающих эту задачу, но особых комментариев давать не стану, хотя знание HTML и XML - это неотъемлемая часть знаний, необходимых Web-программисту.
Процедура CreateTHead строит заголовочную часть таблицы, в которой будут отображаться вопросы и ответы. Она используется в нескольких вызовах, ее параметр передает текст появляющегося заголовка. Вот ее код:
Sub CreateTHead(Tit) 'Организация заголовка таблицы вопросов и ответов Response.Write "<table border =1 id=tblQA width=""90%"">" Response.Write "<caption align = ""center"">" & _ "<font size = 5 color=""gray"">" & _ Tit & "</font></caption>" 'Организация заголовков столбцов таблицы Response.Write "<COLS=4>" Response.Write "<Col width=""40%"">" Response.Write "<Col width=""10%"">" Response.Write "<Col width=""40%"">" Response.Write "<Col width=""10%"">" Response.Write "<THead>" Response.Write "<tr bgcolor= ""lightblue"">" Response.Write "<td>Вопрос" Response.Write "<td>Дата вопроса" Response.Write "<td>Ответ" Response.Write "<td>Дата ответа" Response.Write "</THead>" End Sub 'CreateTHead
Текст ее достаточно понятен - строится таблица из четырех столбцов с заголовками, указанными для каждого поля. Таблица по ширине занимает 90% отводимого ей пространства экрана, задаются также пропорциональные размеры столбцов.
В следующей процедуре создаются записи этой таблицы. Число строк таблицы, естественно определяется числом записей в наборе, полученном по результатам запроса. Приведу код процедуры CreateTBody:
Sub CreateTBody() 'Организация тела таблицы вопросов и ответов While Not Rst1.EOF Response.Write "<tr>" Response.Write "<td>" & _ Rst1.Fields("Question").Value & "</td>" Response.Write "<td>" & _ Rst1.Fields("QDate").Value & "</td>" If Rst1.Fields("Answer").ActualSize=0 Then Response.Write "<td>" & _ " Пока ответа нет!</td>" Else Response.Write "<td>" & _ Rst1.Fields("Answer").Value & "</td>" End If If Rst1.Fields("ADate").ActualSize=0 Then Response.Write "<td>" & _ Date & "</td>" Else Response.Write "<td>" & _ Rst1.Fields("ADate").Value & "</td>" End If Response.Write "</tr>" Rst1.MoveNext Wend Response.Write "</table>" End Sub 'CreateTBody
Это более программистский текст - здесь реализован обычный проход по набору записей, и для каждой записи формируется соответствующая строка таблицы. Заметьте, поскольку ответа на некоторый вопрос может и не быть, а значит и дата ответа не будет указана, то эта ситуация анализируется и в случае отсутствия ответа выдается соответствующее сообщение. В заключение давайте взглянем, как выглядит таблица, формируемая в ответ на запрос по просмотру отзывов и оценок по одной из книг:
увеличить изображение
Рис. 11.7. Страница с вопросами и ответами, выводимая по запросу пользователя
На этом я заканчиваю описание примера, главы, книги и всей серии "Офисное программирование".