[Содержание_документа] [Конец_документа]

[Выше] [Начало_этой_части] [Конец_этой_части] [Далее]

===========================================

Глава 6 – Работа с объектами

Эта глава содержит следующие темы:

 Выполнение методов

 Создание новых объектов

 Модификация объектов

 Сохранение объектов

 Закрытие объектов

 Открытие объектов

 Удаление объектов

 Выполнение запросов

 Эта глава описывает, как создавать объекты и манипулировать ими. Объекты создаются и управляются с использованием ряда методов. В этой главе будут рассмотрены вопросы использования этих методов для создания, открытия, заполнения, сохранения, закрытия, удаления объектов или выполнения запросов, связанных с объектами.

Перед тем, как перейти к изложению вопросов, связанных с использованием объектов в приложениях, следует напомнить о принятых выше сокращениях: OREF – это ссылка на объект, хранящийся в памяти, OID – ссылка на объект, хранящийся на диске.

Выполнение методов

Создание объектов и манипуляция ими выполняется с использованием методов. Cache поддерживает два типа методов: методы объекта и методы класса.

Выполнение методов объекта

Некоторые методы после выполнения возвращают значение, в то время как другие не делают этого. Встречаются ситуации, когда в возвращенном методом значении приложение не нуждается. В таких случаях можно использовать синтаксис для методов, которые не возвращают значение.

Выполнение методов объекта без возврата значений

Чтобы выполнить метод объекта без возвращения значения, используется следующий синтаксис:

DO oref.MethodName(arglist)

где oref - OREF требуемого объекта

MethodName - Имя выполняемого метода

arglist - Список аргументов, передаваемых методу

Например, чтобы выполнить метод Swallow() объекта Patient, используется следующий код:

DO pat.Swallow()

где pat – OREF требуемого объекта.

Выполнение методов объекта с возвратом значений

Чтобы выполнить метод экземпляра с возвратом значения, используется следующий синтаксис:

SET value=oref.MethodName(arglist)

где value - Возвращаемое методом значение

oref - OREF требуемого объекта

MethodName - Имя выполняемого метода

Arglist - Список аргументов, передаваемых методу

Например, чтобы выполнить метод SearchMedicalHistory() объекта Patient используется следующий код:

SET result=pat.SearchMedicalHistory("Diabetes")

где pat – OREF требуемого объекта.

result – значение, возвращаемое методом SearchMedicalHistory().

Выполнение методов класса

Методы класса – методы, выполняемые независимо от любых объектов в памяти. Однако, они также могут быть вызваны из находящегося в памяти объекта класса, содержащего метод.

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

Выполнение методов класса без возврата значений

Чтобы вызвать метод класса без возврата значения, используют следующий синтаксис (если объект не находится в памяти):

DO ##class(Classname).MethodName(arglist)

где Classname - Имя класса с нужныи методом

MethodName - Имя выполняемого метода

arglist - Список аргументов, передаваемых методу

Например, можно выполнить метод PurgeAll() класса ReportCard, используя следующий код:

DO ##class(ReportCard).PurgeAll()

Если объект класса находится в памяти, чтобы выполнить метод класса без возврата значения, можно использовать следующий синтаксис:

DO oref.MethodName(arglist)

где oref - OREF требуемого объекта

MethodName - Имя выполняемого метода

arglist - Список аргументов, передаваемых методу

Например, можно выполнить метод PurgeAll() класса ReportCard, исплдьзуя следующий синтаксис:

DO rc.PurgeAll()

где rc – OREF объекта ReportCard.

Выполнение методов класса с возвратом значений

Чтобы выполнить метод класса с возвратом значения, используется следующий синтаксис (если образец класса не находится в памяти):

SET value=##class(Classname).MethodName(arglist)

где value - Возвращаемое значение

Classname - Имя класса с требуемым методом

MethodName - Имя выполняемого метода

arglist - Список аргументов, передаваемых методу

Например, можно выполнить метод FindAppointments() класса Doctor (который возвращает все сегодняшние визиты ко всем докторам), используя следующий код:

SET applist=##class(Office).FindAppointments()

где applist – возвращаямый список посещений.

