Министерство образования и науки РФ

Федеральное агентство по образованию

Новосибирский Государственный Технический Университет

Расчетно-графическая работа

по дисциплине “Базы данных”

Вариант: 48

Факультет: АВТ Преподаватель:

Группа: АП-118

Студент:

Новосибирск, 2004г.

Оглавление

Задание - 3 -

Описание программы в целом - 4 -

Интерфейс пользова

Описание работы меню - 5 -

Работа с формой запросов - 5 -

Работа с формой редактирования - 7 -

Графическое представление работы меню - 7 -

Графическое представление связей между файлами - 8 -

Файлы Базы Данных - 9 -

Таблица battles - 9 -

Таблица battles_ships - 9 -

Таблица classess - 9 -

Таблица ships - 9 -

Структура файлов баз данных - 10 -

Таблица battles - 10 -

place – место сражения - 10 -

Таблица battles_ships - 10 -

damage – вид повреждения - 10 -

Таблица classess - 10 -

Таблица countries - 10 -

Таблица ships - 10 -

Текст программы - 11 -

Пример работы программы - 17 -

Выводы - 18 -

Литература - 19 -


Задание

Основная база данных «Морская волна». Сформировать несколько баз данных. Предусмотреть меню, печать на экран, ввод данных, редактирование, просмотр данных.

Реализовать с использованием нескольких баз данных следующие типы запросов.

для каждого морского сражения указать сведения о нем (страны-участники, дата, место). найти наименования стран, корабли которых принимали участие в указанном сражении. Вывести наименования стран понесших наибольшие потери из-за того, что их корабли были повреждены или потоплены. найти наименования и значения водоизмещения для тех кораблей, которые принимали участие в заданном сражении. найти все корабли, которые получив повреждение в одном сражении, в последствии участвовали в других найти названия сражений, в которых участвовало не менее трех кораблей одной страны найти названия кораблей (? Ошибка видимо – должно быть сражения) в которых принимали участие корабли заданного класса (выбор класса). найти для каждого класса корабля значение даты спуска на воду первого корабля этого класса. найти для каждого класса количество кораблей этого класса, потопленных в морских сражениях. найти для каждого класса, насчитывающего не менее 3х судов, количество кораблей этого класса, потопленных в морских сражениях. найти информацию о количестве орудий и водоизмещении всех линкоров (выбор) заданной страны (выбор или ввод), построенных до 1930 года (выбор или ввод даты). найти названия сражений, в которых были потоплены суда не менее двух стран. сформировать список названий судов водоизмещением ниже 30тыс. тонн (ввод числа), упорядоченный по возростанию значения года спуска судов на воду, а для судов-одногодков – в алфавитном поряде следования их названий. для каждой группы значений калибра главных орудий найти минимальное значение года выпуска судов, относящихся к этой группе. найти для каждого класса, по меньшей мере одно из судов которого было спущено на воду до 1930 года, количество кораблей этого класса, потопленных в морских сражениях. найти сражения, в каждом из которых принимал участие по меньшей мере один корабль заданной страны (ввод названия страны) и было потоплено не менее двух кораблей.

Описание программы в целом

Данная программа представляет собой набор средств для работы с базой данных "морская волна". Базу данных составляют пять взаимосвязанных таблиц: сражения (battles), сражения-корабли (battles_ships), классы кораблей (classess), страны (countries), корабли (ships). Программа позволяет пользователю осуществлять просмотр, редактирование, добавление, удаление и поиск записей в базе данных при помощи специальных форм.

НЕ нашли? Не то? Что вы ищете?

Также в программе предусмотрено выполнение пятнадцати видов запросов (см. задание).

Интерфейс пользователя

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

При запуске программы на экране появляется форма (form_main) и меню(menu1), прикрепленное к ней (рис. 1), через которые доступны все функции данной программы.

Рис.1. Главная форма

На главной форме создан Pageframe с вкладками страниц запросов, пронумерован в соответствии с номером в списке заданий. Главная форма содержит CommandButton’ы просмотра всех стран, всех сражений и всех корбалей. Форма редактирования данных о кораблях представлена на рисунке №2.

Описание работы меню

Структура меню приложения показана на рисунке 3.

Рис. 3 Структура меню приложения.

При помощи пункта меню “File” можно вызывать выйти из программы.

Также в меню включен пункт вызова справки “Help”, который вызывает форму About.

В главное меню включены пункты меню двух типов: Submenu и Command.

Руководство пользователя

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

Работа с формой запросов

Все запросы в форме выполнены по "шаблону” - каждый запрос имеет примерно одинаковый вид. Это заголовок, в котором описаны основные моменты данного запроса, поля для выбора и ввода данных (combo box, text box, spinner и проч.), а также кнопка управления (command button) для вызова данного запроса. Рассмотрим выполнение программы на одном из запросов:

