Проектирование информационной системы для хранения данных о фильмах и кинотеатрах

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

  • 1. Постановка задачи
  • 2. Проектирование информационной системы
  • 2.1 Построение диаграммы вариантов использования
  • 2.2 Диаграмма последовательности действий
  • 2.3 Построение диаграммы классов
  • 3. Проектирование реляционной модели базы данных
  • 4. Мапирование реляционной модели в метамодель
  • 4.1 Построение диаграммы классов для метамодели
  • 4.2 Проектирование метамодели базы данных
  • 5. Логическая реализация Базы данных
  • 6. Физическая реализация Базы данных
  • 6.1 Скрипты
  • 7. Создание выборок
  • Выводы
  • Список литературы
  • Приложение

1. Постановка задачи

Кинотеатры (информация для зрителей):

фильмы: название, описание, жанр, длительность, популярность, в каких кинотеатрах показывается, цены на билеты;

кинотеатры: название, адрес, схема проезда, описание, число мест, акустическая система, формат.

2. Проектирование информационной системы

2.1 Построение диаграммы вариантов использования

На первом этапе предпроектного исследования выяснено, что основная задача разрабатываемой системы — сопровождение процесса.

Диаграмма вариантов использования представлена на картинке ниже:

Рисунок 2.1 — Диаграмма вариантов использования

Как видно из диаграммы, у посетителя есть возможность заказать билет. При этом у него есть возможность просмотреть каталог фильмов и список кинотеатров, в которых показывают соответствующий фильм. Либо выбрать из списка удовлетворяющий критериям кинотеатр, и просмотреть, какие фильмы в нем показывают.

информационная система база программа

2.2 Диаграмма последовательности действий

Ниже представлена диаграмма последовательности действий:

Рисунок 2.2 — Диаграмма последовательности действий

Через интерфейс можно получить любую интересующую информацию по фильму или кинотеатру. Выбрав фильм, можно получить всю информацию о нем (жанр, рейтинг, цену на билет, продолжительность), а так же список кинотеатров, в которых показывают данный фильм. Из списка можно так же выбрать подходящий кинотеатр и узнать всю информацию о нем (адрес, название, число мест, акустическая система, формат экрана).

2.3 Построение диаграммы классов

На рисунке ниже представлена диаграмма классов:

Рисунок 2.3 — Диаграмма классов

Исходя из диаграммы последовательности действий, мы получим 2 класса: Фильм и Кинотеатр. В класс Фильм входят 6 атрибутов, из которых атрибут ID_фильма является идентификационным номером фильма. Класс Кинотеатр имеет также 6 атрибутов, в котором ID_кинотеатра является его идентифицирующим номером. Классы соединены между собой отношением «Многие ко многим».

3. Проектирование реляционной модели базы данных

Возьмем за правило считать классы сущностями. Объектной модели можно сопоставить модели данных из-за постоянного характера классов. Стойкие классы могут выступать в качестве постоянного хранения данных во время работы приложения. Следовательно, для всех постоянных классов можно применить утверждение, что они могут использовать однозначное отображение в сущностях. Этот процесс называется «Маппирование» (от. англ. Mapping).

Тогда отношения Фильм и Кинотеатр, выявленные на этапе построения концептуальной модели характеризуются следующими атрибутами (табл.3. 1)

Таблица 3.1 Атрибуты отношения «Фильм»

Атрибут

Описание

ID_фильма

Первичный ключ

Название_фильма

Название фильма

Длительность

Жанр

Рейтинг

Цена билета

Длительность фильма

Жанр фильма

Рейтинг фильма

Цена билета

Отношению Фильм соответствует полная ФЗ: ID_фильма > Название фильма, длительность, жанр, рейтинг, цена билета. Все поля кроме «ID_фильма» не могут быть первичным ключом.

Таблица 3.2 Атрибуты отношения «Кинотеатр»

Атрибут

Описание

ID_кинотеатра

Первичный ключ

Адрес

Адрес кинотеатра

Название_кинотеатра

Число_мест

Акустическая_система

Формат_экрана

Название кинотеатра

Число мест

Акустическая система

Формат экрана

Отношению Кинотеатр соответствует полная ФЗ: ID_кинотеатра > адрес, название кинотеатра, число мест, акустическая система, формат экрана. Все поля кроме «ID_кинотеатра» не могут быть первичным ключом.

Анализ функциональных зависимостей, которые имеют место для отношений Фильм и Кинотеатр показывает, что они полные. Следовательно, универсальное отношение Кинотеатр-Фильм нормализовано.

Сущности Фильм и Кинотеатр соединены связью «многие ко многим» (М: N). Мощность связи многие-ко-многим означает неоднозначность связи экземпляров сущностей. Для разрешения этой проблемы вводим составную сущность ids. Она состоит из первичных ключей соединяемых сущностей.

Окончательная реляционная модель базы данных выглядит следующим образом:

Рисунок 3.1 — Реляционная модель базы данных

4. Мапирование реляционной модели в метамодель

