Опубликован: 13.09.2006 | Уровень: для всех | Доступ: свободно
Лекция 11:

Создание интерактивных Web-документов

Страница 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. Страница с вопросами и ответами, выводимая по запросу пользователя

На этом я заканчиваю описание примера, главы, книги и всей серии "Офисное программирование".

Ольга Гафарова
Ольга Гафарова
Непонятен ход решения задачи
Серегй Лушников
Серегй Лушников
Может ли объект Recordset быть потомком объекта Record?
Геннадий Шестаков
Геннадий Шестаков
Беларусь, Орша
Светлана Ведяева
Светлана Ведяева
Россия, Саратов