nsutextbook (1037554), страница 24
Текст из файла (страница 24)
Определение класса:Class User.Category Extends %Persistent [ ClassType = persistent, ProcedureBlock ]112{Property CategoryName As %String;Index InxCat On CategoryName As Exact [ Data = CategoryName ];Method AltCateg(categoryname As %String) As %Status{ // метод экземпляра: изменить название категорииSet ..CategoryName=categorynameQuit ..%Save()}}Решение:Создадим три csp-страницы:1. BookBrowse.csp – для просмотра всех объектов.2.
AddBooks1.csp – для добавления нового объекта3. AlterDel1.csp – для изменения и удаления существующего объектаСо страницы BookBrowse.csp по гиперссылке «Добавить книгу» вызывается страница AddBooks1.csp, которая является формой ввода новых объектов для класса «Книги».
Вполе ID страницы BookBrowse.csp по гиперссылке вызывается страница AlterDel1.csp, которая обеспечивает изменение удаление выбранного объекта.На страницах AddBooks1.csp и AlterDel1.csp находятся кнопки типа submit, по которым страница закрывается, и значения полей редактирования передаются форме BookBrowse.csp, определенной в параметре Action оператора Form. Страница BookBrowse.cspкаждый раз обновляется.
В начале страницы BookBrowse.csp располагается программныйкод Cache, который выполняет добавление, изменение или удаление объекта.BookBrowse.csp – форма просмотра.Внешний вид формы приведен на рис. 15.113Рисунок 15. BookBrowse.cspПрограммный код страницы BookBrowse.csp:<HTML><HEAD><TITLE>Пример разработки формы просмотра </TITLE></HEAD><BODY><script language="Cache" runat="server">if %request.Get("add")'=""{ // добавить объектdo ##class(Books).AddBook(%request.Get("title"),%request.Get("author"),%request.Get("count"),"",%request.Get("categ"),%request.Get("cena"))}if %request.Get("alter")'=""{ // изменить объектset book=##class(Books).%OpenId(%request.Get("id"))dobook.AlterBook(%request.Get("title"),%request.Get("author"),%request.Get("count"),"",%request.Get("categ"),%request.Get("cena"))}if %request.Get("del")'=""{ // удалить объектSet sc=##class(Books).%DeleteId(%request.Get("id"))}</script><script language=SQL name="query">SELECT ID,Category->CategoryName,CountPage,Decsription,Title,Authors114FROM Books ORDER BY Category->CategoryName</script><a href="AddBooks1.csp">Добавить книгу</a><table border=1 bgcolor=""><tr><td> <b>ID</b></td><td><b> Название</b> </td><td><b> Автор</b> </td><td> <b>Жанр</b></td><td><b>Кол-во страниц</b></td></tr><tr><csp:while condition=query.Next()><td><a href=AlterDel1.csp?ID=#(query.Get("ID"))#>#(query.Get("ID"))# </a></td><td>#(query.Get("Title"))#</td><td>#(query.Get("Authors"))#</td><td>#(query.Get("CategoryName"))#</td><td>#(query.Get("CountPage"))#</td></tr></csp:while></table></BODY></HTML>AddBooks1.csp – добавление нового объектаВнешний вид страницы AddBooks1.csp приведен на рис.
16.115Рисунок 16. Страница AddBooks1.cspПрограммный код страницы AddBooks1.csp:<HTML><HEAD><TITLE>Добавить книгу </TITLE></HEAD><BODY><script language=SQL name="Cat">Select * from Category</script>Добавить книгу<form name="add" action="BookBrowse.csp">Название: <input type="text" name="title" value=""> <br>Автор: <input type="text" name="author" value=""><br>Категория:<select name="categ" size="1"><csp:while condition=Cat.Next()><option value='#(Cat.Get("ID"))#'>#(Cat.Get("CategoryName"))#</csp:while></select><br>Кол-во страниц: <input type="text" name="count" value=""><br><input type="submit" name="add" value="Сохранить"> <br></form></BODY></HTML>AlterDel1.csp – форма изменения и удаления существующего объектаВнешний вид страницы AlterDel1.csp приведен на рис. 17.Рисунок 17.
Страница AlterDel1.csp116Программный код страницы AlterDel1.csp:<HTML><HEAD><!-- Изменение и удаление книги --><TITLE>Изменение и удаление книги </TITLE></HEAD><BODY><script language=SQL name="Cat">Select * from Category</script><csp:object classname="Books" name="book"objid=#(%request.Get("ID"))#><form name="add" Action="BookBrowse.csp">Изменение и удаление книги #(%request.Get("ID"))# <br>ID:<input type="text" name="id" value="#(%request.Get("ID"))#"> <br>Название: <input type="text" name="title" value="#(book.Title)#"> <br>Автор:<input type="text" name="author" value="#(book.Authors.GetAt(1))#"><br>Категория:<select name="categ" size="1"><csp:while condition=Cat.Next()><option value='#(Cat.Get("ID"))#'><csp:if condition='book.CategoryGetObjectId()=Cat.Get("ID")'><option selected></csp:if>#(Cat.Get("CategoryName"))#</csp:while></select><br>Кол-во страниц: <input type="text" name="count" value="#(book.CountPage)#"><br><input type="submit" name="alter" value="Изменить"><input type="submit" name="del" value="Удалить"></form></BODY></HTML>Решение с использованием серверного метода на событие OnClick:onclick = "#server (..Method(…)предлагается выполнить самостоятельно.8.8.
Пример организации поиска экземпляра класса с использованием индексного глобалаПусть имеем класс Abonent со свойствами Fio – фамилия абонента, Login – его логическое имя, Password – пароль. Требуется создать интерфейс для поиска нужного экземпляра класса Abonent по значениям его свойств Login и Password.Такую задачу можно решить с использованием параметрического Select-запроса языка SQL, что и предлагается читателю сделать самостоятельно в качестве полезного упражнения.117Мы же будем использовать для организации поиска индексный глобаль.
Для этогосоздадим в классе Abonent индекс для свойства Login:Index LoginIndex On Login As Exact;Для непосредственного поиска требуется создать метод класса Abonent, назовем его,скажем, CheckPassw, который по заданным значениям Login и Password осуществляет поиск экземпляра в классе. В случае удачного поиска метод возвращает id найденного экземпляра, и 0(ноль) в случае, если экземпляр не найден. Для поиска по индексу используется функция $Order (см. главу 7, п.7.6.3). Структура хранения стандартных индексов ввиде глобалей приведена в п.7.7.4 главы 7. Код метода приведен ниже:ClassMethod CheckPassw(log As %String, passw As %String) As %Status{ set id=$Order(^User.AbonentI("LoginIndex",log,-1))if id="" quit 0Set obj=##class(User.Abonent).%OpenId(id)if obj.Password=passw quit idquit 0}Создадим также две csp-страницы.
Первая – это форма ввода значений Login и Password. Назовем ее VvodParol.csp. Внешний вид формы VvodParol.csp приведен на рис.18.Рисунок 18По кнопке «Ввод», которая является кнопкой типа submit, вызывается вторая страница, с именем CheckParol.csp, которая используется для обработки того, что введено в форму VvodParol.csp. Внешний вид страницы CheckParol.csp приведен на рис. 19.118Рисунок 19Каждый раз при загрузке страницы CheckParol.csp работает Cache-код, который выполняет поиск нужного экземпляра и информирует пользователя о результатах поиска.Код страницы VvodParol.csp приведен ниже:<HTML><HEAD><TITLE>Cache Server Page </TITLE></HEAD><BODY><form name="parol" action="CheckParol.csp">Введите <br>Логин:<INPUT TYPE="text" NAME="login" SIZE="10"><br>Пароль:<INPUT TYPE="password" NAME="passw" SIZE="10"><br><INPUT TYPE="submit" NAME="vvodpar" VALUE="Ввод"></form></BODY></HTML>Код страницы CheckParol.csp имеет вид:<TITLE> Cache Server Page </TITLE></HEAD><BODY>Проверка пароля <br><script language=Cache runat=server>set obj=##class(User.Abonent).CheckPassw(%request.Get("login"),%request.Get("passw"))</script><csp:if condition="obj'=0">пароль верен<csp:else>пароль не верен</csp:if></BODY></HTML>119Список литературы1.
Документация по СУБД Caché 5.0.2. СУБД Caché, объектно-ориентированная разработка приложений, Кирстен В.,Ирингер М., Рёриг В., Шульте П., С-Пб, 20013. Технологический справочник по СУБД Caché 5.0.4. Постреляционная технология Caché для реализации объектных приложений, Кречетов Н.Е., Петухов Е.А., Скворцов В.И., Умников А.В., Щукин Б.А., МИФИ, 20015. «Внутренний мир объектно-ориентированных СУБД», А. Андреев, Д. Березкин, Р.Самарев, Открытые системы, 20016.
«Постреляционная СУБД Caché», Сиротюк О. В.120.