Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Министерство образования и науки Российской Федерации
Новосибирский государственный технический университет
Кафедра Вычислительной Техники
Расчетно-графическая работа
По дисциплине «Базы данных»
Факультет: АВТ
Группа: АМ-209
Студент:
Преподаватель: Трошина ГВ.
Вариант: 9
Тема: Пресса
Новосибирск 2005
Оглавление:
1. Задание. 3
2. Описание программы.. 5
3. Структура связей между таблицами. 7
4. Интерфейс пользователя. 7
5. Описание работы меню.. 7
6. Руководство пользователя. 9
7. Тексты программ с комментариями. 10
8. Выводы: 27
9. Список литературы: 28
1. Задание
Основная база данных «Пресса». Предусмотреть: меню, печать на экран, ввод данных, редактирование, просмотр данных. Реализовать следующие типы запросов с использованием нескольких таблиц:
· Для каждого вида газетной продукции (например, газета, еженедельник, журнал, бюллетень и пр.) указать сведения о ней (наименование, издательство, цена, тираж и т. п.)
· Для каждого вида прессы выдать список, отсортированный:
1. В алфавитном порядке по наименованию
2. По тиражу
3. По стоимости
· Найти самое дорогое издание, самое дешевое, среднюю стоимость для каждого вида прессы и в целом
· Найти прессу с ценой выше 5р. (и любая другая сумма, т. е. предусмотреть ввод цены с клавиатуры) для каждого вида издания и в целом
· Найти все издания, чей тираж попадает в заданные пределы (ввод интервала)
· Для заданного издательства (выбор) найти все виды газетной продукции
· Найти все издания, чья стоимость находится в заданных пределах (ввод интервала) для заданного издательства
· Найти долю дешевой прессы (меньше заданного, ввод ограничения) от общего числа изданий
· Найти долю прессы, проданной за определенный период (ввод)
· Найти все виды прессы, поступившие от заданного издательства (ввод издательства), чья стоимость больше заданной (ввод стоимости)
· Найти всю прессу, поступившую от заданного издательства, чья стоимость больше, чем средняя стоимость заданной прессы (ввод наименования), поступившей из заданного города (ввод наименования города)
· Найти долю дешевой прессы (чья стоимость меньше заданной, ввод стоимости), поступившей от заданного издательства и в целом
· Найти среднюю стоимость прессы, проданной за определенный промежуток времени (ввод интервала)
· Найти всю прессу, чья стоимость выше, чем средняя стоимость прессы заданного издательства
· Найти прессу, которую лучше всего раскупают, указать параметры (стоимость, издательство)
2. Описание программы
Данная расчетно-графическая работа выполнена на основе меню. Это значительно облегчает работу с базой данных, так как основные команды просмотра, редактирования, сортировки базы данных, а также реализация запросов выполняются непосредственно из команд меню.
Основой программы является база данных «Пресса». Она состоит из трех таблиц и содержит все необходимые данные об основных характеристиках различных изданий, а именно: вид прессы, ее наименование, издательство, цена, тираж, дата выпуска, дата продажи, количество проданных экземпляров, город.
Для решения поставленной задачи были созданы три таблицы:
Таблица «press.dbf».
В ней хранится информация о прессе.
Поле | Тип поля | Описание |
Id | integer | Идентификатор |
Id_type | integer | Идентификатор, для связи с таблицей «Typ» |
Name_press | Character | Название издания |
Id_publisher | Integer | Идентификатор, для связи с таблицей «Publisher» |
City | Character | Город |
Date_of_publ | Date | Дата выпуска издания |
Price | Numeric | Цена издания |
Circulation | Numeric | Тираж издания |
Date_of_sale | Date | Дата продажи |
Sold_press | Numeric | Количество проданных экземпляров |
Таблица «typ.dbf».
В ней хранится информация о виде издания.
Поле | Тип поля | Описание |
Id_type | integer | Уникальный идентификатор |
Type_ | character | Вид издания |
Таблица «publisher.dbf».
В ней хранится информация о виде издания.
Поле | Тип поля | Описание |
Id_publisher | integer | Уникальный идентификатор |
Publisher_ | character | Название издательства |
Данные, хранящиеся в таблицах, приведены на рис.1 – рис.3