Классической методикой проектирования баз данных является создание отдельной таблицы для каждой описываемой моделью данных сущности. Такой подход хорошо работает для БД с относительно небольшим количеством описываемых объектов и при несложных и статичных связях между ними. Однако любое изменение структуры хранимых данных приводит к внесению изменений в структуру таблиц, отображающих эти данные. Несложная на этапе разработки, эта операция становится крайне проблематичной при больших объемах данных и при отсутствии у разработчика непосредственного доступа к БД (например, если она находится у заказчика).

Одним из основоположников метамодели стал Анатолий Тенцер [4]. Он описал пять основных тезисов, на которых должна строиться проектируемая база данных:

1. Каждая сущность, информация о которой хранится в БД, — это объект.

2. Каждый объект уникален в пределах БД и имеет уникальный идентификатор.

3. Объект имеет свойства (строковые, числовые, временные, перечислимые), которые описывают атрибуты сущности.

4. Объекты могут быть связаны между собой произвольным образом. Связь характеризуется связанными объектами и типом связи.

5. Объект может быть хранилищем. В этом случае допускается хранение в нем других объектов.

Такая структура базы данных не привязана ни к какой бизнес-модели и позволяет реализовать на этой основе практически любую бизнес-логику.

4.1 Построение диаграммы классов для метамодели

Исходя из описанных выше утверждений, была спроектирована диаграмма классов, которая удовлетворяет этим тезисам (рис. 4. 1).

Как видно из диаграммы классов она состоит из 4 классов: Типы, Объекты, Атрибуты и Параметры. В каждом классе, кроме класса Параметры, имеется 3 атрибута, из которых один — это идентификатор данного класса. В классы Объекты и Атрибуты мигрирует идентификатор из класса Типы. Класс Параметры не имеет своего идентификатора, но в него мигрируют идентификаторы из классов Атрибуты и Объекты.

Рисунок 4.1 — Диаграмма классов

4.2 Проектирование метамодели базы данных

Отношения Типы, Объекты, Атрибуты и Параметры, выявленные на этапе построения концептуальной модели характеризуются следующими атрибутами (табл.3. 1).

Таблица 3.1 Атрибуты отношения «Типы»

Атрибут

Описание

ID_типа_объекта

Первичный ключ

Название

Название типа

Описание

Описание типа

Таблица 3.2 Атрибуты отношения «Объекты»

Атрибут

Описание

ID_объекта

Первичный ключ

ID_типа_объекта

Внешний ключ отношения «Типы»

Название_объекта

Название объекта

Таблица 3.3 Атрибуты отношения «Атрибуты»

Атрибут

Описание

ID_атрибута

Первичный ключ

ID_типа_объекта

Внешний ключ отношения «Типы»

Название_атрибута

Название атрибута

Таблица 3.3 Атрибуты отношения «Параметры»

Атрибут

Описание

ID_объекта

Внешний ключ отношения «Объекты»

ID_отношения

ID_атрибута

Показывает отношение между объектами

Внешний ключ отношения «Атрибуты»

Текстовое значение

Номерное значение

Поле для текстовых данных

Поле для числовых данных

Отношение Параметры играет роль связи «Многие ко Многим», а атрибут ID_отношения показывает эту связь.

5. Логическая реализация Базы данных

Реализуем таблицу cf_types. Для идентификации записей введем первичный ключ object_type_id.

Таблица 5.1 Обоснование типов полей таблицы cf_types:

Атрибут

Столбец

Тип данных

Мотивация

Примечание

ID_типа_объекта

object_type_id

NUMBER

Primary Key

Название

name

VARCHAR2 (50)

Название

Описание

description

VARCHAR2 (100)

Описание

Реализуем таблицу cf_obj. Для идентификации записей введем первичный ключ object_id.

Таблица 5.2 Обоснование типов полей таблицы cf_obj:

Атрибут

Столбец

Тип данных

Мотивация

Примечание

ID_объекта

object_id

NUMBER

Primary Key

ID_типа_объекта

object_type_id

NUMBER

Foreign Key

Название_объекта

name

VARCHAR2 (150)

Название объекта

Реализуем таблицу cf_attr. Для идентификации записей введем первичный ключ attr_id.

Таблица 5.3 Обоснование типов полей таблицы cf_attr:

Атрибут

Столбец

Тип данных

Мотивация

Примечание

ID_атрибута

attr_id

NUMBER

Primary Key

ID_типа_объекта

object_type_id

NUMBER

Foreign Key

Название_атрибута

name

VARCHAR2 (50)

Название атрибута

Реализуем таблицу cf_par. Первичных ключей таблица не имеет.

Таблица 5.4 Обоснование типов полей таблицы cf_par:

Атрибут

Столбец

Тип данных

Мотивация

Примечание

ID_объекта

object_id

NUMBER

Номер объекта

Foreign Key

ID_отношения

relation_id

NUMBER

Номер отношения

ID_атрибута

attr_id

NUMBER

Номер атрибута

Foreign Key

Текстовое_значение

text_value

VARCHAR2 (150)

Поле для текстовых данных

