- •Лабораторная работа №3
- •Теоретические сведения
- •Создание программ с помощью Cache Studio
- •Область информации
- •Основные теоретические сведения о циклических алгоритмах
- •Основные теоретические сведения о глобальных переменных
- •Ход работы
- •Рекомендуемые источники
- •Самостоятельная работа
- •Вопросы для самоподготовки
Основные теоретические сведения о глобальных переменных
Cache ObjectScript использует полностью интегрированные в язык хранимые структуры данных, так называемые глобальные переменные. Эти переменные так же как и временные «локальные», могут существовать в виде простых или индексированных структур. Глобальные переменные, или кратко глобалы, являясь хранимыми данными, создают не только основу для длительного хранения объектов, но и основу для возможного в Cache ObjectScript чрезвычайно эффективного прямого доступа.
Многомерность данных в Cache реализуется через индексы, поэтому в качестве синонима здесь говорят об индексированных переменных.
Синтаксис, лежащий в основе индексированных переменных, достаточно прост. Индексы заключаются в скобки и отделяются друг от друга запятыми. Например:
x(1990,”Август”,23)=”День рождения”
Переменная x имеет заключённые в скобки индексы, в данном примере их три. То, что здесь видится таким простым, приобретает в Cache совершенно особое значение благодаря следующим замечаниям:
Нет необходимости в предварительном объявлении размерности массива. Создаются лишь заданные командой Set записи.
Это становится возможным благодаря концепции разряжённых массивов, когда лишь существующие записи занимают место в памяти или на диске.
Массив разряжённый; это означает, что исходя из наличия узла массива y(2,7) нельзя автоматически предполагать наличие какого-либо другого узла, например y(2,4).
При помощи одно единственного знака циркумфлекса, или знака глобала ^ - локальная переменная превращается в хранимую (глобальную) переменную. При этом база данных на основе глобалов воспринимается не как отдельная сущность, а как логическое расширение концепции локальных переменных. Например:
^OTD.Tovar(123000,50,”Зелёный киви”)=4
Ход работы
Изучить теоретический материал, изложенный выше в данной методичке, а также в главах 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 – Результат работы программы.
