Работа с объектной базой данных Создадим программу работы с объектами на языке Cache` Object Script в среде Cache`Studio и вызвать ее из среды Cache` Terminal. Программа принимает на вход значения:
all — просмотр списка всех сотрудников и руководителей,
director — просмотр списка всех руководителей,
номер — просмотр информации о сотруднике (руководителе), ID которого указан как входной параметр.
Для получения списка ID можно использовать SQL-запрос.
Для отображения информации необходимо обращаться к объекту класса "Сотрудник", его свойствам и методам:
"Информация о сотруднике" (класс "Сотрудник"(листинг)/ "Руководитель"(листинг), демонстрирует полиморфизм),
название компании (ссылка через связанный объект класса "Компания"(листинг)),
"Полный адрес" (класс "Адрес"(листинг), ссылка через связанный и встроенный объекты).
Программа для обращения к объектному представлению По аналогии с предыдущим примером, создаем файл программы.Выбор того или иного параметра организован с помощью конструкции if:
if condition{code} elseif condition{code} else {code}
, где condition - это условие вида:
condition= <выр1>[,<выр2>,…,<выр3>].
Чтобы блок программы выполнился, все условия в списке должны быть логически истинными. В нашем конкретном случае код программы выглядит так:
main(var) { if var="all" { code } elseif var="director" { code } else { code } }
Далее рассмотрим по отдельности реализацию каждого условия.
Просмотр списка всех сотрудников и руководителей Выполняется при вводе параметра "all". Рассмотрим алгоритм выполнения программы по шагам:
Выводим на экран монитора надпись-заголовок "Список сотрудников: ".
Используем объект класса % ResultSet для подготовки динамического SQL-запроса, используя метод Prepare:
set rset = ##class(%ResultSet).%New("%DynamicQuery:SQL") Do rset.Prepare("SELECT ID FROM SQLUser.Worker") Do rset.Execute() //выполнениезапроса
Устанавливаем счетчик i в ноль.
Организовываем цикл while. Метод Next перемещает курсор на следующую строку данных запроса.
В теле цикла идет увеличение i, присвоение ссылки полю id, а затем открытие объекта класса User.Worker с помощью идентификатора id:
set id = rset.Data("ID") set NewWM = ##class(User.Worker).%OpenId(id)
Вывод информации о сотруднике, используя метод WorkerInfo():
write !,i_". "_ NewWM.WorkerInfo(),
Вывод полного адреса компании:
write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),!
В итоге получаем следующую программу:
if var="all" { write !, "Список сотрудников: " set rset = ##class(%ResultSet).%New("%DynamicQuery:SQL") Do rset.Prepare("SELECT ID FROM SQLUser.Worker") Do rset.Execute() set i = 0 while (rset.Next()) { set i = i+1 set id = rset.Data("ID") set NewWM = ##class(User.Worker).%OpenId(id) write !,i_". "_ NewWM.WorkerInfo() write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),! } }
Просмотр списка всех руководителей Выполняется при вводе параметра "director". Рассмотрим алгоритм выполнения программы по шагам:
Выводим на экран монитора надпись-заголовок "Список руководителей: "
Используем объект класса % ResultSet для подготовки динамического SQL-запроса, используя метод Prepare:
set rset = ##class(%ResultSet).%New("%DynamicQuery:SQL") Do rset.Prepare("SELECT ID FROM SQLUser.Manager") Do rset.Execute() //выполнение запроса В запросе только уже выбираем ID из таблицы "Руководителей".
Устанавливаем i в ноль.
Организовываем цикл while. Метод Next перемещает курсор на следующую строку данных запроса.
В теле цикла идет увеличение i, присвоение ссылки полю id, а затем открытие объекта класса User.Worker с помощью идентификатора id:
set id = rset.Data("ID") set NewWM = ##class(User.Worker).%OpenId(id)
Вывод информации о сотруднике, используя метод WorkerInfo():
write !,i_". "_ NewWM.WorkerInfo(),
Вывод полного адреса компании:
write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),!
В итоге получаем следующую программу:
elseif var="director" { write !, "Список руководителей: " set rset = ##class(%ResultSet).%New("%DynamicQuery:SQL") Do rset.Prepare("SELECT ID FROM SQLUser.Manager") Do rset.Execute() set i = 0 while (rset.Next()) { set i =i+1 set id = rset.Data("ID") set NewWM = ##class(User.Worker).%OpenId(id) write !,i_". "_ NewWM.WorkerInfo() write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),! } }
Просмотр информации о сотруднике (руководителе), ID которого указан как входной параметр Рассмотрим алгоритм выполнения по шагам:
Выводим на экран монитора надпись "Код сотрудника = …: ", где вместо "…" номер ID, который введет пользователь.
Используем объект класса %ResultSet для подготовки динамического SQL-запроса, используя метод Prepare:
Set rset=##class(%ResultSet).%New("%DynamicQuery:SQL") do rset.Prepare("SELECT * FROM SQLUser.Worker WHERE ID='"_var_"'") do rset.Execute ()
Запрос выдает из таблицы "Сотрудник" данные того сотрудника, чей ID был введен пользователем.
Далее по аналогии с двумя вышеперечисленными примерами организуется цикл. В результате получаем следующий код:
else { write !,"Код сотрудника = "_var_":",! Set rset=##class(%ResultSet).%New("%DynamicQuery:SQL") do rset.Prepare("SELECT * FROM SQLUser.Worker WHERE ID='"_var_"'") do rset.Execute() while(rset.Next()) { set NewWM = ##class(User.Worker).%OpenId(rset.Data("ID")) write !, NewWM.WorkerInfo() write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),! } }
Объединим все части воедино для просмотра листинга программы полностью.
Листинг программы просмотра списка сотрудников Prog3 main(var) { if var="all" { write !, "Список сотрудников: " set rset = ##class(%ResultSet).%New("% DynamicQuery:SQL") Do rset.Prepare("SELECT ID FROM SQLUser.Worker") Do rset.Execute() set i = 0 while (rset.Next()) { set i =i+1 set id = rset.Data("ID") set NewWM = ##class(User.Worker).%OpenId(id) write !,i_". "_ NewWM.WorkerInfo() write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),! } } elseif var="director" { write !, "Список руководителей: " set rset = ##class(%ResultSet).%New("%DynamicQuery:SQL") Do rset.Prepare("SELECT ID FROM SQLUser.Manager") Do rset.Execute() set i = 0 while (rset.Next()) { set i =i+1 set id = rset.Data("ID") set NewWM = ##class(User.Worker).%OpenId(id) write !,i_". "_ NewWM.WorkerInfo() write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),! } } else { write !,"Код сотрудника = "_var_":",! Set rset=##class(%ResultSet).%New("%DynamicQuery:SQL") do rset.Prepare("SELECT * FROM SQLUser.Worker WHERE ID='"_var_"'") do rset.Execute() while(rset.Next()) { set NewWM = ##class(User.Worker).%OpenId(rset.Data("ID")) write !, NewWM.WorkerInfo() write !, "Адрес компании: " write NewWM.WorkerOrganization.OrganizationAddress.FullAddress(),! } } }
Проверка работоспособности программы Теперь посмотрим, как работает эта программа. Запустим ее в среде Cache` Terminal с различными параметрами:
Запутим программу Prog3 с параметром "all":
Как и говорилось выше, сначала идет запись-заголовок "Список сотрудников". Так как в таблице БД список сотрудников достаточно большой, он здесь виден не весь. Получилось, что первые 6 сотрудников являются руководителями и только 7-й – нет. Но разница между выводом информации видна.
Запустим программу Prog3 с параметром "director":
Как видно из результата, выдалась информация только о руководителях:
Запустим программу Prog3 с параметром - номером:
Результат выполнения показал, что сначала вывелось для уведомления сообщение о том, какой код сотрудника был введен, а затем – информация об этом сотруднике:
|