Номерное_значение

number_value

NUMBER

Поле для цифровых данных

Схема базы данных cf_meta была реализована так:

Рисунок 5.1 — Схема базы данных cf_meta

6. Физическая реализация Базы данных

6.1 Скрипты

Создадим таблицы, согласно схеме указанной выше:

Create table cf_types (

object_type_id Number NOT NULL,

name Varchar2 (50),

description Varchar2 (100),

Constraint pk_cf_types primary key (object_type_id));

Create table cf_attr (

attr_id Number NOT NULL,

object_type_id Number,

name Varchar2 (50),

Constraint pk_cf_attr primary key (attr_id));

Create table cf_obj (

object_id Number NOT NULL,

object_type_id Number,

name Varchar2 (150),

Constraint pk_cf_obj primary key (object_id));

Create table cf_par (

object_id Number NOT NULL,

relation_id Number,

attr_id Number,

text_value Varchar2 (150),

number_value Number);

Alter table cf_attr add Constraint r12 foreign key (object_type_id) references cf_types (object_type_id);

Alter table cf_obj add Constraint r11 foreign key (object_type_id) references cf_types (object_type_id);

Alter table cf_par add Constraint r14 foreign key (attr_id) references cf_attr (attr_id);

Alter table cf_par add Constraint r13 foreign key (object_id) references cf_obj (object_id);

7. Создание выборок

Задание 1

Вывести список не повторяющихся жанров фильма.

SELECT DISTINCT text_value FROM cf_par par WHERE attr_id IN (SELECT attr_id FROM cf_attr WHERE name='genre')

Задание 2

Вывести название фильмов в которых 5-я буква «о»

SELECT name

FROM cf_obj

WHERE SUBSTR (name, 5,1) ='о' AND object_type_id IN (SELECT object_type_id FROM cf_types WHERE name LIKE 'Film')

Задание 3

Вывести название фильмов, их продолжительность и жанр, названия которых состоят из одного или более слов

SELECT obj. name, genre. text_value, dur. number_value

FROM cf_obj obj

JOIN cf_par genre ON genre. object_id=obj. object_id

AND obj. name LIKE '% %'

AND obj. object_type_id= (SELECT object_type_id FROM cf_types WHERE name='Film')

AND genre. attr_id= (SELECT attr_id FROM cf_attr WHERE name='genre')

JOIN cf_par dur ON dur. object_id=obj. object_id

WHERE dur. attr_id= (SELECT attr_id FROM cf_attr WHERE name='duration')

Задание 4

Вывести название фильма, продолжительность и рейтинг. Цена и жанр которых описывается следующим набором данных (30. 75, 35) и (Ужасы, Приключения)

SELECT obj. name, genre. text_value, dur. number_value, price. number_value

FROM cf_obj obj

JOIN cf_par genre ON genre. object_id=obj. object_id

AND obj. object_type_id= (SELECT object_type_id FROM cf_types WHERE name='Film')

AND genre. text_value IN ('Ужасы','Приключения')

JOIN cf_par price ON price. object_id=obj. object_id

AND price. number_value IN (35,30. 75)

JOIN cf_par dur ON dur. object_id=obj. object_id

WHERE attr_id= (SELECT attr_id FROM cf_attr WHERE name='duration')

Задание 5

Вывести список фильмов, которые проходят в кинотеатре Космос

SELECT obj. name

FROM cf_obj obj

JOIN cf_par rel ON rel. relation_id=obj. object_id

AND rel. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='ids')

WHERE rel. object_id IN (SELECT object_id FROM cf_obj WHERE name='Космос')

Задание 6

Вывести список кинотеатров и весь список фильмов их цен, жанров, продолжительности которые проходят в этих кинотеатрах, отсортированных по названию кинотеатра

SELECT cin. name, film. name, price. number_value, genre. text_value, duration. number_value

FROM cf_obj cin

JOIN cf_par par ON par. object_id=cin. object_id

AND par. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='ids')

JOIN cf_obj film ON film. object_id=par. relation_id

JOIN cf_par price ON price. object_id=film. object_id

AND price. attr_id= (SELECT attr_id FROM cf_attr WHERE name='price')

JOIN cf_par genre ON genre. object_id=film. object_id

AND genre. attr_id= (SELECT attr_id FROM cf_attr WHERE name='genre')

JOIN cf_par duration ON duration. object_id=film. object_id

WHERE duration. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='duration')

ORDER BY cin. name

Задание 7

Вывести список фильмов, жанр и цену, цена которых находится в промежутке от 25 до 30

SELECT film. name, genre. text_value, price. number_value

FROM (SELECT object_id FROM cf_par WHERE number_value BETWEEN 25 AND 30 AND attr_id IN (SELECT attr_id FROM cf_attr WHERE name='price')) ff

JOIN cf_par genre ON genre. object_id=ff. object_id

AND genre. attr_id= (SELECT attr_id FROM cf_attr WHERE name='genre')

JOIN cf_obj film ON film. object_id=ff. object_id

JOIN cf_par price ON price. object_id=ff. object_id