Чтобы выполнить метод класса с возвратом значения, используется следующий синтаксис (если образец класса находится в памяти):

SET value=oref.MethodName(arglist)

где value - Возвращаемое значение

oref - OREF требуемого объекта

MethodName - Имя выполняемого метода

arglist - Список аргументов, передаваемых методу

Например, можно выполнить метод FindAppointments() класса Doctor, используя следующий код:

SET applist=doc.FindAppointments()

где applist – возвращаямый список посещений,

doc – OREF любого объекта Doctor.

Примечание: Даже при том, что doc – OREF определенного объекта Doctor, метод класса FindAppointments() все еще возвращает посещения для всех объектов Doctor.

Создание новых объектов

Общий синтаксис для создания новых объектов:

SET oref=##class(Classname).%New()

где oref - OREF требуемого объекта

Classname - Имя класса с требуемым методом

ClassName зависит от регистра.

Например, чтобы создать новый объект Person, можно использовать следующий код:

SET per=##class(Person).%New()

где per – OREF нового объекта Person.

Модификация объектов

Общий синтаксис для присвоения значения свойству объекта:

SET oref.PropertyName=data

где oref - OREF требуемого объекта

PropertyName - Имя свойства, которому нужно присвоить значение data

data - Фактические данные

Например, чтобы присвоить значение свойству Name объекта Person, можно использовать следующий код:

SET per.Name="Doe,Jane"

где per – OREF объекта Person,

Doe,Jane – значение свойства Name.

Общий синтаксис будет работать для любого атрибута типа данных. Атрибуты ссылки, атрибуты встраиваемого объекта, коллекции и потоки – каждый имеет собственный специальный синтаксис.

Модификация атрибутов-ссылок

Данные, сохраненные в атрибуте-ссылке, существуют как самостоятельный объект, который может быть независим от объекта, содержащего ссылку. Нужно проверить существование объекта, упоминаемого в атрибуте-ссылке. Если объект существует, можно дополнять или изменять упомянутый объект непосредственно или использовать каскадный объектный синтаксис.

Обращение к объекту через атрибут-ссылку

Имеются два способа обращения к объекту через атрибут-ссылку: можно использовать OREF, если объект находится в памяти, или – OID, если он существует на диске.

Если объект, на который делается ссылка в атрибуте-ссылке, находится в памяти, можно использовать следующий синтаксис:

SET oref.PropertyName=reforef

где oref - OREF объекта, содержащего атрибут-ссылку

PropertyName - Имя свойства объекта с oref, которое будет иметь ссылку на объект с reforef

Например, чтобы сделать объект Person доступным в объекте Car, используется следующий код:

SET car.Owner=per

где car – OREF объекта Car,

per – OREF объекта Person.

Если объект, на который делается ссылка в атрибуте-cсылке, не находится в памяти (т.е. находится на диске), можно использовать следующий синтаксис:

DO oref.PropertyName(refoid)

где oref - OREF объекта, содержащего Атрибут Ссылки

PropertyName- Имя свойства объекта с oref, которое будет иметь ссылку на объект с refoid

refoid - OID объекта, на который делается ссылка

Например, чтобы сделать специфический объект Person доступным в объекте Car, используется следующий код:

DO car.OwnerSetObject(peroid)

где car – OREF объекта Car,

peroid – OID объекта Person.

Модификация объектов и каскадный объектный синтаксис

Как только объект связан со ссылкой, свойства этого объекта могут дополняться или изменяться с помощью каскадного объектного синтаксиса следующим образом:

SET oref.PropertyName.RefPropertyName = data

где oref - OREF объекта

PropertyName - Имя свойства объекта с oref, с которым свчзаны данные data

RefPropertyName - Имя свойства в пределах упомянутого объекта, которое ссылается на данные свойства

data - Фактические данные

Например, чтобы установить свойство Name, как свойство Owner объекта Car, можно использовать следующий код:

SET car.Owner.Name="Doe,Jane"

где car – OREF объекта Car,

Doe,Jane – желательное значение.

Примечание: этот код приведет к ошибке, если объект не имеет свойства Owner.

Модификация атрибутов встраиваемых объектов

