Министерство Образования и Науки Российской Федерации
Федеральное Агентство по Образованию
Государственное образовательное учреждение
Высшего профессионального образования
Новосибирский Государственный Технический Университет
Кафедра ВТ
Расчетно-графическая работа по дисциплине
«Базы Данных»
Программирование в среде Visual Fox Pro
Факультет: АВТ
Группа: АМ-411
Студент:
Преподаватель:
Вариант: 13
Новосибирск, 2007 г.
Содержание:
1. | Задание | 3 |
2. | Структура базы данных и таблиц | 4 |
2.1. | Графическое представление связей между файлами | 4 |
2.2. | Структура таблиц | 4 |
3. | Содержание таблиц БД | 5 |
4. | Интерфейс пользователя | 6 |
5. | Формы и запросы | 7 |
5.1. | Формы для редактирования данных | 7 |
5.2. | Запросы к базе данных для просмотра информации | 9 |
5.3. | Запросы к базе данных, требуемые заданием, с соответствующими формами | 9 |
6. | Руководство пользователя | 19 |
7. | Выводы и анализ результатов | 21 |
8. | Использованная литература | 22 |
2.Структура базы данных и таблиц
2.1. Графическое представление связей между файлами
База данных «Мебель» была реализована следующим образом:
- виды мебели были вынесены в отдельную таблицу; поставщики, производители формируются отдельным образом; в основной таблице хранятся идентификаторы вида, производителя и поставщика товара.
База данных состоит из 4 таблиц (рис.1.):
- product – содержит сведения о всех товарах;
- vid – содержит виды бакалеи;
- postav – содержит сведения о поставщиках;
- strana – содержит сведения о странах-производителях.

Рис.1. Структура базы данных «Мебель».
2.2. Структура таблиц
Таблица mebel содержит следующие поля:
- id (int) – номер товара; наименован (char) – название товара; цена (int) – стоимость товара; вес (int) – вес товара; дата_выпус (Date) – дата выпуска товара; дата_прода (Date) – дата продажи товара; количество (int) – количество проданного товара; id_vid(int, Regular) – идентификатор вида; id_postav (int, Regular) – идентификатор поставщика; id_strana (int, Regular) – идентификатор производителя.
Таблица vid состоит из следующих полей:
§ id (int, Primary) – идентификатор вида;
§ вид_мебели (char) – название вида.
Таблица postav состоит из следующих полей:
§ id (int, Primary) – идентификатор поставщика;
§ поставщик (char) - поставщик.
Таблица strana состоит из следующих полей:
§ id (int, Primary) – идентификатор производителя;
§ страна (char) – страна-производитель.
3. Содержание таблиц БД
Для демонстрации работы базы данных, в неё были внесены следующие данные
(рис. 2-5):

Рис.2. Содержимое таблицы “product”.
Рис.3. Содержимое таблицы “Postav”.
Рис.4. Содержимое таблицы “strana”.
Рис.5. Содержимое таблицы “vid”.
4. Интерфейс пользователя
Управление базой данных осуществляется с помощью главной формы. На ней расположены поля для просмотра содержимого базы данных и ее редактирования, так же в нижней части данной формы расположены кнопки вызова форм ввода/вывода, позволяющие производить разнообразные запросы к базе данных.

Рис.6. Основная форма базы данных.
В верхней части главной формы расположены поля, отображающие содержимое всех таблиц базы данных, так же они служат для редактирования и добавления новых записей. Все необходимые манипуляции с базой данных осуществляются посредством управляющих кнопок. Запросы к базе данных осуществляются через вспомогательные формы ввода/вывода, вызываемые соответствующими кнопками.
5. Формы и запросы
В данном разделе рассматриваются используемые формы и программные коды, реализующие соответствующие функции:
5.1. Формы для редактирования данных
Добавление поставщика:
public tmp(2)
if reccount("postav") > 0
SELECT MAX(id) FROM postav INTO ARRAY tmp
else
tmp[1] = -1
endif
INSERT INTO postav VALUES (tmp[1]+1, thisform. text1.value)
thisform. text1.value=""
bo1.refresh
Удаление поставщика:
if val(bo1.value) >= 0
RECALL ALL
DELETE FROM postav WHERE id=val(bo1.value)
PACK
bo1.refresh
endif
Рис.10. Форма добавления и удаления поставщика.
Добавление производителя:
public tmp(2)
if reccount("strana") > 0
SELECT MAX(id) FROM strana INTO ARRAY tmp
else
tmp[1] = -1
endif
INSERT INTO strana VALUES (tmp[1]+1, thisform. text1.value)
thisform. text1.value=""
bo1.refresh
Удаление производителя:
if val(bo1.value) >= 0
RECALL ALL
DELETE FROM strana WHERE id=val(bo1.value)
pack
bo1.refresh
endif

