Министерство образования и культуры
Российской Федерации
НГТУ
Расчетно-графическая работа
по дисциплине
«Системы управления базами данных»
Вариант 16
База данных «ИГРУШКИ»
Выполнила:
студентка гр. АМ-110
факультета АВТФ
Преподаватель:
Новосибирск, 2004
Задание
Основная база данных “Игрушки”. Предусмотреть: меню, печать на экран, ввод данных, редактирование, просмотр данных. Реализовать следующие типы запросов:
n Для каждого вида игрушек указать сведения о нем (наименование, дату выпуска, поставщик, цена, вес, для какого возраста предназначена, дата продажи и т. п.).
n Для каждого вида игрушек выдать список, отсортированный:
n по дате выпуска,
n в алфавитном порядке по поставщику,
n по весу,
n по стоимости,
n по дате продажи.
n Найти самый дорогой вид игрушек, самый дешевый, среднюю стоимость по каждому виду и в целом.
n Найти игрушки с ценой в заданных пределах (предусмотреть ввод цены с клавиатуры) по каждому виду и в целом.
n Найти все игрушки заданного производителя (выбор).
n Найти долю дешевых игрушек (меньше заданного, ввод ограничения) от общего числа игрушек (для каждого возраста (ввод) и в целом).
n Найти все игрушки с заданной датой выпуска (ввод даты).
n Найти все игрушки, чей вес находится в заданных пределах (ввод интервала) для заданного производителя (выбор) и в целом.
n Найти долю игрушек, проданных за определенный период (ввод периода) от общего времени продажи.
n Найти самый популярный вид игрушки (продано наибольшее количество) для заданного возраста (ввод) и в целом.
n Найти все игрушки, поступившие от заданного поставщика, чья стоимость больше, чем стоимость заданной игрушки (ввод наименования), поступившей из заданной страны (ввод наименования страны).
n Найти долю дешевых игрушек (чья стоимость меньше заданной, ввод стоимости), поступивших от заданного поставщика и в целом.
n Найти среднюю стоимость игрушек, проданных за определенный промежуток времени (ввод интервала).
n Найти все игрушки, чья стоимость выше, чем средняя стоимость игрушек заданного производителя.
n Найти игрушку, которую лучше всего раскупают, указать параметры (стоимость, производитель, возраст и т. д.).
Описание программы в целом
Данная РГР программа выполнена на основе меню. Это облегчает работу с базой данных, так как все основные команды просмотра, сортировки базы данных, а также реализация запросов выполняются прямо из команд меню. Ввод и редактирование данных выполняется в формах либо самих таблицах.
Основой программы является база данных «Игрушки». Она состоит из трех таблиц, в которых содержатся необходимые данные об основных характеристиках товара магазина игрушек.
3. Интерфейс пользователя
Данная РГР программа выполнена на основе меню. Это облегчает работу с базой данных, так как все основные команды просмотра, сортировки базы данных, а также реализация запросов выполняются прямо из команд меню. Ввод и редактирование данных выполняется в формах либо самих таблицах.

Рис. 1. Внешний вид меню пользователя.
На Рис.1 приведено меню, которое появляется сразу после запуска программы.
4. Описание работы меню
1) Первый пункт называется «Редактирование» и позволяет вызывать формы для просмотра, сортировки, редактирования и удаления данных либо таблицы.

Рис.2 Подменю пункта «Редактирование»
2) Второй пункт называется «Запросы». Он позволяет осуществлять различные запросы в базе данных в соответствии с различными критериями.

Рис.3 Подменю пункта «Запросы»
3) Третий пункт меню «Просмотр» предназначен для просмотра таблиц базы с занесенными данными.
Рис.3 Подменю пункта «Просмотр»
3) Последний пункт меню Exit(Выход) осуществляет закрытие меню при помощи команды set sysmenu to default.
5. Руководство пользователя
Основной методикой при работе с программой является использование команд меню и наблюдение за результатами работы той или иной команды при вводе тех или иных данных. Подробное описание пунктов меню и работа с ним приведены в соответствующем пункте отчёта. Для того, чтобы вызвать меню, нужно в оболочке Visual FoxPro 6.0 (или любой другой с номером версии выше 6.0) в меню “Program” выбрать пункт “Do”, после чего указать путь к файлу menu. mpr и нажать кнопку «Do». Второй способ запуска меню: в менеджере проекта выбрать вкладку «Other», далее на которой выбрать меню «menu» и нажать кнопку Run(Выполнить). Стандартное меню Visual FoxPro заменится меню данной программы. Теперь можно выбирать команды меню и осуществлять необходимые действия.
6. Графическое представление работы меню
При выборе пункта «Игрушки» появится форма, представленная на Рис.4.
Рис. 4. Форма для просмотра игрушек.
При выборе пункта «Поставщики» появится форма, представленная на Рис.5.