WHERE price. attr_id= (SELECT attr_id FROM cf_attr WHERE name='price')

Задание 8

Вывести список названий кинотеатров, их адрес, акустическую систему, формат экрана, число мест в которых показывают фильм «Метро»

SELECT cinema. name, address. text_value, acoustic. text_value, format. text_value, place. number_value

FROM (SELECT film. object_id FROM cf_obj film WHERE film. name LIKE 'Метро') f

JOIN cf_par rel ON rel. relation_id=f. object_id

JOIN cf_obj cinema ON cinema. object_id=rel. object_id

JOIN cf_par address ON address. object_id=cinema. object_id

AND address. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='address')

JOIN cf_par acoustic ON acoustic. object_id=cinema. object_id

AND acoustic. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='acoustic')

JOIN cf_par format ON format. object_id=cinema. object_id

AND format. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='format')

JOIN cf_par place ON place. object_id=cinema. object_id

AND place. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='place')

Задание 9

Вывести весь список фильмов находящихся в прокате и всю информацию по ним.

SELECT film. object_id, film. name, genre. text_value, duration. number_value, rait. number_value, price. number_value

FROM cf_obj film

JOIN cf_par genre ON genre. object_id=film. object_id

JOIN cf_par duration ON duration. object_id=film. object_id

JOIN cf_par rait ON rait. object_id=film. object_id

JOIN cf_par price ON price. object_id=film. object_id

WHERE film. object_type_id= (SELECT object_type_id FROM cf_types WHERE name='Film')

AND genre. attr_id IN (SELECT attr_id FROM cf_attr WHERE name=LOWER ('GENRE'))

AND duration. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='duration')

AND rait. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='rait')

AND price. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='price')

Выводы

В роботе создана база данных, которая хранит данные о фильмах и кинотеатрах. Для хранения данных использована метамодель. Данная модель упрощает создание, редактирование и удаление как конкретных записей, так и целых таблиц, при этом, не повредив структуры данных.

В ходе выполнения курсовой работы была так же разработана программа для конечных пользователей и посетителей кинотеатров. Используя строку запроса, они могут получить любую информацию по интересующему их фильму или кинотеатру, либо узнать в каком кинотеатре какие фильмы показывают, или наоборот. Это делает процесс работы с базой данных еще более проще и доступным для любого пользователя, даже того, который никогда не работал с базами данных.

Список литературы

1. Codd E.F. Relational completeness of data base sublanguages. — Ibid. 1972, p. 65−98.

2. А. Чекалов. Базы данных: от проектирования до разработки приложений — СПб.: БХВ-Петербург, 2003. — 384 с.

3. Ульман Дж. Основы систем баз данных /Пер. c англ. М. Р. Когаловского. — М.: Финансы и статистика, 1983. — 334 с.

4. Анатолий Тенцер. База данных — хранилище объектов — М.: «КомпьютерПресс», http: //www. compress. ru, 2001

Приложение

Код заполнения таблиц:

INSERT INTO cf_types VALUES (1,'Cinema','Cinema');

INSERT INTO cf_types VALUES (2,'Film','Film');

INSERT INTO cf_types VALUES (3,'ids','ids');

INSERT INTO cf_attr VALUES (1,1,'address');

INSERT INTO cf_attr VALUES (2,1,'place');

INSERT INTO cf_attr VALUES (3,1,'acoustic');

INSERT INTO cf_attr VALUES (4,1,'format');

INSERT INTO cf_attr VALUES (5,2,'genre');

INSERT INTO cf_attr VALUES (6,2,'duration');

INSERT INTO cf_attr VALUES (7,2,'rait');

INSERT INTO cf_attr VALUES (8,2,'price');

INSERT INTO cf_attr VALUES (9,3,'ids');

INSERT INTO cf_obj VALUES (11,1,'Метрополис 5D');

INSERT INTO cf_obj VALUES (12,1,'IMAX Блокбастер');

INSERT INTO cf_obj VALUES (13,1,'Алмаз');

INSERT INTO cf_obj VALUES (14,1,'Жовтень');

INSERT INTO cf_obj VALUES (15,1,'Кинопалац');

INSERT INTO cf_obj VALUES (16,1,'Украина');

INSERT INTO cf_obj VALUES (17,1,'Дружба');

INSERT INTO cf_obj VALUES (18,1,'Космос');

INSERT INTO cf_obj VALUES (21,2,'Альфа и Омега');

INSERT INTO cf_obj VALUES (22,2,'Бабл Дабл');

INSERT INTO cf_obj VALUES (23,2,'Бундишванские горки');

INSERT INTO cf_obj VALUES (24,2,'Бурлеск');

INSERT INTO cf_obj VALUES (25,2,'В плену у тьмы');

INSERT INTO cf_obj VALUES (26,2,'Выкрутасы');

INSERT INTO cf_obj VALUES (27,2,'Любовь-Морковь 3');

INSERT INTO cf_obj VALUES (28,2,'Меняющие реальность');

INSERT INTO cf_obj VALUES (29,2,'Мертвый дом');

