Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №3.doc
Скачиваний:
15
Добавлен:
09.05.2015
Размер:
705.54 Кб
Скачать

Ход работы

  1. Изучить теоретический материал, изложенный выше в данной методичке, а также в главах 3.2 и 3.3 методических указаний в формате PDF.

  2. Из меню Cache-куба открыть Cache Studio, ознакомиться с его интерфейсом и создать новую программу. См. рисунок 3.

Рисунок 3 – Создание новой программы на языке Cache Object Script.

  1. На примерах, изложенных ниже, изучить основные приёмы работы с глобалами с использованием циклических структур:

  • Занести следующие данные о пациентах в глобал ^Medizine:

Таблица 1 – Данные о пациентах.

Фамилия пациента

Возраст

Пол

Кровяное

давление

Температура тела

Иванов

65

мужской

125/60

36,6

Сидорова

50

женский

Нет данных

Нет данных

Тарасов

27

мужской

110/80

38,6

Петров

45

мужской

Нет данных

36,6

Иваненко

34

женский

115/85

Нет данных

Горбунков

60

мужской

100/80

39,3

Иващенко

71

мужской

140/60

36,9

Турчинов

65

мужской

Нет данных

Нет данных

Программа имеет вид, приведённый на рисунке ниже:

После набора кода в центральном окне, рисунок 4, программу следует откомпилировать, путём нажатии клавиш Ctrl+F7. Перекомпилируйте программу каждый раз, когда что-то в ней меняете или исправляете ошибки!

После первой компиляции программа попросит сохранение, см. рисунок 5.

Рисунок 4 – Работа над собственной программой в Cache Studio.

Рисунок 5 – Сохранение программы на диске.

Для выполнения программы используйте программу «Терминал», также вызываемую из меню Cache-куба. См. рисунок 6.

Вызов программы осуществляется с помощью оператора «do», далее пробел, далее знак циркумфлекс «^» и затем полное имя программы, которая тестируется. В конце каждой строки нажимается «Enter».

Рисунок 6 – Выполнение созданной программы в «Терминале».

Убедитесь в том, что все данные сохранены на диске в глобале ^Medizine. Для этого откройте портал управления системой:

Рисунок 7 – Просмотр глобалов в области User.

  • Работа с функцией $Data. Функция $Data (коротко $D) – это функция с именем переменной в качестве аргумента. Эта функция может работать с локальной или с глобальной, скалярной или индексированной переменной. Значение функции $Data определяет, существует ли заданная в виде аргумента переменная и какая у неё структура. Функция возвращает четыре различных результата:

  1. Если её значение равно 0 (10), то переменная не существует;

  2. Если её результат 1(11), то переменная существует.

Пример программы, которая позволяет определить имеется ли данный пациент на лечении или нет, приведена на рисунке ниже:

Программа имеет вид:

Здесь применён оператор косвенности - @, который преобразует в данном случае имя переменной в её значение. В общем случае он предназначен для преобразования строки символов в программный код.

Результат её работы может быть следующим:

Рисунок 8 – Результат работы программы.

  • Работа с функцией $Order. Она является основной функцией, служащей для получения очередного в последовательности сортировки индекса локальной или глобальной индексированной переменной. Применяя цикл, в соответствии с последовательностью сортировки могут быть получены все существующие индексы данного уровня. Для того, чтобы задать самый первый индекс в пределах заданного уровня, использую пустую строку. Пример применения выполним в Терминале:

USER> w $O(^Medizine(65))

71

Получим ответ на следующий вопрос: Пациенты, каких возрастов присутствуют на лечении? Ответом будет программа:

Результат отладки программы в «Терминале» имеет вид, представленный на рисунке 9.

Рисунок 9 – Получение списка возрастов.

Это один из классических циклов Cache ObjectScript, использование которого либо в этой форме, либо в различных модификациях при прямом доступе к глобалам остаётся актуальным.

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

USER>w $O(^Medizine(27,""))

мужской

Пусть требуется ответить на вопрос, есть ли среди пациентов возрастом 65 лет женщины? Ответом будет программа:

USER>d ^p5

мужской

Результат выполнения программы дал ответ «мужской», интерпретация которого может означать, что женщин данного возраста на лечение не поступало.

  • Функция $Query. Исходя их особого характера функции $Order, она, прежде всего, предназначена для получения всех по порядку существующих индексов в пределах данного уровня. Однако иногда более естественным является другой способ просмотра. Если просмотр последовательности индексов сначала уходит в глубину и показывает детали на более высоких уровнях до тех пор, пока эти уровни не закончатся, а потом просматривается следующая запись на более высокой ступени индексации, то это так называемый поиск «depth-first» (сначала вглубь), осуществляемый с помощью функции $Query. С помощью этой функции мы получаем имя узла на следующем уровне, но в отличие от функции $O, получается полная ссылка в виде строки символов:

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-го индекса?

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

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, в цикле пролистываются все существующие записи о пациентах и далее если находим, что очередная запись равна р (фамилия человека), то выводим на экран все данные о нём.

Результат работы такой программы приведён на рисунке 9.1

Рисунок 9.1 – Результат работы программы.