Рис. 5. Форма для просмотра поставщиков
При выборе пункта «Тип» появится форма, представленная на Рис.5.
Рис. 5. Форма для просмотра видов
При выборе пункта «Сортировка» появится форма, представленная на Рис.7.
Рис. 7. Форма для сортировки товаров
Рис. 7. Поиск самого дорого вида игрушек, дешевого, среднюю стоимость.
Рис. 7. Поиск игрушек с ценой в заданных пределах.
Рис. 7. Игрушки заданного производителя.
Рис. 7. Доля дешевых игрушек.
Рис. 7. Игрушки с заданной датой выпуска.
Рис. 7. Игрушки с заданным весом для заданного производителя.

Рис. 7. Доля игрушек , проданных за определенный промежуток времени.

Рис. 7. Самый популярный вид игрушек для заданного возраста.

Рис. 7. Игрушки, поступившие от заданного поставщика, чья стоимость больше стоимости другой выбранной игрушки.

Рис. 7. Доля дешевых игрушек, поступивших от заданного поставщика.

Рис. 7. Средняя стоимость игрушек, проданных за определенны период.
Рис. 7. Игрушки со стоимостью выше чем средняя стоимость игрушек заданного производителя.
7. Графическое представление связей между файлами

Рис.3 Связи в БД
8. Файлы базы данных
Рис. 20. Таблица «Igrushki» базы данных
Рис. 21. Таблица «Postavshik» базы даных.
.
Рис. 21. Таблица «Tip» базы данных.
9. Структуры файлов баз данных
Для решения задачи в среде Visual FoxPro 6.0 были созданы следующие таблицы:
Таблица «Игрушки», внутренне имя – igrushki. dbf
Поле | Тип поля | Описание |
Id | Integer(4) | Уникальный идентификатор |
Nazvanie | Character(25) | Наименование игрушки |
Tip | Integer(4) (Regular ) | Идентификатор типа игрушки |
Postavshik | Integer(4) (Regular ) | Идентификатор поставщика |
Data_prodagi | Date(8) | Дата продажи |
Data_vipuska | Date(8) | Дата выпуска |
Ves | Numeric(5,2) | Вес |
Koll_prod | Numeric(2,0) | Количество проданных игрушек |
Stoimost | Float(5,1) | Цена |
Age_low | Integer(4) | Нижняя граница возраста |
Age_high | Integer(4) | Верхняя граница возраста |
Таблица «Типы», внутреннее имя – tip. dbf
Поле | Тип поля | Описание |
Id | Integer(4) (primary) | Уникальный идентификатор |
Avg_cost | Float(5,3) | Средняя стоимость по каждому типу |
Name_tip | Character(25) | Имя типа |
Таблица «Поставщики», внутренне имя – postavshik. dbf
Поле | Тип поля | Описание |
Id | Integer(4) (primary) | Уникальный идентификатор |
Name_postavshik | Character(25) | Имя поставщика |
10. Тексты программ
Все запросы выполнены с помощью языка запросов SQL (Structured Query Language).
Сортировка по дате выпуска:
select DISTINCT igrushki. nazvanie as Название,;
igrushki. data_vipuska as Дата_выпуска;
from igrushki;
full join tip on igrushki. tip=tip. id;
full join postavshik on igrushki. postavshik=postavshik. id;
where tip. name_tip=bo1.Value;
order by igrushki. data_vipuska
Сортировка по поставщику:
select DISTINCT igrushki. nazvanie as Название,;
postavshik. name_postavshik as Поставщик;
from prodagi;
full join igrushki on prodagi. id=igrushki. id;
full join tip on igrushki. tip=tip. id;
full join postavshik on igrushki. postavshik=postavshik. id;
where tip. name_tip=bo1.Value;
order by postavshik. name_postavshik;
Сортировка по весу:
select DISTINCT igrushki. nazvanie as Название, igrushki. ves as Вес;
from igrushki;
full join tip on igrushki. tip=tip. id;
full join postavshik on igrushki. postavshik=postavshik. id;
where tip. name_tip=bo1.Value;
group by igrushki. nazvanie;
order by igrushki. ves;
Сортировка по стоимости:
select DISTINCT igrushki. nazvanie as Название, max(igrushki. stoimost) as Цена;
from igrushki;
full join tip on igrushki. tip=tip. id;
full join postavshik on igrushki. postavshik=postavshik. id;
where tip. name_tip=bo1.Value;
group by igrushki. nazvanie;
order by igrushki. stoimost
Сортировка по дате продажи:
select DISTINCT igrushki. nazvanie as Название,;
igrushki. data_prodagi as Дата_продажи;
from igrushki;
full join tip on igrushki. tip=tip. id;
where tip. name_tip=bo1.Value;
order by igrushki. data_prodagi;
Самый дорогой вид игрушек
LOCAL cntpost(5)
LOCAL temp
use igrushki in 2
use tip in 1
select 1
do while (!EOF())
temp=tip. id
cntpost=0
select 2
SELECT avg(igrushki. stoimost);
FROM my! igrushki;
WHERE igrushki. tip=temp;
INTO ARRAY cntpost
Update tip;
Set avg_cost=cntpost;
Where tip. id=temp
select 1
skip 1
enddo
close databases
SELECT tip. name_tip as Тип_товара, tip. avg_cost as MAX_средняя_стоимость;
FROM my! tip;
WHERE tip. avg_cost == (select max(tip. avg_cost) FROM my! tip)
Самый дешевый вид игрушек:
LOCAL cntpost(5)
LOCAL temp
use igrushki in 2
use tip in 1
select 1
do while (!EOF())
temp=tip. id
cntpost=0
select 2
SELECT avg(igrushki. stoimost);
FROM my! igrushki;
WHERE igrushki. tip=temp;
INTO ARRAY cntpost
Update tip;
Set avg_cost=cntpost;
Where tip. id=temp
select 1
skip 1
enddo
close databases
SELECT tip. name_tip as Тип_товара, tip. avg_cost as MIN_средняя_стоимость;
FROM my! tip;
WHERE tip. avg_cost == (select min(tip. avg_cost) FROM my! tip)
Средняя стоимость(в целом):
select avg(igruhki. stoimost) as Средняя_стоимость from igruhki;
Средняя стоимость по типу «Куклы»:
select avg(igrushki. stoimost) as Средняя_стоимость_по_куклам;
from igrushki;
where tip=1
Средняя стоимость по типу «Машинки»:
select avg(igrushki. stoimost) as Средняя_стоимость_по_машинкам;
from igrushki;
where tip=2
Средняя стоимость по типу «Погремушки»:
select avg(igrushki. stoimost) as Средняя_стоимость_по_погремушкам;
from igrushki;
where tip=3
Средняя стоимость по типу «Транспорт»:
select avg(igrushki. stoimost) as Средняя_стоимость_по_куклам;
from igrushki;
where tip=4
Средняя стоимость по типу «Электронные игрушки»:
select avg(igrushki. stoimost) as Средняя_стоимость_по_куклам;
from igrushki;
where tip=5
Поиск игрушек с ценой в заданных пределах:
if ThisForm. optiongroup1.option1.value=1
bo1.enabled=1
Endif
if ThisForm. optiongroup1.option2.value=1
bo1.enabled=0
Endif
if thisform. optiongroup1.option1.value=1
select igrushki. nazvanie as Игрушки, igrushki. stoimost as Цена;
from my! igrushki inner join my! tip;
on igrushki. tip==tip. id;
where igrushki. stoimost between ThisForm. Text1.Value and ThisForm. Text2.Value AND;
igrushki. tip=(select tip. id FROM my! tip WHERE tip. name_tip=bo1.value);
ORDER BY igrushki. stoimost
else
select igrushki. nazvanie as Игрушки, igrushki. stoimost as Цена;
from my! igrushki;
where igrushki. stoimost between ThisForm. Text1.Value and ThisForm. Text2.Value;
ORDER BY igrushki. stoimost
endif
Игрушки заданного производителя:
select igrushki. nazvanie as название,;
postavshik. name_postavshik as производитель;
from igrushki;
full join postavshik on igrushki. postavshik=postavshik. id;
where postavshik. name_postavshik=bo1.Value;
Доля дешевых игрушек от общего числа:
LOCAL temp1(1)
LOCAL temp2(1)
use my! igrushki
temp=RECCOUNT()
if thisform. optiongroup1.option1.value == 1
SELECT count(igrushki. nazvanie);
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value AND;
thisform. Text2.value >= igrushki. Age_low AND thisform. Text2.value <= igrushki. Age_high;
INTO ARRAY temp1
SELECT count(igrushki. nazvanie);
FROM my! igrushki;
WHERE thisform. Text2.value >= igrushki. Age_low AND thisform. Text2.value <= igrushki. Age_high;
INTO ARRAY temp2
SELECT igrushki. nazvanie, igrushki. age_low as Нижний_предел_возраста,;
igrushki. age_high as Верхний_предел_возраста, igrushki. stoimost as Цена;
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value AND;
thisform. Text2.value >= igrushki. Age_low AND thisform. Text2.value <= igrushki. Age_high;
ORDER BY igrushki. stoimost
result=temp1/temp2*100
MessageBox("Доля дешевых игрушек: " + alltrim(str(result))+" %")
else
SELECT count(igrushki. nazvanie);
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value;
INTO ARRAY temp1;
SELECT igrushki. nazvanie as Название, igrushki. stoimost as Цена;
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value;
ORDER BY igrushki. stoimost
result=temp1/temp*100
MessageBox("Доля дешевых игрушек: " + alltrim(str(result))+" %")
endif
close database
Игрушки с заданной датой выпуска:
select igrushki. nazvanie as Название_игрушки,;
TTOD(igrushki. data_vipuska) as Дата_выпуска from igrushki;
where TTOD(igrushki. data_vipuska)=CTOD(ThisForm. Text1.Value);
group by igrushki. nazvanie;
Игрушки с заданным весом для заданного производителя:
if thisform. optiongroup1.option1.value=1
select igrushki. nazvanie as Игрушки, igrushki. ves as Вес,;
postavshik. name_postavshik as Поставщик;
from my! igrushki inner join my! postavshik;
on igrushki. postavshik==postavshik. id;
where igrushki. ves between ThisForm. Text1.Value and ThisForm. Text2.Value AND;
igrushki. postavshik==(select postavshik. id FROM my! postavshik WHERE postavshik. name_postavshik=bo1.value);
ORDER BY igrushki. ves
else
select igrushki. nazvanie as Игрушки, igrushki. ves as Вес,;
postavshik. name_postavshik as Поставщик;
from my! igrushki inner join my! postavshik;
on igrushki. postavshik==postavshik. id;
where igrushki. ves between ThisForm. Text1.Value and ThisForm. Text2.Value;
ORDER BY igrushki. ves
Endif
Доля игрушек, проданных за определенный промежуток времени:
LOCAL temp1(1)
fmin = thisform. Text1.value
fmax = thisform. Text2.value
use my! igrushki
temp=RECCOUNT()
SELECT count(igrushki. nazvanie);
FROM my! igrushki;
WHERE igrushki. data_prodagi between fmin AND fmax;
INTO ARRAY temp1
result=temp1/temp*100
MessageBox("Доля игрушек за данный период " + alltrim(str(result))+"%")
close databases
Самый популярный вид игрушек для заданного возраста:
LOCAL cntprod(5)
LOCAL temp
close database
use igrushki in 2
use tip in 1
select 1
do while (!EOF())
temp=tip. id
cntprod=0
select 2
select sum(igrushki. koll_prod);
from my! igrushki;
where igrushki. age_low<=THISFORM. Text1.value AND igrushki. age_high>=THISFORM. Text1.value AND;
igrushki. tip==temp;
into array cntprod
Update tip;
Set avg_cost=cntprod;
Where tip. id=temp
select 1
skip 1
enddo
close databases
select tip. name_tip, tip. avg_cost;
from my! tip;
where tip. avg_cost=(select max(tip. avg_cost) FROM my! tip)
Самый популярный вид игрушек в целом:
LOCAL cntprod(5)
LOCAL temp
use igrushki in 2
use tip in 1
select 1
do while (!EOF())
temp=tip. id
cntprod=0
select 2
select sum(igrushki. koll_prod);
from my! igrushki;
where igrushki. tip==temp;
into array cntprod
Update tip;
Set avg_cost=cntprod;
Where tip. id=temp
select 1
skip 1
enddo
select tip. name_tip, tip. avg_cost;
from my! tip;
where tip. avg_cost=(select max(tip. avg_cost) FROM my! tip)
close databases
Игрушки, поступившие от заданного поставщика, чья стоимость больше стоимости другой выбранной игрушки:
LOCAL temp(1)
LOCAL temp1(2)
select Distinct(igrushki. postavshik);
from my! igrushki;
where igrushki. postavshik == (select postavshik. id FROM my! postavshik WHERE postavshik. name_postavshik=bo3.value);
Into array temp
select igrushki. stoimost FROM my! igrushki;
WHERE igrushki. postavshik==temp AND igrushki. nazvanie = bo2.value;
INTO ARRAY temp1
num = alen(temp1)
if num==2
num=0
else
num=temp1
endif
MessageBox("Цена выбранной игрушки: " + alltrim(str(num)))
select igrushki. nazvanie as Игрушки, igrushki. stoimost as Цена,;
postavshik. name_postavshik as Поставщик;
from my! igrushki inner join my! postavshik;
on igrushki. postavshik==postavshik. id;
where igrushki. postavshik == (select postavshik. id FROM my! postavshik WHERE postavshik. name_postavshik=bo1.value) AND;
igrushki. stoimost > num;
ORDER BY igrushki. stoimost
Доля дешевых игрушек, поступивших от заданного поставщика
LOCAL temp1(1)
use my! igrushki
temp=RECCOUNT()
if thisform. optiongroup1.option1.value == 1
SELECT count(igrushki. nazvanie);
FROM my! igrushki inner join my! postavshik;
on igrushki. postavshik==postavshik. id;
WHERE igrushki. stoimost <= thisform. text1.value AND;
igrushki. postavshik==(select postavshik. id FROM my! postavshik WHERE postavshik. name_postavshik=bo1.value);
INTO ARRAY temp1
SELECT igrushki. nazvanie, igrushki. stoimost as Цена;
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value AND;
igrushki. postavshik==(select postavshik. id FROM my! postavshik WHERE postavshik. name_postavshik=bo1.value);
ORDER BY igrushki. stoimost
result=temp1/temp*100
MessageBox("Доля дешевых игрушек: " + alltrim(str(result))+" %")
else
SELECT count(igrushki. nazvanie);
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value;
INTO ARRAY temp1;
SELECT igrushki. nazvanie as Название, igrushki. stoimost as Цена;
FROM my! igrushki;
WHERE igrushki. stoimost <= thisform. text1.value;
ORDER BY igrushki. stoimost
result=temp1/temp*100
MessageBox("Доля дешевых игрушек: " + alltrim(str(result))+" %")
endif
close database
Доля игрушек, проданных за определенный промежуток времени
LOCAL temp(1)
select 1
num1 = RECCOUNT()
date1=thisform. text1.value
IF thisform. check1.value == 1
date2=date()
else
date2=thisform. text2.value
endif
SELECT avg(igrushki. stoimost);
FROM my! igrushki;
WHERE igrushki. data_prodagi between date1 AND date2;
INTO ARRAY temp
SELECT igrushki. nazvanie as Название, igrushki. data_vipuska as Дата_выпуска,;
igrushki. data_prodagi as Дата_продажи, igrushki. stoimost as Стоимость, igrushki. koll_prod as Количество_проданных_игрушек;
FROM my! igrushki;
WHERE igrushki. data_prodagi between date1 AND date2;
ORDER BY igrushki. data_prodagi
MessageBox("Средняя стоимость: "+ alltrim(str(temp))+" р.")
Игрушки со стоимостью выше чем средняя стоимость игрушек заданного производителя
LOCAL temp(1)
LOCAL temp1(1)
select Distinct(igrushki. postavshik);
from my! igrushki;
where igrushki. postavshik == (select postavshik. id FROM my! postavshik WHERE postavshik. name_postavshik=bo1.value);
Into array temp
select avg(igrushki. stoimost);
FROM my! igrushki WHERE igrushki. postavshik=temp;
INTO ARRAY temp1
MessageBox("Средняя стоимость игрушки: " + alltrim(str(temp1)))
select igrushki. nazvanie as Игрушки, igrushki. stoimost as Цена,;
postavshik. name_postavshik as Поставщик;
from my! igrushki inner join my! postavshik;
on igrushki. postavshik==postavshik. id;
where igrushki. stoimost >= temp1;
ORDER BY igrushki. stoimost
Игрушка, которую лучше всего раскупают:
select igrushki. nazvanie as название, igrushki. stoimost as Цена, igrushki. koll_prod as Количество_проданных,;
igrushki. data_vipuska as Дата_выпуска, igrushki. data_prodagi as Дата_продажи,;
postavshik. name_postavshik as производитель;
from my! igrushki;
full join postavshik on igrushki. postavshik=postavshik. id;
where igrushki. koll_prod=(select max(igrushki. koll_prod) FROM my! igrushki)
Заключение
Была освоена в достаточном объеме система управления базами данных Microsoft Visual FoxPro 6.0, получены навыки по созданию баз данных и приложений.