INSERT INTO cf_obj VALUES (210,2,'Метро');

INSERT INTO cf_obj VALUES (211,2,'Настоящее мужество');

INSERT INTO cf_obj VALUES (212,2,'Небоскребки');

INSERT INTO cf_obj VALUES (213,2,'Орел девятого легиона');

INSERT INTO cf_obj VALUES (214,2,'Откуда ты знаешь');

INSERT INTO cf_obj VALUES (215,2,'Я — четвертый');

INSERT INTO cf_par VALUES (11,NULL, 1,'Малиновского 12', NULL);

INSERT INTO cf_par VALUES (12,NULL, 1,'Московский 34-В', NULL);

INSERT INTO cf_par VALUES (13,NULL, 1,'Миропольская 17А', NULL);

INSERT INTO cf_par VALUES (14,NULL, 1,'Константиновская 26', NULL);

INSERT INTO cf_par VALUES (15,NULL, 1,'Институтская 1', NULL);

INSERT INTO cf_par VALUES (16,NULL, 1,'Городецкого 5', NULL);

INSERT INTO cf_par VALUES (17,NULL, 1,'просп. Шевченко 20', NULL);

INSERT INTO cf_par VALUES (18,NULL, 1,'Октябрьская 12', NULL);

INSERT INTO cf_par VALUES (11,NULL, 2, NULL, 80);

INSERT INTO cf_par VALUES (12,NULL, 2, NULL, 278);

INSERT INTO cf_par VALUES (13,NULL, 2, NULL, 100);

INSERT INTO cf_par VALUES (14,NULL, 2, NULL, 100);

INSERT INTO cf_par VALUES (15,NULL, 2, NULL, 326);

INSERT INTO cf_par VALUES (16,NULL, 2, NULL, 250);

INSERT INTO cf_par VALUES (17,NULL, 2, NULL, 180);

INSERT INTO cf_par VALUES (18,NULL, 2, NULL, 165);

INSERT INTO cf_par VALUES (11,NULL, 3,'Dolby Digital', NULL);

INSERT INTO cf_par VALUES (12,NULL, 3,'Dolby Suround', NULL);

INSERT INTO cf_par VALUES (13,NULL, 3,'Dolby Suround', NULL);

INSERT INTO cf_par VALUES (14,NULL, 3,'Dolby Suround', NULL);

INSERT INTO cf_par VALUES (15,NULL, 3,'Dolby Suround', NULL);

INSERT INTO cf_par VALUES (16,NULL, 3,'Dolby Digital', NULL);

INSERT INTO cf_par VALUES (17,NULL, 3,'Dolby Suround', NULL);

INSERT INTO cf_par VALUES (18,NULL, 3,'Dolby Digital', NULL);

INSERT INTO cf_par VALUES (11,NULL, 4,'Широкоформатный 16: 9', NULL);

INSERT INTO cf_par VALUES (12,NULL, 4,'Широкоформатный 16: 9', NULL);

INSERT INTO cf_par VALUES (13,NULL, 4,'Пропорциональный 5: 4', NULL);

INSERT INTO cf_par VALUES (14,NULL, 4,'Широкоформатный 16: 9', NULL);

INSERT INTO cf_par VALUES (15,NULL, 4,'Широкоформатный 16: 9', NULL);

INSERT INTO cf_par VALUES (16,NULL, 4,'Пропорциональный 5: 4', NULL);

INSERT INTO cf_par VALUES (17,NULL, 4,'Широкоформатный 16: 9', NULL);

INSERT INTO cf_par VALUES (18,NULL, 4,'Пропорциональный 5: 4', NULL);

INSERT INTO cf_par VALUES (21,NULL, 5,'Мультфильм', NULL);

INSERT INTO cf_par VALUES (22,NULL, 5,'Приключения', NULL);

INSERT INTO cf_par VALUES (23,NULL, 5,'Приключения', NULL);

INSERT INTO cf_par VALUES (24,NULL, 5,'Драма', NULL);

INSERT INTO cf_par VALUES (25,NULL, 5,'Приключения', NULL);

INSERT INTO cf_par VALUES (26,NULL, 5,'Фантастика', NULL);

INSERT INTO cf_par VALUES (27,NULL, 5,'Комедия', NULL);

INSERT INTO cf_par VALUES (28,NULL, 5,'Комедия', NULL);

INSERT INTO cf_par VALUES (29,NULL, 5,'Ужасы', NULL);

INSERT INTO cf_par VALUES (210,NULL, 5,'Ужасы', NULL);

INSERT INTO cf_par VALUES (211,NULL, 5,'Драма', NULL);

INSERT INTO cf_par VALUES (212,NULL, 5,'Приключения', NULL);

INSERT INTO cf_par VALUES (213,NULL, 5,'Боевик', NULL);

INSERT INTO cf_par VALUES (214,NULL, 5,'Драма', NULL);

INSERT INTO cf_par VALUES (215,NULL, 5,'Боевик', NULL);

INSERT INTO cf_par VALUES (21,NULL, 6, NULL, 1. 37);