Имеются два способа задания атрибута встраиваемого объекта. Можно добавить новый экземпляр встраиваемого объекта и связать его с атрибутом встраиваемого объекта или можно непосредственно создавать и заполнять атрибут встраиваемого объекта, используя каскадный объектный синтаксис.

Объекты с атрибутом встраиваемого объекта

Можно добавить новый экземпляр встраиваемого объекта, заполнить его атрибуты как описано выше, затем присвоить его OREF свойству следующим образом:

SET oref.PropertyName=emboref

где oref - OREF определяемого объекта

PropertyName- Имя свойства встроенного объекта

emboref - OREF объекта, в который нужно встроиться

Например, чтобы создать новый объект Address и связать его со свойством Home объекта per, используется следующий код:

SET add=##class(Address).%New()

SET per.Home=add

где add – OREF нового объекта Adress,

per – OREF объекта per.

Модификация встраиваемых объектов и каскадный объектный синтаксис

Можно также устанавливать свойства встраиваемого объекта без непосредственной их вставки следующим образом:

SET oref.PropertyName.EmbPropertyName=data

где oref - OREF определяемого объекта

PropertyName - Имя свойства, определяющее встраиваемый объект

EmbPropertyName - Имя свойства встраиваемого объекта

data - Фактические данные

Например, заполнить свойство Home объекта Person можно так:

SET per.Home.Street="One Memorial Drive"

SET per.Home.City="Cambridge"

SET per.Home.State="MA"

SET per.Home.Zip=02142

где per – OREF объекта Person, а его домашний адрес – One Memorial Drive; Cambridge,MA 02142.

Примечание: В отличие от атрибутов-ссылок, атрибуты встраиваемого объекта не должны быть связаны с объектом перед использованием каскадного объектного синтаксиса для установки значения свойства. Этот код будет работать, даже если никакой объект не был связан с атрибутом встраиваемого объекта.

Модификация атрибутов-списков (List Attributes)

Имеются два типа атрибутов-списков: списки-типы данных и списки объектов. Списки объектов могут содержать встраиваемые или независимо хранимые объекты. Эти списки заполнены одинаково, но выполняется это различными способами.

Списки – это упорядоченные совокупности информации. Каждый элемент, сохраненный в списке, имеет порядковый номер поля в списке. Можно добавлять данные в конец списка, изменять или вставлять данные в поле с заданным порядковым номером.

Модификация списков-типов данных (Lists of DataType)

Можно добавить данные в конец списка, используя следующий синтаксис:

DO oref.PropertyName.Insert(data)

где oref - OREF определенного объекта

PropertyName- Имя свойства списка

data - Фактические данные

Например, можно добавить значение "yellow" в конец списка цветов, используя следующий код:

DO per.FavoriteColors.Insert("yellow")

где per – OREF объекта Person.

Можно изменить данные в поле n, используя синтаксис:

DO oref.PropertyName.SetAt(data,n)

где oref - OREF определенного объекта

PropertyName- Имя свойства списка

data - Фактические данные

n - Порядковый номер поля

Например, можно изменить цвета (красный, синий и зеленый) на красный, желтый ("yellow") и зеленый, используя следующий код:

DO per.FavoriteColors.SetAt("yellow",2)

где per – OREF объекта Person.

Можно вставить данные в поле n, используя следующий синтаксис:

DO oref.PropertyName.InsertAt(data,n)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

data – Фактические данные

n – Порядковый номер поля

Например, можно изменить цвета (красный, синий и зеленый) на красный, желтый ("yellow"), синий и зеленый, используя следующий код:

DO per.FavoriteColors.InsertAt("yellow",2)

где per – OREF объекта Person.

Примечание: Вставка нового элемента во второй слот – это перемещение данных, хранящихся в настоящее время во втором слоте, в третий слот, объекта, хранящегося в настоящее время в третьем слоте, в четвертый слот, и т.д.

Модификация списков встраиваемых объектов

Можно заполнить список объектов несколькими способами. Можно создать новый объект, заполнить его, затем добавить в конец списка, используя следующий синтаксис:

DO oref.PropertyName.Insert(itemoref)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

itemoref – OREF встраиваемого объекта

