Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Форматы данных и методы преобразования классов типов данных





Оперируя с константами, Caché распознает различные форматы данных.

В табл. содержится их обзор

 

 

Метод Назначение
DisplayToLogical() Преобразует отображаемые значения во внутренний формат
LogicalToDisplay() Преобразует значение из внутреннего формата в формат отображения
LogicalToODBC() Преобразует значение из внутреннего формата в формат ODBC(опциональный метод)
ODBCToLogical() Преобразует значение из формата ODBC во внутренний формат(опциональный метод)
LogicaToStorage() Преобразует значение из внутреннего формата в формат базы данных (опциональный метод)
StorageToLogical() Преобразует значение из формата базы данных во внутренний формат (опциональный метод)

 

Пример 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.

 







ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между...

Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор...

Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...

ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.