INSERT INTO cf_par VALUES (22,NULL, 6, NULL, 1. 42);

INSERT INTO cf_par VALUES (23,NULL, 6, NULL, 1. 35);

INSERT INTO cf_par VALUES (24,NULL, 6, NULL, 1. 35);

INSERT INTO cf_par VALUES (25,NULL, 6, NULL, 1. 51);

INSERT INTO cf_par VALUES (26,NULL, 6, NULL, 1. 28);

INSERT INTO cf_par VALUES (27,NULL, 6, NULL, 1. 51);

INSERT INTO cf_par VALUES (28,NULL, 6, NULL, 2. 12);

INSERT INTO cf_par VALUES (29,NULL, 6, NULL, 1. 32);

INSERT INTO cf_par VALUES (210,NULL, 6, NULL, 1. 24);

INSERT INTO cf_par VALUES (211,NULL, 6, NULL, 1. 42);

INSERT INTO cf_par VALUES (212,NULL, 6, NULL, 1. 27);

INSERT INTO cf_par VALUES (213,NULL, 6, NULL, 1. 45);

INSERT INTO cf_par VALUES (214,NULL, 6, NULL, 1. 22);

INSERT INTO cf_par VALUES (215,NULL, 6, NULL, 1. 36);

INSERT INTO cf_par VALUES (21,NULL, 7, NULL, 47);

INSERT INTO cf_par VALUES (22,NULL, 7, NULL, 67);

INSERT INTO cf_par VALUES (23,NULL, 7, NULL, 77);

INSERT INTO cf_par VALUES (24,NULL, 7, NULL, 51);

INSERT INTO cf_par VALUES (25,NULL, 7, NULL, 71);

INSERT INTO cf_par VALUES (26,NULL, 7, NULL, 74);

INSERT INTO cf_par VALUES (27,NULL, 7, NULL, 87);

INSERT INTO cf_par VALUES (28,NULL, 7, NULL, 88);

INSERT INTO cf_par VALUES (29,NULL, 7, NULL, 81);

INSERT INTO cf_par VALUES (210,NULL, 7, NULL, 83);

INSERT INTO cf_par VALUES (211,NULL, 7, NULL, 70);

INSERT INTO cf_par VALUES (212,NULL, 7, NULL, 68);

INSERT INTO cf_par VALUES (213,NULL, 7, NULL, 63);

INSERT INTO cf_par VALUES (214,NULL, 7, NULL, 68);

INSERT INTO cf_par VALUES (215,NULL, 7, NULL, 75);

INSERT INTO cf_par VALUES (21,NULL, 8, NULL, 25);

INSERT INTO cf_par VALUES (22,NULL, 8, NULL, 32. 5);

INSERT INTO cf_par VALUES (23,NULL, 8, NULL, 35);

INSERT INTO cf_par VALUES (24,NULL, 8, NULL, 28);

INSERT INTO cf_par VALUES (25,NULL, 8, NULL, 30. 75);

INSERT INTO cf_par VALUES (26,NULL, 8, NULL, 34);

INSERT INTO cf_par VALUES (27,NULL, 8, NULL, 35);

INSERT INTO cf_par VALUES (28,NULL, 8, NULL, 37. 3);

INSERT INTO cf_par VALUES (29,NULL, 8, NULL, 35);

INSERT INTO cf_par VALUES (210,NULL, 8, NULL, 35. 5);

INSERT INTO cf_par VALUES (211,NULL, 8, NULL, 33. 5);

INSERT INTO cf_par VALUES (212,NULL, 8, NULL, 30);

INSERT INTO cf_par VALUES (213,NULL, 8, NULL, 31. 65);

INSERT INTO cf_par VALUES (214,NULL, 8, NULL, 27);

INSERT INTO cf_par VALUES (215,NULL, 8, NULL, 29);

INSERT INTO cf_par VALUES (11,23,9,NULL, NULL);

INSERT INTO cf_par VALUES (11,25,9,NULL, NULL);

INSERT INTO cf_par VALUES (11,28,9,NULL, NULL);

INSERT INTO cf_par VALUES (11,211,9,NULL, NULL);

INSERT INTO cf_par VALUES (12,211,9,NULL, NULL);

INSERT INTO cf_par VALUES (12,21,9,NULL, NULL);

INSERT INTO cf_par VALUES (12,24,9,NULL, NULL);

INSERT INTO cf_par VALUES (13,21,9,NULL, NULL);

INSERT INTO cf_par VALUES (13,22,9,NULL, NULL);

INSERT INTO cf_par VALUES (13,23,9,NULL, NULL);

INSERT INTO cf_par VALUES (13,24,9,NULL, NULL);

INSERT INTO cf_par VALUES (14,22,9,NULL, NULL);

INSERT INTO cf_par VALUES (14,24,9,NULL, NULL);

INSERT INTO cf_par VALUES (14,25,9,NULL, NULL);

INSERT INTO cf_par VALUES (14,29,9,NULL, NULL);