Рис.11. Форма добавления и удаления производителя.
Добавление вида:
public tmp(2)
if reccount("vid") > 0
SELECT MAX(id) FROM vid INTO ARRAY tmp
tmp[1] = tmp[1] + 1
else
tmp[1] = -1
endif
INSERT INTO vid VALUES (thisform. text1.value, tmp[1])
thisform. text1.value=""
bo1.refresh
Удаление вида:
if val(bo1.value) >= 0
RECALL ALL
DELETE FROM vid WHERE id=val(bo1.value)
browse last
pack
bo1.refresh
endif

Рис.12. Форма добавления и удаления вида.
5.2. Запрос к базе данных для просмотра информации
Просмотр всех записей базы данных:
SELECT Product. наименован, Vid. вид_мебели, Postav. поставщик,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! vid INNER JOIN mebel! product;
INNER JOIN mebel! postav;
INNER JOIN mebel! strana ;
ON Strana. id = Product. id_strana ;
ON Postav. id = Product. id_postav ;
ON Vid. id = Product. id_vid;
ORDER BY Product. наименован
5.3. Запросы к базе данных, требуемые заданием, с соответствующими формами
Для каждого вида мебели выдать список, отсортированный (рис.13-14):
• по дате выпуска,
• по дате продажи,
• в алфавитном порядке по поставщику,
• по весу.
• по стоимости.
Код метода Click кнопки «Показать»:
do case
case thisform. optiongroup1.option1.value = 1
SELECT Product. наименован, Vid. вид_мебели, Postav. поставщик,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! postav INNER JOIN mebel! product;
INNER JOIN mebel! vid ;
ON Vid. id = Product. id_vid ;
ON Postav. id = Product. id_postav;
where (vid. id = val(bo1.value));
ORDER BY Product. дата_выпус
case thisform. optiongroup1.option2.value = 1
SELECT Product. наименован, Vid. вид_мебели, Postav. поставщик,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! postav INNER JOIN mebel! product;
INNER JOIN mebel! vid ;
ON Vid. id = Product. id_vid ;
ON Postav. id = Product. id_postav;
where (vid. id = val(bo1.value));
ORDER BY Product. дата_прода
case thisform. optiongroup1.option3.value = 1
SELECT Product. наименован, Vid. вид_мебели, Postav. поставщик,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! postav INNER JOIN mebel! product;
INNER JOIN mebel! vid ;
ON Vid. id = Product. id_vid ;
ON Postav. id = Product. id_postav;
where (vid. id = val(bo1.value));
ORDER BY Postav. поставщик
case thisform. optiongroup1.option4.value = 1
SELECT Product. наименован, Vid. вид_мебели, Postav. поставщик,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! postav INNER JOIN mebel! product;
INNER JOIN mebel! vid ;
ON Vid. id = Product. id_vid ;
ON Postav. id = Product. id_postav;
where (vid. id = val(bo1.value));
ORDER BY Product. вес
case thisform. optiongroup1.option5.value = 1
SELECT Product. наименован, Vid. вид_мебели, Postav. поставщик,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! postav INNER JOIN mebel! product;
INNER JOIN mebel! vid ;
ON Vid. id = Product. id_vid ;
ON Postav. id = Product. id_postav;
where (vid. id = val(bo1.value));
ORDER BY Product. цена
endcase

Рис.13. Форма для вывода отсортированного списка.

Рис.14. Результат выполнения запроса (вид: кухня, сортировка по цене).
Найти самый дорогой вид мебели, самый дешевый, среднюю стоимость по каждому виду и в целом (рис. 15-16):

