Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 5136 / 389 | Оценка: 4.23 / 3.83 | Длительность: 28:12:00
Специальности: Программист, Менеджер
Лекция 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. Страница с вопросами и ответами, выводимая по запросу пользователя

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

Ольга Гафарова
Ольга Гафарова

Добрый день. Подскажите формулы при решении задачи на рис. 2.2 в лекции №2. Закон Ома, какие должны использоваться формулы для I и R

Курс: Основы офисного программирования и документы Excel

Серегй Лушников
Серегй Лушников