INSERT INTO cf_par VALUES (14,211,9,NULL, NULL);

INSERT INTO cf_par VALUES (14,212,9,NULL, NULL);

INSERT INTO cf_par VALUES (15,212,9,NULL, NULL);

INSERT INTO cf_par VALUES (15,215,9,NULL, NULL);

INSERT INTO cf_par VALUES (15,213,9,NULL, NULL);

INSERT INTO cf_par VALUES (15,27,9,NULL, NULL);

INSERT INTO cf_par VALUES (16,23,9,NULL, NULL);

INSERT INTO cf_par VALUES (16,25,9,NULL, NULL);

INSERT INTO cf_par VALUES (16,215,9,NULL, NULL);

INSERT INTO cf_par VALUES (16,214,9,NULL, NULL);

INSERT INTO cf_par VALUES (16,210,9,NULL, NULL);

INSERT INTO cf_par VALUES (17,27,9,NULL, NULL);

INSERT INTO cf_par VALUES (17,21,9,NULL, NULL);

INSERT INTO cf_par VALUES (17,24,9,NULL, NULL);

INSERT INTO cf_par VALUES (17,29,9,NULL, NULL);

INSERT INTO cf_par VALUES (17,211,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,21,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,23,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,26,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,27,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,29,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,210,9,NULL, NULL);

INSERT INTO cf_par VALUES (18,214,9,NULL, NULL);

Код программной реализации:

// Обработчик кнопки «Запрос» и двух радио-кнопок

void CcifiDlg: OnBnClickedRadio1 ()

{

bFilm=false;

bCinema=true;

// TODO: Add your control notification handler code here

}

void CcifiDlg: OnBnClickedRadio2 ()

{

bCinema=false;

bFilm=true;

// TODO: Add your control notification handler code here

}

void CcifiDlg: OnBnClickedButton1 ()