Рис.1. Таблица ‘press’

Рис.2. Таблица ‘typ’

Рис.3. Таблица ‘publisher’
3. Структура связей между таблицами
Структура связей между таблицами представлена на рис.4

Рис.4. Связи между таблицами базы данных ‘pressa’
4. Интерфейс пользователя
Как уже было сказано выше, данная программа выполнена на основе меню. На рис.5 представлено меню, которое появляется сразу же после запуска программы

Рис.5. Внешний вид меню пользователя
5. Описание работы меню
Первый пункт меню называется ‘Edit’(редактирование). Редактирование возможно как в таблице, так и в форме

Рис.6. Подменю пункта ‘edit’ (редактирование)
Второй пункт называется ‘view’(просмотр). Он предназначен для просмотра таблиц данных

Рис.7. Подменю пункта ‘view’(просмотр)
3.Третий пункт называется ‘queries’(запросы). Он позводяет осуществлять различные запросы в базе данных и выводить на экран их результат

Рис.8. Подменю пункта ‘queries’(запросы)
4.Четвертый пункт называется ‘About’. В нем сдержтся информация о программе и о ее разработчике

Рис.9. Пункт меню “About”
6. Руководство пользователя
При запуске меню активируется меню, которое предоставляет доступ к основным формам для работы с базой данных. Все запросы выполнены по «шаблону» - каждый запрос имеет примерно одинаковый вид. Это заголовок, в котором детально описан запрос, поля для выбора и ввода данных (combo box, text box). Для того, чтобы вызвать меню нужно в менеджере проекта, выбрав вкладку ‘menu’, нажать копку ‘run’. Либо в оболочке Visual FoxPro 6.0 (или другой с номером выше 6.0.) в меню ‘Program’ выбрать пункт ‘Do’, после чего указать путь к файлу menu. mpr. Стандартное меню исчезнет, и появится меню данной программы. После этого можно выбирать нужные команды меню и осуществлять необходимые действия.
7. Тексты программ с комментариями
По заданию необходимо было реализовать 18 запросов. Ниже приведен текст каждого из них и результат выполнения этого запроса.
Form_01.scx
Для каждого вида прессы выдать список, отсортированный:
1. В алфавитном порядке по наименованию
2. По тиражу
3. По стоимости

Рис.10. Форма “form_01.scx”
Обработка кнопки «Сортировка в алфавитном порядке»:
SELECT Press. name_press, typ. Type_ as Type_of_press, Press. price;
FROM pressa! press INNER JOIN pressa! typ;
ON Press. id_type = Typ. id_type;
WHERE press. id_type=(SELECT typ. id_type FROM pressa! typ WHERE typ. Type_=bo1.value);
ORDER BY Press. name_press
Обработка кнопки «Сортировка по тиражу»:
SELECT Press. name_press, Press. circulation, typ. Type_ as Type_of_press;
FROM pressa! press FULL JOIN pressa! typ;
FULL JOIN pressa! publisher ;
ON Press. id_publisher = Publisher. id_publisher ;
ON Press. id_type = Typ. id_type;
WHERE press. id_type=(SELECT typ. id_type FROM pressa! typ WHERE typ. Type_=bo1.value);
ORDER BY Press. circulation
Обработка кнопки «Сортировка по стоимости»:
SELECT Press. name_press, Press. price, typ. Type_ as Type_of_press;
FROM pressa! press FULL JOIN pressa! typ;
FULL JOIN pressa! publisher ;
ON Press. id_publisher = Publisher. id_publisher ;
ON Press. id_type = Typ. id_type;
WHERE press. id_type=(SELECT typ. id_type FROM pressa! typ WHERE typ. Type_=bo1.value);
ORDER BY Press. price, Press. name_press
Результаты работы запроса:


Рис.11.Результаты работы формы “form_01.scx”
Form_02.scx
Найти самое дорогое издание, самое дешевое, среднюю стоимость для каждого вида прессы и в целом

