Фильтрация и сортировка в ASP
 

При разработке приложений важно обеспечить не только их высокую производительность, но и удобство использования. Бывает, что эти две цели взаимно исключают друг друга. В данной статье я покажу, как при помощи одной простой страницы Active Server Pages (ASP) добиться высокой производительности приложения, сохранив простоту его применения.

В качестве примера я буду использовать небольшое приложение, которое извлекает и выводит на экран данные из таблицы контактов Contact. Эта таблица является частью большого учебного приложения, работающего в корпоративной сети и обеспечивающего потребности отдела продаж и руководства некоторой компании, которая занимается обучением пользователей. Это приложение выводит на экран список из таблицы контактов Contact, размещенной в SQL Server; предоставляет пользователям функции быстрого поиска нужных контактов и обеспечивает возможность манипулирования данными при помощи разнообразных сортировок. Помимо этого приложение должно обладать высокой производительностью, то есть быстро предоставлять нужные результаты. ASP позволяет легко достичь всех этих целей, поскольку дает возможность создавать при помощи сценария настраиваемые страницы. Я воспользовался языком VBScript, потому что он прост в применении и широко распространен в приложениях для Web. При помощи сценария пользователи смогут легко производить в рамках приложения разнообразные действия, например, сортировку.

В листинге 1 показан код T-SQL, который создает таблицу контактов Contact.

