Ход работы
Изучить теоретический материал, изложенный выше в данной методичке, а также в главах 3.2 и 3.3 методических указаний в формате PDF.
Из меню Cache-куба открыть Cache Studio, ознакомиться с его интерфейсом и создать новую программу. См. рисунок 3.
Рисунок 3 – Создание новой программы на языке Cache Object Script.
На примерах, изложенных ниже, изучить основные приёмы работы с глобалами с использованием циклических структур:
Занести следующие данные о пациентах в глобал ^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 определяет, существует ли заданная в виде аргумента переменная и какая у неё структура. Функция возвращает четыре различных результата:
Если её значение равно 0 (10), то переменная не существует;
Если её результат 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. В некоторых вариантах постановки задачи, вне зависимости от того, имеем ли мы дело с глобальной или локальной индексированной переменной, возникает необходимость исследования её структуры. На переднем плане тогда стоят вопросы:
Сколько уровней (индексов) имеет индексированная переменная?
Каково значение 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 – Результат работы программы.