Рис.12. Форма “form_02.scx”
Обработка кнопки «Самое дорогое издание»:
LOCAL kol(1)
SELECT count(typ. type_);
FROM pressa! typ;
INTO ARRAY kol
LOCAL cntpost(kol,2)
SELECT typ. type_, avg(press. price);
FROM pressa! press inner join pressa! typ;
ON press. id_type=typ. id_type;
group by typ. id_type;
INTO ARRAY cntpost
LOCAL maxi
maxi=cntpost(2)
FOR gnCount=1 TO kol STEP 1
IF (cntpost(gnCount*2)>maxi)
maxi=cntpost(gnCount*2)
ENDIF
ENDFOR
LOCAL sentence
sentence="Самый дорогой вид продукции: "
FOR gnCount = 1 TO kol STEP 1
IF (cntpost(gnCount*2)=maxi)
sentence=sentence+cntpost(gnCount*2-1)
ENDIF
ENDFOR
MessageBox(alltrim(sentence))
Обработка кнопки «Самое дешевое издание»:
LOCAL kol(1)
SELECT count(typ. type_);
FROM pressa! typ;
INTO ARRAY kol
LOCAL cntpost(kol,2)
SELECT typ. type_, avg(press. price);
FROM pressa! press inner join pressa! typ;
ON press. id_type=typ. id_type;
group by typ. id_type;
INTO ARRAY cntpost
LOCAL minn
minn=cntpost(2)
FOR gnCount=1 TO kol STEP 1
IF (cntpost(gnCount*2)<minn)
minn=cntpost(gnCount*2)
ENDIF
ENDFOR
LOCAL sentence
sentence="Самый дешевый вид продукции: "
FOR gnCount = 1 TO kol STEP 1
IF (cntpost(gnCount*2)=minn)
sentence=sentence+cntpost(gnCount*2-1)
ENDIF
ENDFOR
MessageBox(alltrim(sentence))
Обработка кнопки «Средняя стоимость в целом»:
SELECT typ. type_, AVG(press. price);
FROM pressa! press INNER JOIN pressa! typ;
ON press. id_type==typ. id_type;
group by typ. id_type
Обработка кнопки «Средняя стоимость с учетом вида прессы»:
SELECT typ. type_ as Type_of_press, AVG(press. price) as Average_price;
FROM pressa! press inner join pressa! typ;
ON press. id_type=typ. id_type;
WHERE press. id_type=(SELECT typ. id_type FROM pressa! typ WHERE typ. Type_=bo1.value)
Результаты работы запроса:


Рис.13.Результаты работы формы “form_02.scx”
Form_03.scx
Найти прессу с ценой выше 5р. (и любая другая сумма, т. е. предусмотреть ввод цены с клавиатуры) для каждого вида издания и в целом

Рис.14. Форма “form_03.scx”
Обработка кнопки «Найти в целом»:
select press. name_press, press. price;
from pressa! press;
where press. price > ThisForm. Text1.Value;
ORDER BY press. price
Обработка кнопки «Найти по виду»:
SELECT press. name_press, press. price;
FROM pressa! press INNER JOIN pressa! typ;
ON press. id_type==typ. id_type;
WHERE press. price > Thisform. Text1.value;
AND press. id_type=(select typ. id_type FROM pressa! typ WHERE typ. type_=bo1.value)
Результаты работы запроса:

Рис.15.Результаты работы формы “form_03.scx”
Form_04.scx
Найти все издания, чей тираж попадает в заданные пределы (ввод интервала)

Рис.16. Форма “form_04.scx”
Обработка кнопки «Найти»:
select press. name_press, press. circulation;
FROM pressa! press;
where press. circulation between ThisForm. Text1.Value and ThisForm. Text2.Value;
ORDER BY press. circulation
Результаты работы запроса:

Рис.17.Результаты работы формы “form_04.scx”
Form_05.scx
Для заданного издательства (выбор) найти все виды газетной продукции

Рис.18. Форма “form_05.scx”
Обработка кнопки «Найти»:
SELECT Press. name_press, Publisher. publisher_, Typ. type_ ;
FROM pressa! publisher FULL JOIN pressa! press;
FULL JOIN pressa! typ ;
ON Typ. id_type = Press. id_type ;
ON Publisher. id_publisher = Press. id_publisher;
where publisher. id_publisher=(SELECT publisher. id_publisher FROM pressa! publisher WHERE publisher. publisher_=bo1.Value)
Результат работы запроса:

Рис.19.Результаты работы формы “form_05.scx”
Form_06.scx
Найти все издания, чья стоимость находится в заданных пределах (ввод интервала) для заданного издательства

Рис.20. Форма “form_06.scx”
Обработка кнопки «Найти»:
select press. name_press, press. price, publisher. publisher_ as publisher;
from pressa! press inner join pressa! typ;
on press. id_type==typ. id_type;
where press. price between ThisForm. Text1.Value and ThisForm. Text2.Value AND;
press. id_publisher=(select publisher. id_publisher FROM pressa! publisher WHERE publisher. publisher_=bo1.value);
ORDER BY press. price
Результаты работы запроса:

Рис.21.Результаты работы формы “form_06.scx”
Form_07.scx
Найти долю дешевой прессы (меньше заданного, ввод ограничения) от общего числа изданий

Рис.22. Форма “form_07.scx”
Обработка кнопки «Найти»:
LOCAL tmp1(1)
LOCAL tmp(1)
SELECT count(press. name_press);
FROM pressa! press;
INTO ARRAY tmp;
SELECT count(press. name_press);
FROM pressa! press;
WHERE press. price <= thisform. text1.value;
INTO ARRAY tmp1;
result=tmp1/tmp*100
MessageBox("Доля дешевой прессы: " + alltrim(str(result))+" %")
Результат работы запроса:

Рис.23.Результаты работы формы “form_07.scx”
Form_08.scx
Найти долю прессы, проданной за определенный период (ввод)

Рис.24. Форма “form_08.scx”
Обработка кнопки «Найти»:
LOCAL tmp(1)
LOCAL tmp1(1)
date_1=thisform. text1.value
date_2=thisform. text2.value
SELECT count(press. name_press);
FROM pressa! press;
INTO ARRAY tmp;
SELECT count(press. name_press);
FROM pressa! press;
WHERE press. date_of_sale between date_1 AND date_2;
INTO ARRAY tmp1
result=tmp1/tmp*100
MessageBox("Доля прессы, проданной за данный период: " + alltrim(str(result))+"%")
Результаты работы запроса:

Рис.25.Результаты работы формы “form_08.scx”
Form_09.scx
Найти все виды прессы, поступившие от заданного издательства (ввод издательства), чья стоимость больше заданной (ввод стоимости)

Рис.26. Форма “form_09.scx”
Обработка кнопки «Найти»:
select press. name_press, press. price;
from pressa! press inner join pressa! typ;
on press. id_type==typ. id_type;
where press. price > ThisForm. Text1.Value AND;
press. id_publisher=(select publisher. id_publisher FROM pressa! publisher WHERE publisher. publisher_=bo1.value);
ORDER BY press. price
Результаты работы запроса:

Рис.27.Результаты работы формы “form_09.scx”
Form_10.scx
Найти всю прессу, поступившую от заданного издательства, чья стоимость больше, чем средняя стоимость заданной прессы (ввод наименования), поступившей из заданного города (ввод наименования города)

Рис.28. Форма “form_10.scx”
Обработка кнопки «Найти»:
LOCAL tmp1(2)
select press. price FROM pressa! press;
WHERE press. city==bo3.value AND press. name_press = bo2.value;
INTO ARRAY tmp1
numer = alen(tmp1)
if numer==2
numer=0
else
numer=tmp1
endif
MessageBox("Цена выбранной продукции: " + alltrim(str(numer)))
select press. name_press, press. price, publisher. publisher_ as publisher;
from pressa! press inner join pressa! publisher on press. id_publisher==publisher. id_publisher;
where press. id_publisher == (select publisher. id_publisher FROM pressa! publisher WHERE publisher. publisher_=bo1.value) AND press. price > numer;
ORDER BY press. price
Результат работы запроса:

Рис.29.Результаты работы формы “form_10.scx”
Form_11.scx
Найти долю дешевой прессы (чья стоимость меньше заданной, ввод стоимости), поступившей от заданного издательства и в целом