Рис.15. Форма для запроса.
Код метода Click кнопки «Показать» в целом:
do case
case thisform. optiongroup1.option1.value = 1
select vid. вид_мебели as "ВИД", max (product. цена);
from mebel! product;
inner join mebel! vid on product. id_vid = vid. id;
where (product. цена = (select max (product. цена) from mebel! product))
case thisform. optiongroup1.option2.value = 1
select vid. вид_мебели as "ВИД", min (product. цена);
from mebel! product;
inner join mebel! vid on product. id_vid = vid. id;
where (product. цена = (select min (product. цена) from mebel! product))
case thisform. optiongroup1.option3.value = 1
select avg(product. цена);
from mebel! product
endcase
Код метода Click кнопки «Показать» по виду:
select vid. вид_мебели, avg(product. цена);
from mebel! product;
inner join mebel! vid on vid. id = product. id_vid;
where (vid. id = val(bo1.value))
![]()
Рис.16. Средняя стоимость в целом. Рис.17. Самый дорогой вид.
![]()
Рис.18. Самый дешевый вид. Рис.19. Средняя стоимость по виду столы.
Найти мебель с ценой в заданных пределах (рис.20, 21):
Код метода Click кнопки «Показать»:
SELECT product. наименован AS "Наименование", product. цена, vid. вид_мебели;
FROM mebel! product;
INNER JOIN mebel! vid ON product. id_vid = vid. id;
WHERE product. цена >= thisform. text1.value;
AND product. цена <= thisform. text2.value;
ORDER BY product. цена

Рис.20. Форма для поиска изделий с ценой выше заданной.

Рис.21. Вывод изделий с ценой отр дор.
Найти всю мебель заданного производителя (рис.24, 25):
Код запроса:
SELECT Product. наименован, Vid. вид_мебели, Strana. страна,;
Product. дата_выпус, Product. дата_прода, Product. цена, Product. вес,;
Product. количество;
FROM mebel! strana INNER JOIN mebel! product;
INNER JOIN mebel! vid ;
ON Vid. id = Product. id_vid ;
ON Strana. id = Product. id_strana;
where (Strana. id = val(bo1.value));
ORDER BY Product. наименован

Рис.22. Форма для поиска изделий заданного производителя.

Рис.23. Результаты (для России).
Найти всю мебель с заданной датой выпуска (рис.24):
Код метода Click кнопки «Показать»:
SELECT product. наименован AS "Наименование",vid. вид_мебели, product. дата_выпус;
FROM mebel! product;
INNER JOIN mebel! vid ON product. id_vid = vid. id;
WHERE product. дата_выпус = thisform. text1.value;
ORDER BY product. наименован

Рис.24. Форма для запроса и результат.
Найти всю мебель, чей вес находится в заданных пределах (ввод интервала) для заданного производителя (выбор) и в целом (рис.25-27):

Рис.25.Форма для запроса.
Код метода Click кнопки «ALL»:
Select product. наименован, product. цена, product. вес, vid. вид_мебели;
from mebel! product;
Inner join mebel! vid on product. id_vid = vid. id;
where product. вес between thisform. text1.value and thisform. text2.value
Код метода Click кнопки «Показать»:
Select product. наименован, product. цена, product. вес, vid. вид_мебели, strana. страна;
from mebel! product;
Inner join mebel! vid on product. id_vid = vid. id;
Inner join mebel! strana on product. id_strana = strana. id;
where (product. вес between thisform. text1.value and thisform. text2.value) and strana. id = val(bo1.value)

Рис.26. Результат (вес от 100 до 200).

Рис.27. Результат (вес от 100 до 200, Германия).
Найти долю мебели, проданных за определенный период (ввод периода) от общего времени продажи (рис.28):
Код метода Click кнопки «Показать»:
SELECT (max(product. дата_прода)- min(product. дата_прода)) FROM mebel! product into array tmp
SELECT COUNT(product. id)*100/tmp[1] as "Доля", max(product. дата_прода), min(product. дата_прода);
FROM mebel! product ;
WHERE product. дата_прода between thisform. Text1.value and thisform. Text2.value

Рис.28. Форма и результат для вывода доли изделий.
Найти всю мебель, поступившую от заданного поставщика, чья стоимость больше, чем стоимость заданного изделия (ввод наименования), поступившего из заданной страны (ввод наименования страны) (рис.29, 30):

