Пинягина о. В

Вид материалаДокументы

Содержание


Этап 5. Разработка сценариев поиска и просмотра данных
Сценарий поиска и просмотра читателя в АРМ библиотекаря
Header Template
Auto Format
1   ...   5   6   7   8   9   10   11   12   13

Этап 5. Разработка сценариев поиска и просмотра данных


В каждом АРМ так или иначе нужен режим поиска и просмотра данных в разных разрезах. Рассмотрим подробнее сценарии поиска и просмотра данных в АРМ библиотекаря.

Сценарий поиска и просмотра читателя в АРМ библиотекаря


Создадим сценарий для поиска читателя (SearchReader.aspx), использующий master-страницу для АРМ библиотекаря. Будем искать читателя по номеру его читательского билета или (если он, например, потерял свой читательский билет и забыл его номер) по номеру паспорта.





На странице разместим два текстовых поля (txt_searct_ID и txt_search_pasp) и две кнопки (searchId и searchPasp).

Для доступа к базе данных, как обычно, создадим источник данных типа SQLDataSource. В окне Properties назначим источнику данных в качестве строки соединения ConnectionString ссылку на нашу базу данных ASPNETDB.mdf. C помощью свойства SelectQuery в построителе запросов назначим строку запроса

SELECT readers.* FROM readers where passport=@id_reader

создадим параметр запроса @id_reader и свяжем его с текстовым полем txt_searct_ID.

Поместим на страницу объект DetailesView из группы Data вкладки Tools. Этот объект удобен для вывода подробной информации из одной записи таблицы базы данных. Настроить внешний вид этого объекта можно с помощью многочисленных свойств в окне Properties. Обязательно нужно назначить свойство DataSourceID, т.е., связать с источником данных. Для настройки отдельных полей записи используйте свойство Fields.

Стиль таблицы (цвет, шрифт и т.п.) можно быстро изменить через контекстное меню (правая кнопка мыши) – Auto Format.

Пункт Edit Templates в контекстном меню позволяет также редактировать шаблон верхнего и нижнего колонтитулов объекта ( Header Template и Footer Template), а также задать шаблон для пустой выборки (Empty Data Template) – добавим в этот шаблон строку «Читатель не найден!».

Получившийся объект в коде программы выглядит следующим образом:


AutoGenerateRows="False" CellPadding="4"

DataSourceID="SqlDataSource1" ForeColor="#333333"

GridLines="None" Height="50px" Width="528px">










HorizontalAlign="Center"/>




HeaderText="Номер билета"

InsertVisible="False" SortExpression="id_reader" />


SortExpression="fio_reader" />


SortExpression="passport" />


HeaderText="Дата рождения"

SortExpression="datebird" />


SortExpression="addr_reader" />


SortExpression="tel_reader" />


SortExpression="email_reader" />











Читатель не найден!






Наконец, нужно назначить обработчики на кнопки:

protected void searchPasp_Click(object sender, EventArgs e)

{

SqlDataSource1.SelectParameters.Clear();

SqlDataSource1.SelectParameters.Add("passport",

txt_search_pasp.Text);

SqlDataSource1.SelectCommand =

"SELECT readers.* FROM readers WHERE passport=@passport";

}


protected void searchID_Click(object sender, EventArgs e)

{

try

{

int id = Int32.Parse(txt_search_ID.Text);

SqlDataSource1.SelectParameters.Clear();

SqlDataSource1.SelectParameters.Add("id_reader",

txt_search_ID.Text);

SqlDataSource1.SelectCommand =

"SELECT readers.* FROM readers WHERE id_reader=@id_reader";

}

catch(Exception ex)

{

SqlDataSource1.SelectCommand =

"SELECT readers.* FROM readers WHERE 1!=1";

}

}


Как видите, в первом обработчике «Поиск по паспорту» мы очищаем список параметров, явно задаем параметр поиска @passport и текст команды Select для источника данных – все остальное будет сделано автоматически.

А при поиске по номеру билета возникает следующая проблема: номер билета представляет собой целое число (int), и если пользователь наберет в поле поиска нечисловые символы, то при выполнении Select возникнет исключение (к сожалению, это произойдет за пределами данной функции). Здесь предлагается следующее решение: мы пытаемся преобразовать значение из текстового поля к целому типу, и в случае успеха формируем обычный текст запроса Select. Если же возникло исключение, мы искусственно создаем такой Select, который содержит ложное условие, и выборка будет пустой.




Как только библиотекарь нашел какого-то читателя, он начинает работать с его карточкой. В этот момент создадим переменные сессии для имени и номера читателя. Для этого будем использовать объект Session.

Удобнее всего выполнить это действие в тот момент, когда объект DetailsView заполняется данными, а именно в обработчике события DataBound. (Здесь есть еще одна хитрость: скопируем номер читательского билета в поле txt_search_ID, чтобы при дальнейших действиях со страницей не потерять связь с источником данных, который по умолчанию имеет параметр, связанный с этим текстовым полем.)