ЛИСТИНГ 1: Создание таблицы контактов Contact. CREATE TABLE [dbo].[Contact] ( [ContactID] [int] IDENTITY (1, 1) NOT NULL , [ADTPID] [char] (10) NULL , [InterestListFlag] [char] (1) NULL , [InstructorFlag] [char] (1) NULL , [PrimaryContact] [char] (1) NULL , [TrainingProspect] [char] (1) NULL , [ConsultingProspect] [char] (1) NULL , [CompanyName] [char] (100) NULL , [FirstName] [char] (50) NULL , [LastName] [char] (70) NULL , [Title] [char] (150) NULL , [Address1] [char] (150) NULL , [Address2] [char] (100) NULL , [City] [varchar] (75) NULL , [StateProvince] [char] (100) NULL , [ZIP] [char] (60) NULL , [Country] [varchar] (75) NULL , [Phone] [char] (40) NULL , [MobilePhone] [char] (40) NULL , [Pager] [char] (40) NULL , [Fax] [char] (40) NULL , [Email] [char] (70) NULL , [Comments] [text] NULL , [DateAdded] [datetime] NULL , [PendingVerification] [char] (1) NULL , [WebSite] [char] (100) NULL , [MetContactAt] [char] (100) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
В листинге 2 приведен файл database.asp. Он содержит коды ADO и ASP, необходимые для доступа к базе данных, в состав которой входит таблица Contact.

 

Представление данных о контактах

Первая проблема, которую предстояло решить, состояла в выборе способа представления данных о контактах. Мы не хотели при первом посещении страницы пользователем intranet показывать всю информацию о контактах, поскольку таблица контактов Contact была очень большой и продолжала быстро расти. Показ всех данных, содержащихся на странице, не только истощал бы SQL Server, но и приводил к передаче очень больших объемов данных через сеть, замедляя работу страницы и внося дополнительные задержки в процесс поиска нужной информации и ее сортировки.

Поэтому мы провели фильтрацию данных и ограничили первоначально показываемые сведения лишь теми лицами из списка контактов, чьи фамилии начинались с буквы А. Процесс фильтрации предоставлял пользователям три возможности: выбрать один из показанных контактов, начинающихся с буквы А; выбрать какой-либо другой контакт, введя первую букву его фамилии; или же выбрать все контакты, All Contacts. На Рис. 1 показан интерфейс страницы, который работает так же, как и интерфейс таблицы Contacts в Microsoft Outlook. Чтобы провести сортировку при таком представлении, пользователям достаточно щелкнуть по любому заголовку столбца в таблице. А при работе в режиме редактирования Edit можно открыть сведения о каком-либо контакте, щелкнув по нему.



Рис.1 Интерфейс страницы

Код ASP

В листинге 3 приведен код страницы sqlcontactlist.asp. Первые несколько строк кода этого листинга, обозначенные меткой А, определяют переменные, которые в дальнейшем будут использоваться кодом ASP. Команда include file вносит код страницы database.asp, которая используется для доступа к SQL Server. Чтобы указать местоположение файла, следует либо поместить команду include file в ту же самую папку, в которой находится основной файл, либо полностью указать путь к этому файлу. Применяемые в коде страницы database.asp функции используют константы из библиотеки типов ADO. Для того чтобы сослаться на библиотеку типов, следует открыть проект, который содержит эти файлы в Visual InterDev, выбрать из меню Project пункт Project References, после чего выбрать библиотеку ActiveX Data Objects. Чтобы функции базы данных заработали, следует изменить информацию о соединении в функции GetDSN(), которая содержится в коде страницы database.asp.

Первые две строки кода, обозначенные в листинге 3 меткой В, устанавливают переменные уровня сценария. Эти переменные содержат критерии фильтрации и сортировки для данной страницы. Переменная sLastNameSelect содержит либо первую букву фамилии контакта, по которой пользователь хочет провести фильтрацию, либо символьную строку All для вывода всей таблицы контактов. Переменной sSort, содержащей критерий сортировки, значение присваивается только тогда, когда пользователь щелкнет по заголовку какого-либо столбца, по которому он хочет провести повторную сортировку. Когда пользователь впервые обращается к странице, эта переменная не содержит никакого значения.

Две или три переменные содержат предложение SQL, которое будет использоваться для извлечения необходимых сведений о контактах. Переменная sSQL содержит основу предложения SQL:

sSQL = "SELECT * FROM Contact" 

Предложение SQL я строю динамически, сохраняя фильтр в переменной sWhere. При этом можно либо добавить оператор ORDER BY непосредственно в переменную sSQL, либо применить используемый по умолчанию оператор ORDER BY, который содержится в переменной sOrderBy. Первое предложение IF, относящееся к метке В, присваивает применяемое по умолчанию значение А переменной sLastNameSelect, если у sLastNameSelect отсутствует какое-либо значение. Второе предложение IF передает в оператор WHERE сведения о фильтре, применяемом при выборке, если только у переменной sLastNameSelect значение не равно All. В случае, когда значение переменной sLastNameSelect равно All, необходимость в использовании оператора WHERE отпадает, поскольку пустой оператор WHERE автоматически возвращает все записи. Последнее предложение, относящееся к метке В, присваивает значение оператору ORDER BY, который исполняется при первом посещении пользователем этой страницы.

Код, обозначенный в листинге 3 меткой С, содержит предложение SELECT. Это предложение формирует оператор ORDER BY, когда пользователь щелкнет по названию какого-либо столбца. Если же оператор WHERE уже сформирован, он появится в переменной sSQL в ходе выполнения предложения SELECT. Часть предложения SELECT, начинающаяся с Else, добавляет используемый по умолчанию оператор ORDER BY. Последнее предложение, относящееся к метке С, исполняет сформированное предложение SQL, пересылая его из страницы database.asp в функцию RunWithRS(). Эта функция воспринимает предложение SQL в качестве параметра, исполняет его и возвращает набор записей ADO.

Часть приведенного в листинге 3 кода, обозначенная меткой D, строит код HTML, который осуществляет интерфейс при фильтрации страницы по первой букве фамилии контакта. Этот интерфейс представляет собой набор опорных тэгов в одной ячейке таблицы HTML. Каждый тэг содержит строку отдельного запроса, устанавливающего значение переменной sLastNameSelect. Код, обозначенный в листинге 3 меткой Е, содержит заголовки таблицы HTML, предназначенной для показа данных о контактах. Заголовки столбцов представляют собой опорные тэги. Они присваивают переменной sSort значения, равные названию соответствующего столбца. Кроме того, они устанавливают переменную sLastNameSelect в состояние, отвечающее текущему статусу фильтра. Чтобы перейти в режим сортировки и сохранить текущий фильтр в результирующем запросе SQL, необходимо присвоить значения обеим переменным. Часть кода в листинге 3, обозначенная меткой F, просматривает в цикле набор записей (rsContacts), отбирает те, которые удовлетворяют критерию сортировки, и выводит результат на экран в виде HTML.

Быстро и без труда

Страница ASP являет собой пример высокопроизводительного приложения, которым легко пользоваться. И в то же время страницу ASP нетрудно создать. Прежде всего, на ней очень немного кода, обеспечивающего работу с базой данных. Это обусловлено тем, что данная страница инкапсулирует (содержит) код database.asp, обеспечивающий доступ к базе данных. Во-вторых, фильтрация данных по первой букве фамилии контакта гарантирует быстрый отклик приложения и позволяет упорядочить работу пользователей. В-третьих, программа сортировки очень понятна. Она просто формирует оператор ORDER BY предложения SQL. Помимо этого, можно перенести на другую страницу строки переключателя (опорные тэги). Тем самым другой странице можно передать эти же функциональные возможности. Поскольку URL-ссылки HTML содержатся в опорных тэгах, одним щелчком мыши можно получить доступ к фильтру для начальной страницы, которую видит пользователь. И, наконец, можно заставить приложение работать еще быстрее. Для этого следует преобразовать его в одну или несколько хранимых процедур. Это нетрудно сделать, поскольку имеется изолированный код SQL.

 
Автор: Кен Спенсер
 
Оригинал статьи: http://www.woweb.ru/publ/60-1-0-199