Например, можно добавить новую запись о прививке, сделанной объекту Patient, используя следующий код:

DO pat.Vaccination.Insert(vac)

где pat – OREF объекта Patient,

vac – OREF объекта Vaccination.

Можно создать новый объект, заполнить его, затем добавить в поле n, используя следующий синтаксис:

DO oref.PropertyName.SetAt(itemoref,n)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

itemoref – OREF встроенного объекта

n – Порядковый номер поля

Например, можно изменить вторую запись о прививке, сделанной объекту Patient, используя следующий код:

DO pat.Vaccination.SetAt(vac,2)

где pat – OREF объекта Patient,

vac – OREF нового объекта Vaccination для слота 2.

Можно создать новый объект, заполнить его, затем вставить в поле n, используя следующий синтаксис:

DO oref.PropertyName.Insert(itemoref,n)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

itemoref – OREF встроенного объекта

n – Порядковый номер поля

Например, можно добавить новую запись о прививке в третий список Vaccination объекта Patient, используя следующий код:

DO pat.Vaccination.InsertAt(vac,3)

где pat – OREF объекта Patient,

vac – OREF объекта Vaccination.

Примечание: Вставка нового элемента в третий слот – это перемещение данных, хранящихся в настоящее время в третьем слоте, в четвертый слот, объекта, хранящегося в настоящее время в четвертом слоте, в пятый слот, и т.д.

Изменение свойств хранимых объектов в списках

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

Можно заполнить список объектов несколькими способами. Можно добавить объект в конец списка, используя следующий синтаксис:

DO oref.PropertyName.InsertObject(itemoid)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

itemoid – OID объекта

Например, можно добавить новую собаку в список домашних животных, принадлежащих человеку, используя следующий код:

DO per.Pets.InsertObject(dogoid)

где per – OREF объекта Person (человек),

dogoid – OID объекта Dog (собака).

Можно заменить объект в поле n, используя следующий синтаксис:

DO oref.PropertyName.SetObjectAt(itemoid,n)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

itemoid – OID объекта

n – Порядковый номер поля

Например, можно заменить домашнее животное в третьем поле списка домашних животных, принадлежащих человеку, на новую собаку, используя следующий код:

DO per.Pets.SetObjectAt(dogoid,3)

где per – OREF объекта Person (человек),

dogoid – OID объекта Dog (собака).

Можно вставить объект в поле n, используя следующий синтаксис:

DO oref.PropertyName.InsertObjectAt(itemoid,n)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

itemoid – OID объекта

n – Порядковый номер поля

Например, можно добавить новую собаку в начало списка домашних животных, принадлежащих человеку, используя следующий код:

DO per.Pets.InsertObject(dogoid,1)

где per – OREF объекта Person (человек),

dogoid – OID объекта Dog (собака).

Примечание: Вставка нового объекта в первый слот – это перемещение объекта, хранящегося в настоящее время в первом слоте, во второй слот, объекта, хранящегося в настоящее время во втором слоте, в третий слот, и т.д.

Как только объект был связан с полем в списке, его свойства можно изменить, используя следующий синтаксис:

SET oref.PropertyName.GetAt(n).ListPropertyName=data

где oref – OREF объекта, содержащего список

PropertyName – Имя свойства списка

ListPropertyName – Изменяемое свойство

data – Фактические данные

n – Порядковый номер

Например, чтобы дать кличку второму домашнему животному человека, используется следующий код:

SET per.Pets.GetAt(2).Name="Blackie"

где per – OREF объекта Person (человек),

Blackie – кличка животного.

Модификация атрибутов массива (Array Attributes)

Имеются два типа атрибутов массива: массивы-типы_данных и массивы-объекты. Массивы-объекты могут содержать встраиваемые или хранимые объекты. Эти массивы заполнены одинаково, но выполняется это слегка различными способами.

В отличие от списков, массивы не упорядочиваются. Вместо этого они – наборы пар с ключевым значением. Данные связаны с определенным ключом. Не имеется никаких синтаксических различий между добавлением нового элемента и изменением данных, содержащихся в существующем элементе.

Модификация массивов-типов_данных (Arrays of Data Types)