Рис. 4 Запрос – найти информацию о количестве орудий и водоизмещении всех линкоров (выбор) заданной страны (выбор или ввод), построенных до 1930 года (выбор или ввод даты)

Итак, данный запрос содержит 3 поля для ввода информации – это класс судна, страна и дата спуска. Введем, к примеру, Малые корабли, Франция, 1942 год и нажмем на кнопку «Вывести»:

Рис. 5 Вызов запроса

Получим следующий результат запроса:

Рис. 6. Результат запроса

Как мы можем посмотреть в базе данных или, используя реализованные в работе средства редактирования, выведенный результат действительно соответствует запросу. Введенная дата означает, что будут выбраны корабли, дата спуска на воду которых меньше, чем введенная дата. А выбранная страна и выбранный вид (класс) судна должен соответствовать полностью. Результатом запроса является названия судна, водоизмещение и калибр главного орудия.

Работа с формой редактирования

Для работы с таблицами используется стартовая форма программы. В ней имеется возможность выбора редактируемых объектов – кораблей, стран или сражений. Например, для редактирования формы кораблей, используется следующая:

Редактируя соответствующие поля, мы можем изменить все данные корабля. Названия, водоизмещение, дата спуска судна, количество орудий и калибр главного орудия меняются в полях для ввода. Страна и класс судна выбираются из существующих, уже созданных данных.

Также в этой форме, осуществляется переход по записям в самое начало и в конец списка.

Организован просмотр данных всех кораблей в одной таблице.

Рис. 7, а. Редактирование таблицы. Рис. 7, б. Редактирование таблицы.(режим просмотра всей таблицы)

Графическое представление работы меню


Рис. 8. Меню File->Edit/Exit

Рис. 9. Меню Help->About


Графическое представление связей между файлами

Рис. 10. Структура таблиц базы данных

Структура всех данных в программе следующая:

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

Аналогичным образом создана перекрестная связь с классами кораблей и странами – в таблице ships хранятся идентификационные номера стран и классов. Эти номера служат уникальными номерами записями в таблицах countries и classess соответственно.

Таблица ships также содержит информацию о водоизмещении корабля, дате спуска, количестве орудий и калибре главного орудия.

Рис. 11. Структура таблицы battles_ships

Файлы Базы Данных

Таблица battles

Таблица battles_ships

Таблица classess

Таблица countries

Таблица ships


Структура файлов баз данных

Таблица battles

id – идентификационный номер

dateof – дата сражения

place – место сражения

Таблица battles_ships

battle_id – идентификационный номер сражения

ship_id – идентификационный номер корабля

damage – вид повреждения

Таблица classess

id – идентификационный номер

name – название вида корабля

Таблица countries

id – идентификационный номер

name – название вида страны

Таблица ships

id – идентификационный номер корабля

name – название корабля

country_id – идентификационный номер страны

volume – водоизмещение корабля

class_id – идентификационный номер класса корабля

dateof – дата спуска корабля

weapons_number – количество орудий

calibr – калибр главного орудия

Текст программы

1.  Для каждого морского сражения указать сведения о нем (страны-участники, дата, место).

select s. name, c. name as страна, cl. name as класс_судна, s. volume, s. dateof, s. calibr ;

from ships s, countries c, classess cl ;

where s. class_id = cl. id and s. country_id = c. id

2.  Найти наименования стран, корабли которых принимали участие в указанном сражении. Вывести наименования стран понесших наибольшие потери из-за того, что их корабли были повреждены или потоплены.

select countries. name as название_страны, ships. name;

from ;

ships, battles_ships, countries ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. battle_id = ThisForm. List1.value ;

and countries. id = ships. country_id ;

Наибольшие потери

select count(battles_ships. damage) as потери, countries. name as страны ;

from ;

ships, battles_ships, countries ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. battle_id = ThisForm. List1.value ;

and countries. id = ships. country_id ;

and ( battles_ships. damage=="ранен" or battles_ships. damage=="убит" ) ;

group by countries. name ;

into cursor qw

select * from qw where потери = (select max(потери) from qw )

3.  Найти наименования и значения водоизмещения для тех кораблей, которые принимали участие в заданном сражении.

select ships. name as название_корабля, ships. volume;

from ;

ships, battles_ships ;

where ;

battles_ships. ship_id=ships. id and battles_ships. battle_id=ThisForm. List1.value ;

order by ships. volume DESC

4.  найти все корабли, которые, получив повреждение в одном сражении, в последствии участвовали в других

select battle_id as битва, ship_id as корабль ;

from battles_ships ;

where ;

damage=="ранен" ;

into cursor temp

select distinct ships. id, ships. name ;

from ;

ships, battles_ships, temp ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. ship_id == temp. корабль ;

and battles_ships. battle_id <> temp. битва

