Скачать 494.07 Kb.
|
Работа с глобаламиСоздадим в среде Cache` Studio процедуры для обращения к данным используя прямой доступ:
В этом случае объекты, сохраненные в базе данных, представлены как многомерные массивы (глобалы). Для уточнения существующих индексов следует использовать среду Cache` Портал (раздел Globals, пакет USER). Имена глобалов данных содержат имена классов, соответствующих им, и заканчиваются символом 'D'. (Например, глобал данных для класса Company будет называться CompanyD.) Исходные данныеСозданые классы:
Ниже приведены листинги этих классов на языке Cache` Object Script. Листинг класса КомпанияClass User.Company Extends %Persistent // Создается хранимый класс { Property Name As %String [ Required ]; Index NameID On Name [ Unique ]; Property Business As list Of %String; Property Address As Address; // Описание метода класса, который создает новый объект класса Company ClassMethod Create(Name As %String, city As %String, street As %String, building As %String, corps As %String, apart As %String) As Company [ SqlProc ] { set new = ##class(Company).%New() set new.Name = Name set new.Address.City = city set new.Address.Street = street set new.Address.Building = building set new.Address.Corps = corps set new.Address.Apart = apart set done=new.%Save() quit new } } Листинг класса АдресClass Lab1.Address Extends %SerialObject //Создается встроенный класс . { Property City As %String; Property Street As %String; Property Building As %String; Property Corps As %String; Property Apart As %String; // Описание метода экземпляра класса, который возвращает адрес в виде строки Method Address() As %String { set retStr = $CASE(##this.City, "":"", :"г." _ ##this.City) _ $CASE(##this.Street, "":"", :", ул." _ ##this.Street) _ $CASE(##this.Building, "":"", :", д." _ ##this.Building) _ $CASE(##this.Corps, "":"", :", корп." _ ##this.Corps) _ $CASE(##this.Apart, "":"", :", кв." _ ##this.Apart) quit retStr } } Листинг класса СотрудникClass Lab1.Worker Extends %Persistent // Создание хранимого класса { Property Name As %String [ Required ]; Property WorkPlace As Company [ Required ]; Property WorkPosition As %String; // Метод экземпляра класса, возвращающий значения полей в виде строки Method Info() As %String { set retStr = ##this.Name _ " " _ ##this.WorkPlace.Name _ " " _ ##this.WorkPosition_" " quit retStr } } Листинг класса руководительClass Lab1.Head Extends Lab1.Worker // Описание дочернего класса { Property ADate As %Date [ Required ]; // Переопределенный метод экземпляра класса, возвращающий значения полей в виде строки Method Info() As %String { set retStr = ##this.Name _ " " _ ##this.WorkPlace.Name _ " Руководитель(" _ $ZDATE(##this.ADate,4)_")" quit retStr } } Структура и содержание таблиц базы данныхПосле компиляции классов можно посмотреть их структуру в среде Cache` Портал и убедиться, что создание и компиляция новых классов прошли успешно. Структура классов должна быть похожа на представленную ниже. Обратите внимание, что класс "Адрес" входит в состав таблицы для класса "Компания", поскольку он встроенный. Для хранимых классов создаются отдельные таблицы. Структура таблицы "Company": Структура таблицы "Worker": Структура таблицы "Head": Содержание таблиц базы данныхБыла написана программа (листинг программы) для создания и сохранения в базе данных новых объектов. После выполнения этой программы в среде Cache` Terminal в базе данных будут содержаться некоторые объекты. Содержимое таблиц можно посмотреть в среде Cache` Портал. Содержимое таблиц должно быть аналогично представленному ниже. Записи таблицы "Company": Записи таблицы "Worker": Записи таблицы "Head": Сохранение объектов в глобалахДля внутреннего хранения объектов используются глобалы. Глобал - это многомерный массив, который хранится в виде разреженных матриц. Каждый хранимый класс может сохранять свои экземпляры внутри базы данных, используя один или несколько узлов многомерных данных (глобалей). При создании класса компилятором класса автоматически создаются определения двух глобалей: глобали данных и индексной глобали. При этом справедливо следующее:
Рассмотрим глобалы, созданные для наших классов, и их содержимое. Просмотр глобалов в среде Cache` ПорталДля запуска "Портала" необходимо на панели задач нажать правой кнопкой мыши на значок Cache` и в выпадающем меню выбрать "Портал управления системой". Главное окно Портала выглядит как: Затем перейти на "Глобалы",чтобы увидеть те, которые присутствуют в БД:
Для просмотра содержимого конкретного глобала следует выбрать ссылку "Отображение". Рассмотрим глобалы данных, определенные для наших классов. Глобал данных для классов "Компания" и "Адрес"Экземпляры класса "Компания" (листинг класса) и встроенного в него класса "Адрес" (листинг класса), которым соответствует таблица Company (содержимое таблицы), хранится в виде глобала CompanyD: Рассмотрим структуру глобала: ^Lab1.CompanyD - последний индекс экземпляра записи. В глобале CompanyD последней записью является 5-ая запись. ^Lab1.CompanyD(5) – 5-я запись, экземпляр класса с индексом 5. Содержит список свойств экземпляра $lb("",$lb("","4","Moscow","1","Bauman"),"","BMSTU"), что означает:
Глобал данных для классов "Сотрудник" и "Руководитель"Экземпляры классов "Сотрудник" (листинг класса) и "Руководитель" (листинг класса), которым соответствуют таблицы Worker (содержимое таблицы) и Head (содержимое таблицы), храниятся в виде одного глобала WorkerD: Рассмотрим структуру глобала: ^Lab1.WorkerD - последний индекс экземпляра записи. В данном случае это 14. ^Lab1.WorkerD(8) - 8-я запись, экземпляр класса с индексом 8. Содержит список свойств экземпляра , $Lb("~Lab1.head~","Name4",,"4","руководитель"), что означает:
^Lab1.WorkerD(8,"head") - список данных, относящихся к производному классу. 8 - индекс объекта базового класса, где хранятся свойства базового класса. "head" - название производного класса. Содержит $Lb(,,60632), что означает:
Таблицы Worker и Head находятся в глобале WorkerD. Различия в записи: Worker записывается с указанием порядкового номера (WorkerD(1)=$Lb(…)), а Head – с указанием номера и поля со значением "head" (WorkerD(1,"head")=$Lb(…)). Программа для работы с глобаламиИспользуя функции для работы с глобалами, составим программу на языке Cache` Object Script в среде Cache` Studio. Рассмотрим основные шаги алгоритма. Сначала отобразим меню программы для выбора действия: set action = 0 while '((action=1)!(action=2)!(action=3)!(action="")) { read !,"Список компаний(1)/Удалить сотрудника(2)/Назначить руков.(3): ",action } if (action="") quit Составить список компанийЕсли была выбрана функция отображения, то выполним следующие действия. Организуем в цикле поиск значений глобала CompanyD, (в CompanyD находится номер последней записи): For i=1:1:^Lab1.CompanyD По каждому экземпляру проверим, что он существует: if ($Data(^Lab1.CompanyD(i))>0) Если да, то выполним вывод названия компании ( 4-ой позиции текущей записи): write "/",$List(^Lab1.CompanyD(i),4) Вывод адреса (всех элементов списка, хранящегося во 2-ой позиции текущей записи): for k=1:1:$ListLength($List(^Lab1.CompanyD(i),2)) { write $List($List(^Lab1.CompanyD(i),2),k)," " } Вывод сфер деятельности (всех элементов списка, хранящегося 3-ей позиции текущей записи): for j=1:1:$ListLength($List(^Lab1.CompanyD(i),3)) { write $List($List(^Lab1.CompanyD(i),3),j)," " } В итоге получаем код: // Список компаний if (action=1) { For i=1:1:^Lab1.CompanyD { write !,$Data(^Lab1.CompanyD(i)) if ($Data(^Lab1.CompanyD(i))>0) // Проверка на ненулевое содержание . { // Вывод названия компании ( 4 ой позиции текущей записи) write "/",$List(^Lab1.CompanyD(i),4) // Вывод адреса (всех элементов списка, хранящегося во 2-ой позиции текущей записи) for k=1:1:$ListLength($List(^Lab1.CompanyD(i),2)) { write $List($List(^Lab1.CompanyD(i),2),k)," " } write "/" // Вывод сфер деятельности (всех элементов списка, хранящегося 3-ей позиции текущей записи for j=1:1:$ListLength($List(^Lab1.CompanyD(i),3)) { write $List($List(^Lab1.CompanyD(i),3),j)," " } } } } Удалить сотрудника (руководителя)Если была выбрана функция удаления, то выполним следующие действия. Запросим имя сотрудника: read !,"Имя сотрудника: ",WName Выполним в цикле поиск записей глобала WorkerD (в WorkerD хранится номер последней записи): for i=1:1:^Lab1.WorkerD Проверим на ненулевое значение записи и выполним поиск по имени (2-ая позиция): if (($Data(^Lab1.WorkerD(i)))&&($List(^Lab1.WorkerD(i),2)=WName)) Если запись - искомая, то удалим ее. Для получения доступа к элементу списка после номера записи указывается номер по списку. При удалении индекса удаляются и вложенные глобала, поэтому достаточно удалить сотрудника, руководитель удалится автоматически: kill ^Lab1.WorkerD(i) В итоге получаем код: // Удаление сотрудника if (action=2) { set Found=0 read !,"Имя сотрудника: ",WName // Поиск записей глобала WorkerD (в WorkerD хранится номер последней записи) for i=1:1:^Lab1.WorkerD { // Проверка на ненулевое значение записи и поиск по имени (2-ая позиция) if (($Data(^Lab1.WorkerD(i)))&&($List(^Lab1.WorkerD(i),2)=WName)) // Для получения доступа к элементу списка после номера записи указывается номер по списку. { kill ^Lab1.WorkerD(i) // Удаление текущей записи set Found=1 write !,"Запись удалена!" } } if (Found=0) { write !,"Данный сотрудник отсутствует" } } Назначение руководителяЕсли была выбрана функция назначения, то выполним следующие действия. Введем имя руководителя и дату назначения (с проверкой правильности ввода): read !,"Имя руководителя: ",HName read !,"Дата назначения(чч/мм/гггг): ",ADate while '($ZDATEH(ADate,5)) { read !,"Дата назначения(чч/мм/гггг): ",ADate } Выполним в цикле поиск записей глобала WorkerD (в WorkerD хранится номер последней записи): for i=1:1:^Lab1.WorkerD Проверим на ненулевое значение записи: if ($Data(^Lab1.WorkerD(i))) Выполним поиск значений записей, которые совпадают с искомыми значениями: if (($Data(^Lab1.WorkerD(i,"Head")))&&($List(^Lab1.WorkerD(i),2)=HName)) Для совпадающих записей выполним: задание должности (значение для 5-ой позиции текущей записи глобала) : set $List(^Lab1.WorkerD(i),5)="руководитель" Задание даты (значение для 3-ей позиции текущей записи глобала): set $List(^Lab1.WorkerD(i,"Head"),3)=$ZDATEH(ADate,5) Создадим запись для производного класса (1-ая позиция записи) Head: set $List(^Lab1.WorkerD(i),1)="~Lab1.Head~" Измененим должность (запись в 5-ой позиции): set $List(^Lab1.WorkerD(i),5)="руководитель" Создадим запись в таблице Head с заданием даты. Для этого используется запись (i,"Head"), где i- номер записи. Используется ф-ия ListBuild: set ^Lab1.WorkerD(i,"Head")=$ListBuild(,,$ZDATEH(ADate,5)) В итоге получаем код: //----------------------------------------------------------- //Назначение руководителя if (action=3) { read !,"Имя руководителя: ",HName read !,"Дата назначения(чч/мм/гггг): ",ADate while '($ZDATEH(ADate,5)) { read !,"Дата назначения(чч/мм/гггг): ",ADate } for i=1:1:^Lab1.WorkerD // Поиск записей глобала WorkerD { if ($Data(^Lab1.WorkerD(i))) // Проверка на ненулевое значение записи { // Поиск значений записей, которые совпадают с искомыми значениями if (($Data(^Lab1.WorkerD(i,"Head")))&&($List(^Lab1.WorkerD(i),2)=HName)) { // Задание должности (значение для 5-ой позиции текущей записи глобала) set $List(^Lab1.WorkerD(i),5)="руководитель" // Задание даты (значение для 3-ей позиции текущей записи глобала) set $List(^Lab1.WorkerD(i,"Head"),3)=$ZDATEH(ADate,5) write !,"Запись руководителя изменена!" } if ($List(^Lab1.WorkerD(i),2)=HName) // Поиск имени (2-ая позиция) { // Создание записи для связного класса (1-ая позиция записи) Head set $List(^Lab1.WorkerD(i),1)="~Lab1.Head~" // Изменение должности (запись в 5-ой позиции) set $List(^Lab1.WorkerD(i),5)="руководитель" // Создание записи в таблице Head с заданием даты. Для этого используется запись (i,"Head"), где i- номер записи. Используется ф-ия ListBuild set ^Lab1.WorkerD(i,"Head")=$ListBuild(,,$ZDATEH(ADate,5)) write !,"Запись изменена!" } } } } Листинг программы работы с глобаламиfor { // Меню программы set action = 0 while '((action=1)!(action=2)!(action=3)!(action="")) { read !,"Список компаний(1)/Удалить сотрудника(2)/Назначить руков.(3): ",action } if (action="") quit //----------------------------------------------------------- //Список компаний if (action=1) { // Поиск значений глобала CompanyD // (в CompanyD находится номер последней записи) For i=1:1:^Lab1.CompanyD { write !,$Data(^Lab1.CompanyD(i)) if ($Data(^Lab1.CompanyD(i))>0) // Проверка на ненулевое содержание . { // Вывод названия компании ( 4 ой позиции текущей записи) write "/",$List(^Lab1.CompanyD(i),4) // Вывод адреса (всех элементов списка, хранящегося во . // 2-ой позиции текущей записи) for k=1:1:$ListLength($List(^Lab1.CompanyD(i),2)) { write $List($List(^Lab1.CompanyD(i),2),k)," " } write "/" // Вывод сфер деятельности (всех элементов //списка, хранящегося 3-ей позиции текущей записи for j=1:1:$ListLength($List(^Lab1.CompanyD(i),3)) { write $List($List(^Lab1.CompanyD(i),3),j)," "} } } } //----------------------------------------------------------- //Удаление сотрудника if (action=2) { set Found=0 read !,"Имя сотрудника: ",WName // Поиск записей глобала WorkerD (в WorkerD хранится номер последней записи) for i=1:1:^Lab1.WorkerD // Проверка на ненулевое значение записи и поиск по имени (2-ая позиция) if (($Data(^Lab1.WorkerD(i)))&&($List(^Lab1.WorkerD(i),2)=WName)) / Для получения доступа к элементу списка после номера записи указывается номер по списку. { kill ^Lab1.WorkerD(i) // Удаление текущей записи set Found=1 write !,"Запись удалена!" } } if (Found=0) {write !,"Данный сотрудник отсутствует"} } //----------------------------------------------------------- //Назначение руководителя if (action=3) { read !,"Имя руководителя: ",HName read !,"Дата назначения(чч/мм/гггг): ",ADate while '($ZDATEH(ADate,5)) { read !,"Дата назначения(чч/мм/гггг): ",ADate } for i=1:1:^Lab1.WorkerD // Поиск записей глобала WorkerD { if ($Data(^Lab1.WorkerD(i))) // Проверка на ненулевое значение записи { // Поиск значений записей, которые совпадают с искомыми значениями if (($Data(^Lab1.WorkerD(i,"Head")))&&($List(^Lab1.WorkerD(i),2)=HName)) { // Задание должности (значение для 5-ой позиции текущей записи глобала) set $List(^Lab1.WorkerD(i),5)="руководитель" // Задание даты (значение для 3-ей позиции текущей записи глобала) set $List(^Lab1.WorkerD(i,"Head"),3)=$ZDATEH(ADate,5) write !,"Запись руководителя изменена!" } if ($List(^Lab1.WorkerD(i),2)=HName) // Поиск имени (2-ая позиция) { // Создание записи для связного класса (1-ая позиция записи) Head set $List(^Lab1.WorkerD(i),1)="~Lab1.Head~" // Изменение должности (запись в 5-ой позиции) set $List(^Lab1.WorkerD(i),5)="руководитель" // Создание записи в таблице Head с заданием даты. Для этого используется запись (i,"Head"), где i- номер записи. Используется ф-ия ListBuild (см. приложение) set ^Lab1.WorkerD(i,"Head")=$ListBuild(,,$ZDATEH(ADate,5)) write !,"Запись изменена!" } } } } Экспорт/ Импорт глобаловПоскольку данные хранятся в виде глобалов, то для перенося данных между компьютерами необходимо выполнить экспорт и импорт глобалов. Для проведения экспорта необходимо зайти в Портал управления системой: [Домашняя страница] > [Глобалы] > [Экспорт глобалов]. Выбрать глобалы, которые необходимо экспортировать: Результат выполнения: Для импорта глобалов необходимо зайти в Портал управления системой: [Домашняя страница] > [Глобалы] > [Импорт глобалов]. Выбрать файл, из которого необходимо импортировать глобалы: Результат выполнения: В случае удачного импорта появится сообщение: Список используемой литературы.
|
О предоставлении отчёта о проделанной работе и экологической обстановке Приикское территориальное управление Министерства экологии и природных ресурсов рт направляет отчет о проделанной работе и экологической... | Отчет о проделанной работе за 2009-2010 учебный год учителя географии и экономики Тонышевой О. В «Создание условий для разностороннего развития личности учащихся на уроках географии и истории» | ||
Отчет о проделанной работе за 2009-2010 учебный год учителя географии и экономики Тонышевой О. В «Создание условий для разностороннего развития личности учащихся на уроках географии и истории» | Годовой отчёт о проделанной работе за 2013 год клуба пос. Шудаяг му «цкс» мого «Ухта» На базе школы №7-продолжили свою работу возрастные клубы по интересам: «Почемучки» для учащихся 1 классов; ««Егоза» для учащихся... | ||
Отчет о проделанной работе за 2006/2007 у г ... | Планирование воспитательной работы на 2008/2009 учебный год Отчет классных руководителей о воспитательной работе проделанной в 1 четверти (5-6 класс) | ||
Отчет о проделанной работе в рамках недели русского языка и литературы... М. И. Цветаевой – «К юбилею любимого писателя»: 120 лет со дня рождения русской поэтессы для учащихся 9А, 9б классов. 10Б класс «В... | Отчет о проделанной работе по внедрению фгос в моу «Моркинская средняя... Проанализированы и приведены в соответствие действующие программы доу и Моркинской сош №2 на семинаре учителей начальных классов... | ||
Отчёт о проделанной работе На 15 «а» Боровая Ю., Данилкина А., Бухарев И., Малюта А., Дремицкая А., Прокофьева М | Отчёт о проделанной методической работе преподавателя истории и обществознания... | ||
Отчет о проделанной работе за 2014 год Справка Количество членов Приморского регионального отделения Ассоциации юристов России – 214 | Отчет о проделанной работе Молодежного парламента Бардымского Заслушав отчет председателя Молодежного парламента Ибрагимова И. Д. Земское Собрание Бардымского муниципального района | ||
Отчет о проделанной работе Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Кабардино-Балкарский государственный... | Отчет о проделанной работе Совершенствовать систему работы доу по внедрению и развитию инновационных технологий в воспитательно – образовательном процессе и... | ||
Плодовское сельское поселение Позвольте мне представить отчет об итогах развития Плодовского сельского поселения и проделанной работе в 2013 году | Отчёт о проделанной работе кружка «Основы православной культуры» с детьми 6-7 лет Руководитель мо заместитель директора по увр директор мбоу «Лицей №9» г. Белгорода |