Чтобы добавить элемент в массив-тип_данных, используется следующий синтаксис:

DO oref.PropertyName.SetAt(data,key)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

data – Фактические данные

key – Ключ, связанный с новым элементом

Например, чтобы добавить новый цвет к массиву цветов, к которым обращаются значения RGB в объекте Painting, используется следующий код:

DO paint.Colors.SetAt("red","255,0,0")

где paint – OREF объекта Painting,

255,0,0 – ключ, чтобы обратиться к красному ("red") значению.

Модификация массивов встраиваемых объектов

Чтобы добавить элемент к массиву встраиваемых объектов, следует создать новый объект, заполнить его, затем добавить объект к массиву, используя следующий синтаксис:

SET oref.PropertyName.SetAt(elmtoref,key)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

elmtoref – OREF нового элемента

key – Ключ, связанный с новым элементом

Например, чтобы добавить запись о дате прививки к масству Vaccination в объекте Patient, используется следующий код:

DO pat.Vaccination.SetAt(vac,"04/08/99")

где pat – OREF объекта Patient,

04/08/99 – ключ доступа к объекту Vaccination с OREF vac.

Модификация массивов хранимых объектов

Синтаксис, описанный для установки массивов встраиваемых объектов, также применяется к массивам независимо хранимых объектов, если объекты находятся в памяти. Кроме того, можно заполнять массивы независимо хранимых объектов объектами, которые не находятся в памяти. Чтобы добавить объект к массиву, используется следующий синтаксис:

DO oref.PropertyName.SetObjectAt(elmtoid,key)

где oref – OREF определенного объекта

PropertyName– Имя свойства списка

elmtoid OID нового элемента

key – Ключ, связанный с новым элементом

Например, чтобы добавить собаку к массиву домашних животных в объекте Person, к которой обращаются по ее кличке, используется следующий код:

DO per.Pets.SetObjectAt(dogoid,"Blackie")

где per – OREF объекта Person (Человек),

Blackie – используемый ключ доступа к собаке с OID dogoid.

Изменение свойств объектов в массивах

Как только объект добавлен к массиву, его свойства можно изменять, используя следующий синтаксис:

SET oref.PropertyName.GetAt(key).ArrayPropertyName = data

где oref – OREF определенного объекта

PropertyName – Имя свойства массива

key – Идентифицирует обновляемый объект

ArrayPropertyName – Обновляемое свойство

data – Фактические данные

Например, чтобы задать тип Прививки (Vaccination), сделанной пациенту 02/23/98, используется следующий код:

SET pat.Vaccination.GetAt("02/23/98").Type="Polio"

где pat – OREF объекта Patient, которому сделали прививку от Полиомиелита (Polio) 2/23/98.

Модификация потоков (STREAMS)

Чтобы выполнить модификацию потоков, используют следующий синтаксис:

DO oref.PropertyName.Write(data)

где oref – OREF объекта, содержащего поток

PropertyName– Имя свойства потока

data – Фактические данные

Например, чтобы добавить параграф к свойству Note (Примечания) объекта Visit, используется следующий код:

DO visit.Note.Write(note)

где visit – OREF объекта Visit,

note – данные, введенные доктором во время посещения.

Сохранение объектов

Любой независимо хранимый объект может быть сохранен, используя следующий синтаксис:

DO oref.%Save()

где oref – OREF сохраняемого объекта

Метод %Save() поочередно возвращает код состояния, который может быть исследован, чтобы определить результат операции сохранения:

SET sc=oref.%Save()

где sc – Код состояния, возвращаемый методом %Save()

oref – OREF сохраняемого объекта

Макрокоманда $$$ISOK возвращает 1, если сохранение прошло успешно, иначе – 0. Макрокоманда $$$ISERR поочередно возвращает 1, если сохранение не выполнено, иначе – 0.

Если сохранение закончилось неудачей, можно вызвать DisplayError^%apiOBJ() из библиотеки утилит объектов Cache (Cache Object Utility Library), чтобы посмотреть текст сообщения об ошибках.

Следующий синтаксис сохранит объект, представленный oref, и покажет любые сообщения об ошибках, если сохранение не выполнено:

SET sc=oref.%Save()

IF $$$ISERR(sc) DO $$DisplayError^%apiOBJ(sc)

Например, следующий код сохранит объект Person с OREF и отобразит любые ошибки, которые могут произойти во время сохранения:

SET sc=per.%Save()

IF $$$ISERR(sc) DO $$DisplayError^%apiOBJ(sc)

Закрытие объектов

Как только работа с объектом завершена, он должен быть явно закрыт. Закрытие объекта – это удаление его из памяти. Закрытие объекта не выполняет его сохранение: следует явно сохранить независимо хранимый объект перед его закрытием.

Чтобы закрыть объект, используют следующий синтаксис:

DO oref.%Close()

где oref – OREF закрываемого объекта

Чтобы сохранять информацию об ошибке, лучше использовать такой синтаксис вместо кода, приведенного выше:

SET sc=oref.%Close()

где sc – Код состояния, возвращаемый методом %Close()

oref – OREF закрываемого объекта

Открытие объектов

Любой независимо хранимый объект, который был сохранен, позже может быть открыт, используя следующий синтаксис:

SET oref=##class(Classname).%Open(OID)

где oref – OREF открываемого объекта

Classname – Имя класса объекта

OID – OID открываемого объекта

Classname зависим от регистра.

Например, чтобы открыть объект Person с OID peroid, используется следующий код:

SET per=##class(Person).%Open(peroid)

где per – новый OREF объекта Person.

Объект может быть идентифицирован по имени класса и ID:

SET oref=##class(Classname).%OpenId(ID)

где oref – OREF открываемого объекта

Classname – Имя класса объекта

ID – ID открываемого объекта

Classname зависим от регистра.

Например, чтобы открыть объект Person с ID 765, используется следующий код:

SET per=##class(Person).%OpenID(765)

где per – новый OREF объекта Person.

Удаление объектов

Можно удалить одиночный объект или целиком все объекты.

Удаление одного объекта

Чтобы удалить объект из базы данных, используется следующий синтаксис:

DO ##class(Classname).%Delete(oid)

где oref – OREF удаляемого объекта

oid – OID удаляемого объекта

Например, чтобы удалить объект Person с диска, используется следующий код:

DO ##class(Person).%Delete(oid)

где oid – OID удаляемого объекта Person.

Примечание: Удаление объекта на диске не приводит к его удалению из памяти. Если объект удаляется из памяти, то с диска удаляется последняя сохраненная версия объекта. Объект не разрушается, пока не закрыта без сохранения его версия в оперативной памяти.

Сохранение информации об ошибке

Чтобы сохранить информацию об ошибке, возможно, возникшей во время удаления, используется такой синтаксис:

SET sc ##class(Classname).%Delete(oid)

где sc – код статуса, возвращаемый методом%Delete()

ClassName – Имя удаляемого объекта

oid – OID удаляемого объекта

Удаление всех объектов класса

Можно также удалять все экземпляры класса и его подклассы, используя следующий синтаксис:

DO ##class(Classname).%DeleteExtent()

где ClassName– Имя корневого удаляемого класса

Например, удалить все объекты класса Person (включая все подклассы класса Person) можно так:

DO ##class(Person).%DeleteExtent()

Сохранение информации об ошибке

Чтобы сохранять информацию об ошибке, используется такой синтаксис:

SET sc ##class(Classname).%DeleteExtent()

где sc – код статуса, возвращаемый методом %DeleteExtent()

ClassName – Имя корневого удаляемого класса

Например, удалить все объекты класса Person (включая все подклассы класса Person) можно так:

SET sc=##class(Person).%DeleteExtent()

Выполнение запросов

В Cache имеются объекты %ResultSet для выполнения запросов и обработки результатов их выполнения.

Подготовка запросов для выполнения

Объект %ResultSet должен быть текущим для каждого запроса, что можно сделать, используя следующий синтаксис:

SET rset = ##class(%ResultSet).%New()

где rset – OREF нового объекта %ResultSet

Как только объект %ResultSet сделан текущим, он должен быть связан с определенным запросом в определенном классе, используя следующий синтаксис:

SET rset.ClassName = class