{

m_list. ResetContent ();

if (! bFilm & &! bCinema)

{

AfxMessageBox («Вы не указали что искать!»);

return;

}

CString s;

e_get. GetWindowTextA (s);

if (s=="")

{

AfxMessageBox («Пустая строка запроса!»);

return;

}

CDB db;

db. Open («localhost», FALSE, FALSE,"DRIVER={Oracle in XE}; UID=SYSTEM; PWD=1; SERVER=127.0.0. 1″);

BOOL check=db. IsOpen ();

if (! check)

{

AfxMessageBox («Не удается установить соединение с БД!»);

return;

}

e_get. GetWindowTextA (m_get);

CRecordset rec (& db);

if (bCinema)

{

m_check=1;

m_list. AddString («Список фильмов кинотеатра «+m_get+»: «);

rec. Open (CRecordset: forwardOnly,"SELECT obj. name FROM cf_obj obj JOIN cf_par rel ON rel. relation_id=obj. object_id AND rel. attr_id IN (SELECT attr_id FROM cf_attr WHERE name='ids') WHERE rel. object_id IN (SELECT object_id FROM cf_obj WHERE name='"+m_get+"')", CRecordset: readOnly);

while (! rec. IsEOF ())

{

rec. GetFieldValue (short (0), s);

m_list. AddString (s);

rec. MoveNext ();

}

}

if (bFilm)

{

m_check=2;

m_list. AddString («Список кинотеатров где показывают «+m_get+»: «);

rec. Open (CRecordset: forwardOnly,"SELECT cinema. name FROM (SELECT film. object_id FROM cf_obj film WHERE film. name LIKE '"+m_get+"') f JOIN cf_par par ON par. relation_id=f. object_id JOIN cf_obj cinema ON cinema. object_id=par. object_id", CRecordset: readOnly);

while (! rec. IsEOF ())

{

rec. GetFieldValue (short (0), s);

m_list. AddString (s);

rec. MoveNext ();

}

}

// TODO: Add your control notification handler code here

}

// Обработчики текстовых полей, реагирующих на нажатие Левой Кнопки Мыши.

void CcifiDlg: OnLbnSelchangeList1 ()

{

m_list. GetText (m_list. GetCurSel (), m_get);

if (m_list. GetCurSel () ==0)

{

return;

}

if (m_check==1)

{

CDlgFilm cFilm;

cFilm. m_get=m_get;

int result=cFilm. DoModal ();

if (result==IDOK)

{

return;

}

}

if (m_check==2)

{

CDlgCinema cCinema;

cCinema. m_get=m_get;

int result=cCinema. DoModal ();

if (result==IDOK)

{

return;

}

}

// TODO: Add your control notification handler code here

}

void CcifiDlg: OnBnClickedButton2 ()

{

CCfList cf;

int result=cf. DoModal ();

if (result==IDOK)

{

m_FromList=cf. m_FromList;

e_get. SetWindowTextA (m_FromList);

return;

}

// TODO: Add your control notification handler code here

}

// Обработчик кнопки «Список»

void CcifiDlg: OnBnClickedButton2 ()

{

CCfList cf;

int result=cf. DoModal ();

if (result==IDOK)

{

m_FromList=cf. m_FromList;

e_get. SetWindowTextA (m_FromList);

return;

}

// TODO: Add your control notification handler code here

}

// Функция инициализации диалогового окна «Информация по фильму»

BOOL CDlgFilm: OnInitDialog (void)

{

CDialog: OnInitDialog ();

CString s;

CDB db;

db. Open («localhost», FALSE, FALSE,"DRIVER={Oracle in XE}; UID=SYSTEM; PWD=1; SERVER=localhost");

BOOL check=db. IsOpen ();

CRecordset rec (& db);

rec. Open (CRecordset: forwardOnly,"SELECT film. name, genre. text_value, duration. number_value, rait. number_value, price. number_value FROM cf_obj film JOIN cf_par genre ON genre. object_id=film. object_id AND genre. attr_id=5 JOIN cf_par duration ON duration. object_id=film. object_id AND duration. attr_id=6 JOIN cf_par rait ON rait. object_id=film. object_id AND rait. attr_id=7JOIN cf_par price ON price. object_id=film. object_id AND price. attr_id=8 AND film. name='"+m_get+"'", CRecordset: readOnly);

while (! rec. IsEOF ())

{

rec. GetFieldValue (short (0), s);

m_fname. SetWindowTextA (s);

rec. GetFieldValue (short (1), s);

m_genre. SetWindowTextA (s);

rec. GetFieldValue (short (2), s);

m_duration. SetWindowTextA (s);

rec. GetFieldValue (short (3), s);

m_rait. SetWindowTextA (s);

rec. GetFieldValue (short (4), s);

m_price. SetWindowTextA (s);

rec. MoveNext ();

}

rec. Close ();

return TRUE;

}

// Функция инициализации диалогового окна «Информация о Кинотеатре»

BOOL CDlgCinema: OnInitDialog (void)

{

CDialog: OnInitDialog ();

CString s;

CDB db;

db. Open («localhost», FALSE, FALSE,"DRIVER={Oracle in XE}; UID=SYSTEM; PWD=1; SERVER=localhost");

BOOL check=db. IsOpen ();

CRecordset rec (& db);

rec. Open (CRecordset: forwardOnly,"SELECT c. name, a. text_value, p. number_value, ac. text_value, f. text_value FROM cf_obj c JOIN cf_par a ON a. object_id=c. object_id AND a. attr_id=1 JOIN cf_par p ON p. object_id=c. object_id AND p. attr_id=2 JOIN cf_par ac ON ac. object_id=c. object_id AND ac. attr_id=3 JOIN cf_par f ON f. object_id=c. object_id AND f. attr_id=4 AND c. name='"+m_get+"'", CRecordset: readOnly);

while (! rec. IsEOF ())

{

rec. GetFieldValue (short (0), s);

m_cname. SetWindowTextA (s);

rec. GetFieldValue (short (1), s);

m_address. SetWindowTextA (s);

rec. GetFieldValue (short (2), s);

m_place. SetWindowTextA (s);

rec. GetFieldValue (short (3), s);

m_acoustic. SetWindowTextA (s);

rec. GetFieldValue (short (4), s);

m_format. SetWindowTextA (s);

rec. MoveNext ();

}

rec. Close ();

return TRUE;

}

// Функция инициализации диалогового окна «Список» с обработчиками функций списковых текстовых полей

BOOL CCfList: OnInitDialog (void)

{

CDialog: OnInitDialog ();

CString s;

CDB db;

db. Open («localhost», FALSE, FALSE,"DRIVER={Oracle in XE}; UID=SYSTEM; PWD=1; SERVER=localhost");

BOOL check=db. IsOpen ();

CRecordset rec (& db);

rec. Open (CRecordset: forwardOnly,"SELECT name FROM cf_obj WHERE object_type_id=1″, CRecordset: readOnly);

while (! rec. IsEOF ())

{

rec. GetFieldValue (short (0), s);

m_cinema. AddString (s);

rec. MoveNext ();

}

rec. Close ();

rec. Open (CRecordset: forwardOnly,"SELECT name FROM cf_obj WHERE object_type_id=2″, CRecordset: readOnly);

while (! rec. IsEOF ())

{

rec. GetFieldValue (short (0), s);

m_film. AddString (s);

rec. MoveNext ();

}

rec. Close ();

return TRUE;

}

void CCfList: OnLbnSelchangeList2 ()

{

m_film. GetText (m_film. GetCurSel (), m_FromList);

OnOK ();

// TODO: Add your control notification handler code here

}

void CCfList: OnLbnSelchangeList1 ()

{

m_cinema. GetText (m_cinema. GetCurSel (), m_FromList);

OnOK ();

// TODO: Add your control notification handler code here

}

Результат работы программы:

Рисунок 1 — Главное меню программы

Рисунок 2 — Меню списка кинотеатров и фильмов в прокате

Рисунок 3 — Запрос по кинотеатру «Космос»

Рисунок 4 — Вывод информации по выбранному фильму

Рисунок 5 — Вывод информации по выбранному кинотеатру

ПоказатьСвернуть
Заполнить форму текущей работой