nsutextbook (1037554), страница 16
Текст из файла (страница 16)
Работа со свойствами-массивамиМассив это неупорядоченный набор информации (в противоположность спискам,которые упорядочены). Массив содержит одну или несколько именованных пар, в которых имя элемента служит ключом, и значение элемента связано с этим ключом. Нет никакой синтаксической разницы между добавлением нового элемента и изменением существующего элемента массива.Существует два типа свойств-массивов:• Массивы типов данных• Массивы объектов.Массив объектов может содержать как встроенные объекты, так и хранимые.6.8.1.
Работа с массивами типов данныхДобавить элемент к массиву типов данных:Do oref.PropertyName.SetAt(data,key)где oref ссылка OREF на объект, PropertyName имя свойства-массива, data это данные, key это ключ, связанный с новым элементом.Например, чтобы добавить новый цвет в массив Colors значений объекта Palette:Do paint.Colors.SetAt("255,0,0","красный")Где paint ссылка OREF на объект класса Palette, Colors это имя свойства-массива, и“красный” это ключ, позволяющий получить доступ к значению “255,0,0”.6.8.2. Работа с массивами встроенных объектовЧтобы добавить элемент к массиву встроенных объектов, создается новый объект,заполняется данными, затем используется следующий синтаксис для добавления объектак массиву:Do oref.PropertyName.SetAt(ElementOref,key)где oref – ссылка OREF на объект, PropertyName это имя свойства массива,ElementOref это OREF нового элемента, и key это ключ, связанный с новым элементом.Например, для добавления записи о вакцинации получаем доступ по дате к массивуVaccination объекта Patient:Do pat.Vaccination.SetAt(vac,"04/08/99")где pat – ссылка OREF на объект Patient, Vaccination – свойство типа массив встроенных объектов, “04/08/99” это ключ, связанный с новым объектом, vac – это OREF ссылка на добавляемый объект.696.8.3.
Работа с массивами хранимых объектовСинтаксис, описанный для наполнения массивов встроенных объектов, также применим к массивам хранимых объектов, если объекты уже находятся в памяти. К тому же,можно наполнять массивы хранимых объектов объектами, которые не находятся в памяти.Используется следующий синтаксис для добавления объекта к массиву:Do oref.PropertyName.SetObjectAt(ElementOid,key)где oref – ссылка OREF на объект, PropertyName – имя свойства массив, ElementOidэто OID нового элемента, key – ключ, связанный с новым элементом. Например, для добавления информации о собаке к массиву, используем в качестве ключа имя собаки:Do per.Pets.SetObjectAt(DogOid,"Джек")Где per – ссылка OREF на объект Person, Pets – свойство типа массив хранимых объектов, “Джек” это ключ, используемый для доступа к собаке с OID, равным DogOid.6.8.4.
Изменение свойств объектов в массивахКак только объект добавлен к массиву, можно изменить его свойства:Set oref.PropertyName.GetAt(key).ArrayPropertyName = dataгде oref – ссылка OREF на объект, содержащий массив, PropertyName это имя свойства массив, key идентифицирует реальные данные, ассоциированные со свойством. Например, чтобы установить тип вакцинации Vaccination, полученной пациентом на дату02/23/98:Set pat.Vaccination.GetAt("02/23/98").Type = "Polio"где pat – ссылка OREF на объект Patient, метод GetAt позволяет получить доступ поключу 2/23/98 к нужному объекту, и изменить его свойство Type на новое значение«Polio».6.9.
Обзор методов для работы с коллекциямиКроме вышеупомянутых методов для работы с коллекциями List и Array могут использоваться методы, приведенные в табл.12.Таблица 12Методы коллекцийМетодПоясненияList ArrayClear()Удаляет все элементы коллекцииДаДаCount()Возвращает количество элементов в коллек- ДаДацииDefine(key)Проверяет наличие элемента с ключом keyНет ДаДаFind(element,key)Осуществляет поиск заданного элемента кол- Далекции, начиная с позиции ключа(key). Возвращает позицию (ключ) найденного элемента, либо «», если он не найденGetAt(key)Возвращает значение элемента в позиции с ДаДаключом key.Возвращает значение элемента, следующего ДаДаGetNext(. key)после позиции ключа key, и обновляет key.Возвращает значение элемента, следующего ДаДаGetPrevious(. key)перед позицией ключа key, и обновляет key.Insert(element)Добавляет элемент в конец спискаДаНетInsertAtВставляет элемент в заданную позицию спи- ДаНет70(element,key)InsertOrdered(element)Next(key)Previous(key)RemoveAt(key)SetAt(element, key)ска.
Все последующие элементы сдвигаютсяна одну позицию.Вставляет элемент в позицию списка, соответствующую его значению в последовательности сортировки. Допустим только длясписков со значениями константами (но необъектными ссылками и не встроеннымиобъектами)Возвращает следующую позицию (ключ) после keyВозвращает следующую позицию (ключ) перед keyУдаляет элемент в позиции с ключом key изколлекцииПрисваивает новое значение элементу коллекции в позиции с ключом key.ДаНетДаДаДаДаДаДаДаДа6.10.
Работа с потокамиДля изменения содержимого свойств потока используется следующий синтаксис:Do oref.PropertyName.Write(data)Где oref – ссылка OREF на объект содержащий поток, PropertyName это имя свойства типа поток, Write это метод класса %Stream (поток), запись в поток, data это данные,связанные со свойством.
Например, для добавления нового значения к свойству Note объекта Visit используется следующий код:Do Visit.Note.Write(note)где visit – ссылка OREF на объект Visit, Note – это свойство типа поток, note этоданные типа поток, например, вводимые доктором во время визита пациента.В табл. 13 приведен ряд полезных методов для работы с потоками.Таблица 13Методы потоков данныхМетодПояснениеWrite(data)Записывает data в поток данныхRead(.length)Считывает length символов или битов из потока данных и передает их в качестве возвращаемого значения метода. Аргументпередается по ссылке, после вызова метода он содержит количество прочитанных символов или битов. Если оно оказываетсяменьше запрошенного, значит, поток данных закончился.Записывает data в поток данных в виде отдельной строки симвоWriteLine(data)(только для пото- лов.ков символов)Считывает строку символов из потока данных (вплоть до очеReadLine(.
length)(только для пото- редного ограничителя строки или до достижения длины length) ипередает их в качестве возвращаемого значения метода.ков символов)Rewind()Позиционирует указатель чтения-записи в начало потока данных.GoToEnd()Позиционирует указатель чтения-записи в конец потока данных.CopyFrom(stream)Копирует в «наш» поток данных другой поток, на который ссылается аргумент stream.OutputToDevice()Копирует все содержимое потока на текущее устройство.LineTerminatorОграничитель строки, используемый WriteLine() и ReadLine().По умолчанию CR LF.71Свойства потокаСвойствоПояснениеAtEndИстина(1), когда указатель чтения-записи находится в конце потока.Пример. Пусть класс User.Person содержит свойство Memo, которое является свойством типа поток данных.
Тогда в него можно записать текст произвольной длины.Set pers=##class(User.Person).%OpenId(ID)Do pers.Memo.WriteLine(“это первая строка”)…Do pers.Memo.WriteLine(“это последняя строка”)Do pers.%Save()QuitАналогично происходит чтение из потокаSet pers=##class(User.Person).%OpenId(ID)Do pers.Memo.Rewind()While ‘pers.Memo.AtEnd{ Set length=99write pers.Memo.ReadLine(.length),!}Quit6.11. Сохранение объектовДля сохранения хранимого объекта используется метод %Save() экземпляра:Do oref.%Save()где oref – ссылка oref объекта подлежащего сохранению.Метод %Save возвращает значение, позволяющее проверить успешность выполнения метода.Set sc=oref.%Save()где sc – значение, возвращаемое методом %Save, oref – ссылка на объект сохранения.Макро $$$ISOK возвращает 1, если метод отработал успешно, и 0 если неудачно.Наоборот, макро $$$ISERR возвращает 1, если неудачно, и 0 если успешно.Если метод отработал неудачно, то вызов метода DisplayError() из библиотеки Caché$system.Status распечатает текст сообщения об ошибке.Следующий код выполняет сохранение объекта Person со ссылкой OREF равной perи в случае ошибки выводит сообщение:Set sc = per.%Save()If $$$ISERR(sc) {Do $System.Status.DisplayError()}6.12.
Удаление объектовМожно удалить либо один объект, либо объекты одного экстента. Под экстентом понимается набор экземпляров класса и всех его подклассов.6.12.1.Удаление одного объектаДля удаления объекта из базы данных используются два метода %Delete и %DeleteId.Первый метод использует в качестве аргумента полный OID экземпляра, а второй ID экземпляра. Оба метода выдают информацию о том, как отработал метод.Синтаксис метода %Delete:Do ##class(Classname).%Delete(oid)72Set sc = ##class(Classname).%Delete(oid)Синтаксис метода %DeleteId:Do ##class(Classname).%DeleteId(id)Set sc = ##class(Classname).%DeleteId(id)Где classname это имя класса, oid это OID объекта удаления, id – ID экземпляра.
Впеременной sc – статус метода, информация о том, как он отработал.Например, для удаления объекта класса Person используется код:Set sc = ##class(Person).%Delete(oid)где oid это OID объекта Person, который требуется удалить, переменная sc содержиткод ошибки.Для удаления объекта класса Person с ID=24 используется код:Set sc = ##class(Person).%DeleteId(«24”)переменная sc содержит код ошибки.6.12.2. Удаление всех объектов экстентаМожно удалить все экземпляры класса и его подклассов, используя метод %DeleteExtent, который выдает информацию о том, как выполнилось удаление.Do ##class(Classname).%DeleteExtent()Set sc = ##class(Classname).%DeleteExtent()где Classname это имя корневого класса экстента для удаления, sc это переменная,которая содержит код ошибки.