|
Форматы данных и методы преобразования классов типов данных ⇐ ПредыдущаяСтр 2 из 2 Оперируя с константами, Caché распознает различные форматы данных. В табл. содержится их обзор
Пример 1. Работа с хранимыми классами Создать два хранимых класса: 1. Класс «Категории» (Category), содержит информацию о категориях, к которым могут относиться конкретные книги. Единственное свойство класса: CategoryName –название категории. 2. Класс «Книги» (Books) – содержит информацию о книгах. Где Title – название книги, Authors – список авторов, CountPage – количество страниц, Category – категория, ссылка на хранимый класс «Категории», Decsription – описание книги. Задание: написать COS-программу, позволяющую в цикле вводить объекты класса Category и для каждого объекта Category вводить несколько объектов класса Books. Обеспечить выход из цикла. Решение: Определения классов: Class User.Category Extends %Persistent [ ClassType = persistent, ProcedureBlock] { Property CategoryName As %String; } Class User.Books Extends %Persistent [ ClassType = persistent, ProcedureBlock ] { Property Authors As %String [ Collection = list ]; Property Title As %String; Property Category As User.Category; Property Cena As %Numeric; Property CountPage As %Integer; Property Decsription As %String(MAXLEN = 100); } Программа: for { read!, "Введите название категории:", cat Quit:cat="" set ct=##class(User.Category).%New() set ct.CategoryName =cat set xx=ct.%Save() for { read!, "Введите название книги ", title Quit:title="" set bk=##class(User.Books).%New() set bk.Title = title read!, "Введите автора: ",Author do bk.Authors.Insert(Author) set bk.Category =ct read!, "Введите описание: ",desc set bk.Decsription =desc read!, "Введите кол-во страниц: ",kol set bk.CountPage =kol read!, "Введите цену: ",price set bk.Cena =price set xx=bk.%Save() } } Константы В простейшем случае, свойство может быть типа% Integer,% Date,% String или любого другого базового для Caché типа, а также заданного программистом класса типа данных. Поведение этих констант управляется классом типа данных, связанным со свойством. Ссылки на объекты В Caché каждый класс можно рассматривать как тип данных. Если при определении свойства вместо класса типа данных указать сохранен класс, тем самым будет создано ссылки на сохраненный объект. В этом случае, значениями свойства будут ссылки на экземпляры этого класса. Например, так можно определить свойство Manufacturer, что является ссылкой на сохраненный класс объектов User.Manufacturer: Property Manufacturer As User.Manufacturer; Например, так можно определить свойство Doc, являющееся ссылкой на хранимый объект типа Doctor: Property Doc As Doctor; Встроенные объекты Встроенные объекты функционируют аналогично ссылкой на объекты. Существенное отличие заключается в том, что тип данных задается не как сохранен, а как класс, встраиваемый. Итак, значением этого свойства является не ссылка на некий самостоятельный экземпляр объекта, а, наоборот, сам этот объект встраивается в объект, на который ссылается. С точки зрения синтаксиса определения идентично ссылке на класс объектов: Property Manufacturer As User.Manufacturer; Пример 3. Работа со встроенными классами Создать хранимый класс Person (данные о человеке) со свойствами: Fio – фамилия, имя, отчество человека Adres – его адрес, это ссылка на встроенный класс Address DataR – дата рождения. Встроенный класс Address имеет следующие свойства: Ind – индекс City – город Street – улица House – дом Flat – квартира. Задание: написать COS-программу, позволяющую вводить объекты класса Person и объек- ты встроенного класса Address и выводить результаты на печать. Решение: Определение класса Person имеет вид: Class User.Person Extends %Persistent [ ClassType = persistent, ProcedureBlock ] { Property Adres As Address; Property DataR As %Date; Property Fio As %String; } Определение класса Address имеет вид: Class User.Address Extends %SerialObject [ ClassType = serial, ProcedureBlock ] { Property Flat As %Integer; Property House As %String(MAXLEN = 5); Property Street As %String; Property City As %String(MAXLEN = 15); Property Ind As %String(MAXLEN = 6); } Программа позволяет создать объект класса Person, заполнить значения его свойств и вывести его на печать. Обратите внимание: не требуется создание экземпляра встроенного класса Address. Объекты класса Person хорошо видны в SQL-менеджере. // ввод объекта класса Person for { read!,"Введите ФИО ",fio Quit:fio="" set pr=##class(Person).%New() // ввод данных Person set pr.Fio=fio read!,"Введите дату рождения ",dataR set pr.DataR=$ZdateH(dataR) write!,"Введите адрес: " read!,"Индекс ",ind set pr.Adres.Ind=ind read!,"Город ",city set pr.Adres.City=city read!,"Улицу ",street set pr.Adres.Street=street read!,"Номер дома ",house set pr.Adres.House=house read!,"Номер квартиры ",flat set pr.Adres.Flat=flat set yy=pr.%Save() } // распечатать объекты класса Person Pech Set r=##class(%ResultSet).%New(”%DynamicQuery:SQL”) Do r.Prepare("Select ID from Person") Do r.Execute() While(r.Next()) { write! write?5,"ID ",r.Get("ID") set id=r.Get("ID") set bk=##class(User.Person).%OpenId(id) write!,"FIO ","DataR ","Ind ", "City ","Street ","House ","Flat " write! set k=1 write bk.Fio set k=k+10 write?k,$ZDate(bk.DataR) set k=k+10 write?k,bk.Adres.Ind set k=k+10 write?k,bk.Adres.City set k=k+10 write?k,bk.Adres.Street set k=k+10 write?k,bk.Adres.House set k=k+10 write?k,bk.Adres.Flat } Представление встроенных объектов Для сохранения встроенных объектов сначала используется механизм сериализации, и только потом сериализованный объект хранится в том же виде, что и любое другое свойство. Например, пусть имеем класс сериализованный MyApp.MyAddress и связанный с ним класс MyApp.MyClass.Class MyApp.MyAddress Extends %SerialObject [ClassType = serial] { Property City As %String; Property State As %String; }
Class MyApp.MyClass Extends %Persistent [ClassType = persistent] { Property Name As %String; Property Age As %Integer; Property Home As MyAddress; }
Если мы создадим и сохраним несколько экземпляров классов MyApp.MyAddress и MyApp.MyClass, то результирующий глобал будет подобен следующему: ^MyApp.MyClassD = 2 // counter node ^MyApp.MyClassD(1) = $LB(530,"Abraham",$LB("UR","Mesopotamia")) ^MyApp.MyClassD(2) = $LB(680,"Philip",$LB("Bethsaida","Israel"))
Потоки данных Потоком данных (Binary Large Object BLOB) называют большую неструктурированную множество данных, которые необходимо хранить в БД. Например, потоки данных могут применяться для хранения документов, технических чертежей или рисунков. Поскольку они могут быть очень большие, Caché не оперирует потоками данных, как атомарной информации, а предоставляет прикладным программам методы блочного записи и считывания данных. В соответствии с содержанием различают потоки данных типа CHARACTERSTREAM (что складаеьбся из символов) и BINARYSTREAM (что складаеьбся с двоичных данных). Для манипулирования потоками используются методы класса %STREAM. В зависимости от того, как определена соответствующая свойство, потоки данных автоматически сохраняются в базе данных Caché или в файлах операционной системы. Это достигается присвоением параметру STORAGE значения GLOBAL или FILE. При этом поток данных всегда представляет собой константу, а не какой-нибудь самостоятельный объект. Например: Class MyApp.JournalEntry Extends %Persistent [ClassType = persistent] { Property ItemDate As %Date; Property PictureOfTheDay As %Stream [ Collection = binarystream ]; Property EventsOfTheDay As %Stream [ Collection = characterstream ]; } Класс MyApp.JournalEntry имеет два свойства типа потока: PictureOfTheDay – двоичный поток, EventsOfTheDay – символьный поток. В зависимости от того, как определено соответствующее свойство, потоки данных автоматически сохраняются в базе данных Caché либо файлах операционной системы. Это различие достигается путем присвоения параметру STORAGE значения GLOBAL, либо FILE. Следующий параметр LOCATION применяется, когда требуется задать имя глобала либо имя каталога файловой системы, в котором должен храниться поток данных. При этом поток данных всегда представляет собой поток данных, а не какой-либо самостоятельный объект. Например: Property GMemo As %Stream (STORAGE="GLOBAL", LOCATION="^MyStream") [collection = binarystream]; Property FMemo As %Stream (STORAGE="FILE", LOCATION="C:\Stream") [collection = binarystream]; В примере значения свойства GMemo будут сохранено в глобале ^MyStream, в то время как значения свойства FMemo будут сохраняться в файле с автоматически генерируемым именем в директории C:\Stream. По умолчанию потоки типа GLOBAL сохраняются в глобале ^PackageClassS. Файловые потоки по умолчанию сохраняются в текущей директории. Потоки Для заполнения потока, используется следующий синтаксис: Do oref.PropertyName.Write(data) где oref - ссылка на объект, PropertyName – имя свойства, Data – данные, которые нужно записать в свойство.
Коллекции Свойства, систем множество значений, могут быть представлены в Caché в виде коллекций. Будем различать два вида коллекций: - Коллекции массивы (Array ollections), элементы сортируются с помощью ключа; - Коллекции - упорядоченные списки (List Collections). Коллекция-список представляет собой упорядоченный список элементов, в котором каждый элемент определяется номером своей позиции. Коллекции могут содержать константы, встроенные объекты и ссылки на объекты. Основы cвoего поведения коллекции наследуют от специальных системных классов, зависят от типа коллекции и типа ее содержимого. Коллекции-массивы В отличие от коллекции-список коллекция-массив неупорядоченный и содержит пары ключ-значение. Нет никакой разницы в синтаксисе добавление нового ключа или изменении данных в существующем. Для добавления нового элемента используется следующая запись: Do oref.PropertyName.SetAt(data,key) где oref - ссылка на объект, PropertyName – имя свойства-ссылки, data – данные, key - ключ. Аналогично заполняется массив встроенных и сохраненных объектов. В первом случае, вместо значений самих данных передается ссылка на объект, а во втором – объектный идентификатор. Для модификации свойства объекта, что содержится в массиве используется следующий синтаксис: Set oref.PropertyName.GetAt(key).ArrayPropertyName = data где oref - ссылка на объект, PropertyName – имя свойства-ссылки, ArrayPropertyName - имя свойства n –го объекта, data – данные, которые необходимо добавить в список, key - ключ. Коллекции-списки Для добавления нового элемента в конец списка используется следующий синтаксис: Do oref.PropertyName.Insert(data) где oref - ссылка на объект, PropertyName – имя свойства-ссылки, data – данные, которые необходимо добавить в список. Для модификации данных в конкретной позиции списка: Do oref.PropertyName.SetAt(data,n) где oref - ссылка на объект, PropertyName – имя свойства-ссылки, data – данные, которые необходимо добавить в список, n – позиция с начала списка, начиная с 1. Для вставки нового значения в конкретную позицию списка: Do oref.PropertyName.InsertAt(data,n) где oref - ссылка на объект, PropertyName – имя свойства-ссылки, data – данные, которые необходимо добавить в список, n – позиция с начала списка, начиная с 1. Аналогично заполняется список встроенных и сохраненных объектов. В первом случае, вместо значения самого свойства передается ссылка на объект, а во втором – объектный идентификатор. Для модификации свойства объекта, что является членом списка используется следующий синтаксис: Set oref.PropertyName.GetAt(n).ListPropertyName = data где oref - ссылка на объект, PropertyName – имя свойства-ссылки, ListPropertyName - имя свойства n –го объекта, data – данные, которые необходимо добавить в список, n – позиция с начала списка, начиная с 1.
Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|