Лабораторная работа №3
.pdf11
Результат отладки программы в «Терминале» имеет вид, представленный на рисунке 9.
Рисунок 9 – Получение списка возрастов.
Это один из классических циклов Cache ObjectScript, использование которого либо в этой форме, либо в различных модификациях при прямом доступе к глобалам остаѐтся актуальным.
Каким образом получают к уже заданному индексу (27 к примеру) первый индекс на втором уровне? Это осуществляется точно таким же способом, как и ранее, путѐм использования пустой строки на втором уровне индексации:
12
USER>w $O(^Medizine(27,""))
мужской
Пусть требуется ответить на вопрос, есть ли среди пациентов возрастом 65 лет женщины? Ответом будет программа:
USER>d ^p5
мужской
Результат выполнения программы дал ответ «мужской», интерпретация которого может означать, что женщин данного возраста на лечение не поступало.
Функция $Query. Исходя их особого характера функции $Order, она, прежде всего, предназначена для получения всех по порядку существующих индексов в пределах данного уровня. Однако иногда более естественным является другой способ просмотра. Если просмотр последовательности индексов сначала уходит в глубину и показывает детали на более высоких уровнях до тех пор, пока эти уровни не закончатся, а потом просматривается следующая запись на более высокой ступени индексации, то это так называемый поиск «depth-first» (сначала вглубь), осуществляемый с помощью функции $Query. С помощью этой функции мы получаем имя узла на следующем уровне, но в отличие от функции $O, получается полная ссылка в виде строки символов:
13
USER>w $Q(^Medizine(27)) ^Medizine(27,"мужской","110/80",38.6)
USER>w $Q(^Medizine(27,"мужской","110/80",38.6))
^Medizine(34,"женский","115/85")
Чтобы получить в нашей модели данных все определѐнные записи, необходимо
применить цикл:
USER>d ^p6
^Medizine(27,"мужской","110/80",38.6) = Тарасов
^Medizine(34,"женский","115/85") = Ивененко
^Medizine(45,"мужской",36.6) = Петров
^Medizine(50,"женский") = Сидорова
^Medizine(60,"мужской","100/80",39.3) = Горбунков
^Medizine(65) = Турчинов
^Medizine(65,"мужской","125/60",36.6) = Иванов
^Medizine(71,"мужской","140/60",36.9) = Иващенков
Анализ индексированных переменных с помощью функций $QLength и $QSubscript. В некоторых вариантах постановки задачи, вне зависимости от того, имеем ли мы дело с глобальной или локальной индексированной переменной, возникает необходимость исследования еѐ структуры. На переднем плане тогда стоят вопросы:
1.Сколько уровней (индексов) имеет индексированная переменная?
2.Каково значение i-го индекса?
14
Демонстрация использования данной функции в терминале имеет следующий вид:
USER>w $QL("^Medizine(65)")
1
USER>w $QL("^Medizine(65,""мужской"")")
2
В последнем примере использованы двойные кавычки, чтобы интерпретатор языка не перепутал индекс и аргумент функции $QL. Аргумент всегда берѐтся в двойные кавычки.
Теперь обратимся к функции $QSubscript (сокращѐнно $QS), которая имеет два аргумента. Первым аргументом является исследуемое значение имени индексированной переменной, второй задаѐт, какой именно индекс следует извлечь. Если в общем случае значение имени имеет форму Name(s1, s2, s3….sn),
то результат функции $QS(Name(s1, s2, s3….sn), m) равен значению m-го индекса в случае, если m не превышает n:
USER>w $QS("^Medizine(27,""мужской"",""110/80"")",3)
110/80
Комбинированное использование рассмотренных функций:
Пусть нужно дать ответ на вопрос, поступал ли на лечение пациент с фамилией
«Иванов», и если поступал, то вывести информацию о нѐм. Ответом является программа, которая запрашивает фамилию пациента и выдаѐт параметры,
характеризующие его состояние. Фамилия помещается в переменную p, в цикле пролистываются все существующие записи о пациентах и далее если находим, что очередная запись равна р (фамилия человека), то выводим на экран все данные о нѐм.
15
Результат работы такой программы приведѐн на рисунке 9.1
Рисунок 9.1 – Результат работы программы.
16
Самостоятельная работа
1.Создать программу (№1) для определения фамилий пациентов, температура тела которых находится выше нормы (т.е. более 36,6), используя информацию о структуре данных, приведѐнную в таблице 1.
Рисунок 10 - Результат работы программы №1, которую нужно создать.
2.Усложнить предыдущую программу (№1), подсчитав количество пациентов с повышенной температурой, а, также создав интерфейс ввода порога температуры, фамилии пациентов, со значением выше которой следует вывести на экран.
17
Рисунок 11 – Результат работы программы №2, которую нужно создать.
3.Создать программу (№3) для определения артериального давления и температуры тела пациента по его фамилии, используя информацию о структуре данных, приведѐнную в таблице 1.
Рисунок 12 - Рисунок 11 – Результат работы программы №2.
18
Вопросы для самоподготовки
1.Чем глобальная переменная отличается от локальной?
2.Чем индексированная переменная отличатся от скалярной?
3.Что такое циклический алгоритм? Какие операторы реализуют его в языке
Cache ObjectScript?
4.Для чего используется программа Cache Studio?
5.С помощью каких функций в Cache ObjectScript осуществляется навигация в многомерных массивах?
6.Какая функция определяет существование данных на n-м уровне?
7.Чем характеризуется поиск “Depth-first”?
8.Результатом работы, какой функции является имя n-го индекса массива?
9.Какую роль выполняет функция $Query? Что является еѐ аргументом?
10.Для чего используется знак косвенности (@)?
Рекомендуемые источники
1.Документация, поставляемая с Cache, доступная по локальному адресу:
C:\InterSystems\Cache\Docs\Main.html
2.СУБД Cache. Объектно-ориентированная разработка приложений. Учебный курс. В.Кирстен и др. СПб: Питер, 2001г.- 415 с.
3.СУБД Cache. Работа с объектами. И. И. Труб – М.: ДИАЛОГ-МИФИ, 2006 – 480с.
4.http://www.intersystems.ru
5.http://www.sql.ru/forum/actualthread.aspx