Рис.30. Форма “form_11.scx”
Найти(в целом):
LOCAL tmp1(1)
LOCAL tmp(1)
SELECT count(press. name_press);
FROM pressa! press;
INTO ARRAY tmp;
SELECT count(press. name_press);
FROM pressa! press;
WHERE press. price <=thisform. text1.value;
INTO ARRAY tmp1;
result=tmp1/tmp*100
MessageBox("Доля дешевой прессы: " + alltrim(str(result))+" %")
Найти(с учетом издательства):
LOCAL tmp1(1)
LOCAL tmp(1)
SELECT count(press. name_press);
FROM pressa! press;
INTO ARRAY tmp;
SELECT count(press. name_press);
FROM pressa! press;
WHERE press. price <=thisform. text1.value;
AND press. id_publisher==(select publisher. id_publisher FROM pressa! publisher WHERE publisher. publisher_=bo1.value);
INTO ARRAY tmp1;
result=tmp1/tmp*100
MessageBox("Доля дешевой прессы: " + alltrim(str(result))+" %")
Результат работы запросов:

Рис.31.Результаты работы формы “form_11.scx”
Form_12.scx
Найти среднюю стоимость прессы, проданной за определенный промежуток времени (ввод интервала)

Рис.32. Форма “form_12.scx”
Обработка кнопки «Найти»:
LOCAL tmp(1)
date_1=thisform. text1.value
date_2=thisform. text2.value
SELECT avg(press. price);
FROM pressa! press;
WHERE press. date_of_sale between date_1 AND date_2;
INTO ARRAY tmp
MessageBox("Средняя стоимость прессы, проданной за данный период: " + alltrim(str(tmp)))
SELECT press. name_press, press. price, press. date_of_sale;
FROM pressa! press;
WHERE press. date_of_sale between date_1 AND date_2;

Рис.33.Результаты работы формы “form_12.scx”
Form_13.scx
Найти всю прессу, чья стоимость выше, чем средняя стоимость прессы заданного издательства

Рис.34. Форма “form_13.scx”
Обработка кнопки «Найти»:
LOCAL tmp(1)
LOCAL tmp1(1)
SELECT DISTINCT(press. id_publisher);
FROM pressa! press;
WHERE press. id_publisher==(SELECT publisher. id_publisher FROM pressa! publisher WHERE publisher. publisher_=bo1.value);
INTO ARRAY tmp
SELECT AVG(press. price) FROM pressa! press WHERE press. id_publisher=tmp;
INTO ARRAY tmp1
MessageBox("Средняя стоимость прессы заданного издательства: " +alltrim(str(tmp1)))
SELECT press. name_press, press. price, publisher. publisher FROM pressa! press inner join pressa! publisher on press. id_publisher==publisher. id_publisher WHERE press. price>=(SELECT AVG(press. price);
FROM pressa! press WHERE press. id_publisher=tmp);
ORDER BY press. price
Результат работы запроса:

Рис.35.Результаты работы формы “form_13.scx”
Form_14.scx
Найти прессу, которую лучше всего раскупают, указать параметры (стоимость, издательство)

Рис.36. Форма “form_14.scx”
Обработка кнопки «Самая популярная пресса»:
SELECT Press. name_press, Publisher. publisher_, Press. price, Press. sold_press;
FROM pressa! press INNER JOIN pressa! publisher;
ON Press. id_publisher = Publisher. id_publisher;
WHERE Press. sold_press = (SELECT Max(press. sold_press);
FROM pressa! press )
Результат работы запроса:

Рис.37.Результаты работы формы “form_14.scx”
8. Выводы:
В ходе выполнения расчетно-графической работы были закреплены (и приобретены новые) навыки работы в среде Visual FoxPro 6.0. Получен опыт проектирования баз данных, работы с ними посредством запросов на языке SQL, а также приобретен опыт в управлении базами данных. Также были закреплены навыки работы с меню (Command, Submenu, Procedure) и с формами (CommandButton, Combo Box, Text Box, Edit Box, Container и др.)
9. Список литературы:
1. Лекции по дисциплине «Базы данных»
2. Visual FoxPro 6.0 Help System (пакет MSDN)