protected void DetailsView1_DataBound(object sender, EventArgs e)

{

try

{

Session.Add("id_reader", DetailsView1.Rows[0].Cells[1].Text);

Session.Add("fio_reader", "Читатель: "

+DetailsView1.Rows[1].Cells[1].Text);

txt_search_ID.Text=Session["id_reader"].ToString();

}

catch (Exception ex)

{

Label1.Text = "Поиск читателя";

}

}


Обратите внимание, как извлекаются данные из DetailsView. Номер билета берем из нулевой строки, первого столбца, ФИО – из первой строки, первого столбца. Для удобства будем выводить ФИО найденного читателя сразу же после линейки меню. Для этого в мастер-страницу поместим строку:

<%=Session["fio_reader"]%>


Далее добавим в карточку читателя информацию о его заявках на книги, о взятых и возвращенных книгах.

Прежде всего, для удобства выборки информации из разных таблиц создадим три представления непосредственно в базе данных.

Представление vw_orders содержит информацию о еще не выполненных заявках (дата выдачи пустая). Выборка отсортирована в порядке убывания даты заявки.


SELECT dbo.books.ISBN, dbo.books.name_book, dbo.items.id_item,

dbo.orders.date_order, dbo.books.author,

dbo.orders.id_reader, dbo.items.status,

dbo.orders.id_order

FROM dbo.orders INNER JOIN dbo.items

ON dbo.orders.id_item = dbo.items.id_item

INNER JOIN dbo.books

ON dbo.items.ISBN = dbo.books.ISBN

WHERE (dbo.orders.date_get IS NULL)

ORDER BY dbo.orders.date_order DESC


Представление vw_given содержит информацию о книгах, которые находятся на руках у читателя: (дата выдачи непустая, дата возврата пустая). Выборка отсортирована в порядке убывания даты выдачи.

SELECT dbo.items.id_item, dbo.orders.id_reader,

dbo.books.name_book, dbo.books.author,

dbo.orders.date_get, dbo.books.ISBN, dbo.orders.id_order

FROM dbo.items INNER JOIN dbo.orders

ON dbo.items.id_item = dbo.orders.id_item

INNER JOIN dbo.books

ON dbo.items.ISBN = dbo.books.ISBN

WHERE (dbo.orders.date_return IS NULL)

AND (dbo.orders.date_get IS NOT NULL)

ORDER BY dbo.orders.date_get DESC


Представление vw_returned содержит информацию о книгах, которые возвращены читателем: (дата возврата непустая). Выборка отсортирована в порядке убывания даты выдачи.

SELECT dbo.books.ISBN, dbo.books.name_book, dbo.books.author,

dbo.items.id_item, dbo.orders.date_get,

dbo.orders.date_return, dbo.orders.id_reader,

dbo.orders.id_order

FROM dbo.books INNER JOIN dbo.items

ON dbo.books.ISBN = dbo.items.ISBN

INNER JOIN dbo.orders

ON dbo.items.id_item = dbo.orders.id_item

WHERE (dbo.orders.date_return IS NOT NULL)

ORDER BY dbo.orders.date_get DESC


На основе каждого из представлений создадим источник данных SQLDataSource. Нас интересуют книги конкретного читателя, поэтому в источнике данных при построении запроса в свойстве SelectQuery зададим параметр id_reader, который свяжем с элементом управления DetailsView1 и добавим соответствующее условие в запрос:

SELECT vw_given.* FROM vw_given WHERE (id_reader=@id_reader)


Кроме того, у элемента управления DetailsView1 нужно явно указать ключевые поля из источника данных: назначим свойство DataKeyNames=id_reader.

Теперь можно выводить информацию из источников данных на страницу. Для этого будем использовать элементы управления типа GridView, которые представляют данные в табличной форме. У этих элементов обязательно нужно назначить источник данных: свойство DataSourceID связать с соответствующим объектом типа SQLDataSource.

Для настройки отдельных столбцов таблицы используйте свойство Columns и соответствующий построитель. Здесь в визуальном режиме можно настроить список столбцов, задать их порядок, заголовки и прочие свойства.

Стиль таблицы (цвет, шрифт и т.п.) можно быстро изменить через контекстное меню (правая кнопка мыши) – Auto Format.

Наконец, для более компактного размещения информации будем выводить на экран только один из объектов GridView. Для этого у всех объектов GridView назначим по умолчанию свойство Visible=false. Затем в нижнем колонтитуле объекта DetailsView1 (в шаблоне Footer Template) поместим три кнопки: «Заявки», «Книги выданные», «Книги возвращенные». Обработчик соответствующей кнопки делает видимым одну из таблиц и делает невидимыми две остальные:


protected void Button1_Click(object sender, EventArgs e)

{

GridView1.Visible = true;

GridView2.Visible = false;

GridView3.Visible = false;

}