[
Выше] [Начало_этой_части] [Конец_этой_части] [Далее]===========================================
Глава 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)
где C
lassname - Имя класса с нужныи методом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
- Имя свойства, которому нужно присвоить значение datadata
- Фактические данныеНапример, чтобы присвоить значение свойству 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, которое будет иметь ссылку на объект с refoidrefoid
- OID объекта, на который делается ссылкаНапример, чтобы сделать специфический объект Person доступным в объекте Car, используется следующий код:
DO car.OwnerSetObject(peroid)
где
car – OREF объекта Car,peroid
– OID объекта Person.Модификация объектов и каскадный объектный синтаксис
Как только объект связан со ссылкой, свойства этого объекта могут дополняться или изменяться с помощью каскадного объектного синтаксиса следующим образом:
SET oref.PropertyName.RefPropertyName = data
где
oref - OREF объектаPropertyName
- Имя свойства объекта с oref, с которым свчзаны данные dataRefPropertyName -
Имя свойства в пределах упомянутого объекта, которое ссылается на данные свойства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,v
ac – 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.Чтобы выполнить модификацию потоков, используют следующий синтаксис:
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 7
65, используется следующий код: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 объекта %ResultSetarglist
– Список перечисляемых через запятую аргументов запроса.Чтобы обратиться к первой строке данных, используется следующий синтаксис:
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(), или отыскать нужные данные с помощью метода GetDataByN
ame().Как только все строки были обработаны, нужно закрыть набор результатов, используя следующий синтаксис:
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. Все права защищены.