SET rset.QueryName = query

где rset – OREF объекта

class – Имя класса, содержащего запрос

query – Имя выполняемого запроса

Предостережение: ClassName и QueryName – свойства в %ResultSet, которые хранят имена класса и запроса. Нельзя изменять имя пользовательского класса или запроса для этих свойств.

Методы запроса метаданных (Metadata Query Method)

Как только запрос связан с объектом %ResultSet, доступны различные информационные методы. Эти методы дают информацию о числе полей, возвращенных запросом, об имени и заголовке каждого поля, о возврате (или невозврате) запросом ID, о числе передаваемых запросу аргументов и имени каждого аргумента. Имеются следующие методы запроса метаданных:

 ContainsId() возвращает 0, если запрос не возвращает ID, и – номер столбца ID, если ID возвращен запросом

 GetParamCount() возвращает число аргументов, ожидаемых запросом

 GetParamName(n) возвращает аргумент n запроса

 GetColumnCount() возвращает число столбцов, возвращенных запросом

 GetColumnName(n) возвращает имя столбца (поля) n

 GetColumnHeading(n) возвращает заголовок столбца (поля) n

Выполнение запросов

Для выполнения запроса используется следующий синтаксис:

DO rset.Execute(arglist)

где rset – OREF объекта %ResultSet

arglist – Список перечисляемых через запятую аргументов запроса.

Обработка результатов запроса

Чтобы обратиться к первой строке данных, используется следующий синтаксис:

DO rset.Next()

где rset – OREF объекта %ResultSet

Метод Next() возвратит 0, если результирующий набор не содержит никакие данные.

Например, следующая строка программы проверяет наличие данных в наборе результатов запроса и, если набор результатов не имеет данных, выполняется выход из метода:

IF rset.Next() QUIT

К данным, сохраненным в строке, можно обращаться, определяя номер столбца, используя следующий синтаксис:

SET data = rset.GetData(n)

где data Содержит данные, сохраненные в столбце n

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

SET data = rset.GetDataByName(fieldname)

где data – Содержит данные, сохраненые в поле с именем fieldname

Как только в первой строке были найдены все нужные данные, можно выполнить метод Next(), чтобы перейти на следующую строку данных. Можно пропустить строку, используя метод GetData(), или отыскать нужные данные с помощью метода GetDataByName().

Закрытие запросов

Как только все строки были обработаны, нужно закрыть набор результатов, используя следующий синтаксис:

DO rset.Close()

или использовать синтаксис, поддерживающий информацию об ошибке:

SET sc = rset.Close()

Как только набор результатов закрыт, изменив значение параметров ClassName и QueryName, можно использовать объект %ResultSet для выполнения и обработки других запросов.

Когда завершена обработка всех запросов, нужно закрыть объект набора результатов с помощью метода %Close(), как описано в разделе "Закрытие объектов".

Пример обработки запроса

Следующий метод иллюстрирует, как выполнить запрос и обработать результаты:

METHOD PrintPeopleNamedSmith()

{

RETURNTYPE = %Status;

DESCRIPTION = "Печатает данные для людей по имени Смит";

CODE =

{

NEW i,j,rset,sc,columns

SET rset=##class(%ResultSet).%New()

SET rset.ClassName = Person

SET rset.QueryName = ByName

SET columns = rset.GetColumnCount()

DO rset.Execute("Смит")

FOR i=1:1 DO

. QUIT:’rset.Next()

. FOR j=1:1:columns DO

. . WRITE rset.GetData(j) WRITE " "

. WRITE !

SET sc = rset.%Close()

IF $$$ISERR(sc) DO DisplayError^%apiOBJ(sc)

QUIT sc

}

}

===========================================

[Содержание_документа] [Конец_документа]

[Выше] [Начало_этой_части] [Конец_этой_части] [Далее]

===========================================

По вопросам поддержки любых продуктов InterSystems Corporation обращайтесь:

Россия 121019, Москва, Волхонка, 6, #14

Тел.: +7 095 203-4649

Факс: +7 095 956-8268

info@intsys.dol.ru

http://www.intersystems.ru

 

Copyright © 1999, InterSystems Corporation. Все права защищены.