5.  найти названия сражений, в которых участвовало не менее трех кораблей одной страны

select battles. place, countries. name, count(battles_ships. ship_id) AS потери ;

from ;

ships, battles_ships, battles, countries ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. battle_id=battles. id ;

and countries. id = ships. country_id;

group by countries. id, battles. id ;

having count(battles_ships. ship_id)>=3

6.  найти названия кораблей (?сражения) в которых принимали участие корабли заданного класса (выбор класса).

select distinct battles. place as название_сражения ;

from ;

ships, battles_ships, battles ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. battle_id=battles. id ;

and ships. class_id = classess. id ;

and classess. name=ThisForm. List1.value

7.  найти для каждого класса корабля значение даты спуска на воду первого корабля этого класса.

select classess. name as название_класса, min(ships. dateof) as дата_спуска;

from ;

ships, battles_ships, classess;

where ;

battles_ships. ship_id=ships. id ;

and ships. class_id = classess. id ;

group by classess. name

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

select distinct classess. name as название_сражения, count(ships. id) as потери ;

from ;

ships, battles_ships, battles, classess ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. battle_id=battles. id ;

and ships. class_id = classess. id ;

and battles_ships. damage == "убит";

group by classess. name

9.  найти для каждого класса, насчитывающего не менее 3х судов, количество кораблей этого класса, потопленных в морских сражениях.

select classess. name as название_класса, count(ships. id) as потери;

from ;

ships, battles_ships, classess;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. damage == "убит";

and ships. class_id = classess. id ;

and ships. class_id in ;

(;

select ships. class_id from ships ;

group by ships. class_id ;

having count(ships. class_id)>=3 ;

);

group by classess. name ;

10.  найти информацию о количестве орудий и водоизмещении всех линкоров (выбор) заданной страны (выбор или ввод), построенных до 1930 года (выбор или ввод даты).

select ships. name, ships. volume, ships. calibr;

from ;

ships, countries, classess ;

where ;

ships. class_id=classess. id and ships. country_id = countries. id ;

and classess. name=bo1.value ;

and countries. name = bo2.value ;

and year(ships. dateof) <= ThisForm. Spinner1.value ;

11.  найти названия сражений, в которых были потоплены суда не менее двух стран.

select battles. place, count(ships. country_id) as страны ;

from ;

ships, battles_ships, battles, countries ;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. battle_id = battles. id ;

and countries. id = ships. country_id;

and battles_ships. damage == "убит" ;

group by battles. place ;

having count(ships. country_id)=>2 ;

12.  сформировать список названий судов водоизмещением ниже 30тыс. тонн (ввод числа), упорядоченный по возростанию значения года спуска судов на воду, а для судов-одногодков – в алфавитном поряде следования их названий.

select name as название_корабля, volume, year(dateof) yearof;

from ;

ships ;

where ;

volume<=ThisForm. Text1.value;

order by yearof ASC, name ASC

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

select calibr, MIN(year(dateof)) ;

from ;

ships ;

group by calibr

14.  найти для каждого класса, по меньшей мере одно из судов которого было спущено на воду до 1930 года, количество кораблей этого класса, потопленных в морских сражениях.

select classess. name as название_класса, count(ships. id) as потери;

from ;

ships, battles_ships, classess;

where ;

battles_ships. ship_id=ships. id ;

and battles_ships. damage == "убит";

and ships. class_id = classess. id ;

and ships. class_id in ( ;

select class_id from ships where year(dateof) <= ThisForm. Spinner1.value;

) group by classess. name ;

15.  найти сражения, в каждом из которых принимал участие по меньшей мере один корабль заданной страны (ввод названия страны) и было потоплено не менее двух кораблей.

select distinct battles. place as сражение ;

from ;

battles, battles_ships, countries, ships ;

where ;

battles_ships. battle_id=battles. id ;

and battles_ships. ship_id= ships. id ;

and ships. country_id = countries. id ;

and countries. name=ThisForm. Text1.value ;

and battles_ships. battle_id in ;

( ;

select battle_id ;

from ;

battles_ships ;

where ;

damage=="убит" ;

group by battle_id ;

having count(ship_id)>=2 ;

) order by battles. place DESC

Пример работы программы



Выводы

В ходе выполнения расчетно-графической работы были закреплены (и приобретены новые) навыки работы в среде Microsoft Visual FoxPro 6. Получен опыт в рациональном проектировании и реализации баз данных, работы используя язык SQL, а также опыт в разработке средств управления базами данных.

Получен опыт работы с элементами управления, меню, использовании стандартных средств для работы с данными MS Visual FoxPro.

Литература

1.  Электронный учебник "Программирование в среде Visual FoxPro™". С. Федоров, НГТУ, АВТФ, 2003г.

2.  MSDN Library & Technical Resources. http://msdn.

3.  Справка Microsoft Visual FoxPro6.