Рис.29. Форма и результат для вывода изделий. Рис.30.Подзапрос
Код метода Click кнопки «Показать»:
select product. цена ;
from mebel! product;
inner join mebel! strana on product. id_strana = strana. id;
where product. наименован = (thisform. Text1.value) and strana. id = val(bo1.value) and (postav. id = val(bo2.value))
select product. наименован, product. цена, postav. поставщик;
from mebel! product;
inner join mebel! postav on product. id_postav = postav. id;
inner join mebel! strana on product. id_strana = strana. id;
where (product. цена > (select product. цена ;
from mebel! product;
inner join mebel! strana on product. id_strana = strana. id;
where product. наименован = thisform. Text1.value and;
strana. id = val(bo1.value)) and postav. id = val(bo2.value))
Найти долю дешевой мебели (ввод стоимости), поступивших от заданного поставщика и в целом (рис.31, 32):
Код метода Click кнопки «В целом»:
zn = thisform. Text1.value
select * from product into cursor cur
n_all = reccount()
select * from product into cursor cur where цена < zn
n_old = reccount()
res = (n_old / n_all)*100
MessageBox("Доля дешевых изделий: " + str (res) + "%")
Код метода Click кнопки «По поставщику»:
zn = thisform. Text1.value
select * from product into cursor cur
n_all = reccount()
select * from product into cursor cur where (цена < zn) and (id_postav = val(bo1.value))
n_old = reccount()
res = (n_old / n_all)*100
MessageBox("Доля дешевых изделий: " + str (res) + "%")

Рис.31.Форма для вывода доли дешевых изделий.

Рис.32. Результат запроса (цена дор) для заданного поставщика – Ikea (справа) и в целом (слева).
Найти среднюю стоимость мебели, проданной за определенный промежуток времени (ввод интервала) (рис.33):
Код запроса:
select avg(product. цена);
from mebel! product;
where (product. дата_прода between thisform. Text1.value and thisform. Text2.value)

Рис.33. Средняя стоимость мебели, проданной за определенный промежуток времени.
Найти все изделия, чья стоимость выше, чем средняя стоимость изделий заданного производителя (рис.34, 35):
Код запроса:
select avg (product. цена) as "Среднее" ;
from mebel! product;
where product. id_strana = val(bo1.value)
select product. наименован, product. цена, product. количество;
from mebel! product;
where (product. цена > (select avg (product. цена)as "Среднее" from mebel! product;
where product. id_strana = val(bo1.value) ))

Рис.34. Подзапрос.

Рис.35. Результат (страна Германия)
Найти самый популярный вид мебели (продано наибольшее количество) (рис.36):
Код запроса:
Select product. наименован, product. цена, vid. вид_мебели, max(product. количество);
from mebel! product;
inner join mebel! vid on product. id_vid = vid. id;
where (product. количество = (select max(product. количество) from mebel! product))

Рис.36.Форма для запроса и результат.
Найти долю дешевой мебели (меньше заданного) от общего числа мебели (рис.37):
Код запроса:
SELECT COUNT(product. id) FROM mebel! product into array tmp
SELECT COUNT(product. id)*100/tmp[1] as "Доля";
FROM mebel! product ;
WHERE product. цена < thisform. Text1.value

Рис.37.Форма для запроса и результат.
6.Руководство пользователя
Разработана справочная система для созданной базы данных. В результате проделанной работы были реализованы следующие возможности:
- Темы справочной системы Ключи для поиска тем Перекрёстные ссылки Пояснения к терминам
Результаты работы проиллюстрированы на приведённых ниже рисунках:

Рис.38. Содержание
Рис.39. Пояснения к терминам.

Рис.40. Перекрестные ссылки.

Рис.41.Предметный указатель
7.Выводы и анализ результатов
В результате работы была создана база данных «Мебель», включающая в себя информацию о различных видах мебели. Доступ пользователя к базе данных осуществляется с помощью главной формы, которая содержит все необходимые управляющие кнопки.
В процессе выполнения данной расчётно-графической работы были закреплены знания и навыки, полученные в ходе сдачи лабораторных работ, включающие в себя:
- создание таблиц и связывание их между собой; редактирование данных в таблицах; разработка экранных форм, позволяющих получать данные от пользователя, что приводит к возможности создания гибких запросов, результаты которых зависят от заданных пользователями условий меню приложений, облегчающего доступ и ускоряющего работу; создание запросов и подзапросов;
При реализации запросов был использован язык программирования Visual FoxPro 6.0 для определения переменных, массивов, создание циклов и условий. Все эти возможности значительно увеличивают потенциал использования языка SQL.
8. Использованная литература
1) Базы данных. Методические указания к лабораторному практикуму.- Новосибирск: Издательство НГТУ, 2004. – 56с.
2) Иллюстрированный самоучитель по Visual FoxPro 8 (электронный вариант)


