Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Министерство Образования и Науки РФ
Новосибирский Государственный Технический Университет
Кафедра Вычислительной Техники
Расчетно-графическая работа
по дисциплине
Базы Данных
Программирование в среде Visual Fox Pro
Факультет: АВТ
Группа: АМ-215
Студент:
Преподаватель:
Вариант: 32
Новосибирск, 2005
Оглавление:
1. Задание.. 3
2. Структура базы данных и таблиц.. 4
2.1. Структура базы данных.. 4
2.2. Структура таблиц.. 5
3. Запросы к базе данных и интерфейс пользователя.. 6
3.1. Интерфейс пользователя.. 6
3.2. Данные.. 7
3.3. Формы и запросы... 9
4. Выводы... 27
1. Задание
Сформировать несколько баз данных “Машины”, “Механик”, “Ремонт” и др. Предусмотреть: меню, печать на экран, ввод данных, редактирование, просмотр данных. С введением и использованием нескольких баз данных реализовать следующие типы запросов:
n Для каждого автомобиля указать сведения о нем (тип, год выпуска, срок эксплуатации, место изготовления, цена, скорость, вместительность и т. п.).
n Для каждого автомобиля выдать список, отсортированный:
n по году выпуска,
n в алфавитном порядке все виды,
n по цене,
n по сроку эксплуатации,
n по стоимости ремонтных работ,
n по виду ремонта.
n Найти долю «старых» машин (срок эксплуатации больше заданного, ввод с клавиатуры) от общего числа машин.
n Найти самый дорогой автомобиль (по каждому типу), самый дешевый, среднюю стоимость, найти автомобили с ценой свыше 50 т. р. (и любая другая сумма, т. е. предусмотреть ввод цены с клавиатуры).
n Найти все автомобили, поступившие из заданной страны (ввод страны), чья скорость больше заданной (ввод скорости).
n Найти количество автомобилей в гараже (по каждому типу и в целом) с заданным сроком эксплуатации (ввод срока).
n Найти все автомобили заданной вместительности (ввод) для заданного года выпуска.
n Для каждого механика указать сведения о нем (ФИО, год рождения, стаж работы, вид ремонта и т. д.).
n Найти самый дорогой вид ремонта, самый дешевый, среднюю стоимость ремонта для каждого механика и в целом, найти машины со стоимостью ремонтных работ в заданных пределах (предусмотреть ввод цены с клавиатуры) для каждого механика и в целом.
n Количество отремонтированных машин за месяц, квартал; средняя стоимость ремонтных работ за этот же период.
n Найти долю дешевых (по стоимости ремонтных работ) машин (меньше заданного, ввод ограничения) от общего числа машин (для каждого механика и в целом).
n Найти всех механиков, чей стаж находится в заданных пределах (ввод интервала) для заданного вида ремонта (выбор).
2. Структура базы данных и таблиц
2.1. Структура базы данных
База данных AutoDB создавалась с учетом следующих соображений:
- каждая машина может быть отремонтирована несколько раз
- каждый механик может заниматься только одним видом ремонта
Поэтому сведения о ремонтах и машинах хранятся в разных таблицах, а в таблице, хранящей сведения о механиках, есть идентификатор выполняемого механиком вида ремонта.
База данных состоит из пяти таблиц:
- cars – содержит сведения о машинах
- car_types – содержит типы машин
- mechanics – содержит сведения о механиках
- repair_types – содержит виды ремонта
- repairs – содержит сведения о ремонтах
На рис. 1 представлена структура базы данных
Рис. 1. Структура базы данных AutoDB
2.2. Структура таблиц
Таблица cars
Таблица cars содержит следующие поля:
- car_id (integer, primary) – идентификатор машины
- variety (character(20)) – марка
- car_type_id (integer, regular)– идентификатор типа машины
- manuf_year (integer) – год выпуска
- exploitation (integer) – срок эксплуатации
- manuf_place (character(20)) – страна-изготовитель
- cost (integer) – цена
- speed (integer) – скорость
- capacity (integer) – вместительность – максимальная масса груза
Таблица car_types
Таблица car_types содержит следующие поля:
- car_type_id (integer, primary)– идентификатор типа машины
- car_type (character(20)) – тип машины
Таблица mechanics
Таблица mechanics содержит следующие поля:
- mech_id (integer, primary) – идентификатор механика
- name (character(30)) – ФИО
- born_year (integer) – год рождения
- service_len (integer) – стаж
- rep_id (integer, regular) – идентификатор вида ремонта
Таблица repair_types
Таблица repair_types содержит следующие поля:
- rep_id (integer, primary) – идентификатор вида ремонта
- rep_type (character(40)) – вид ремонта
Таблица repairs
Таблица repairs содержит следующие поля:
- car_id (integer, regular) - идентификатор машины
- mech_id (integer, regular) – идентификатор механика
- cost (integer) – цена ремонта
- date (date) – дата ремонта
3. Запросы к базе данных и интерфейс пользователя
3.1. Интерфейс пользователя
Пользовательский доступ к базе данных осуществляется с помощью меню (рис. 2). С помощью него вызываются экранные формы ввода/вывода, позволяющие производить разнообразные запросы к базе данных.
![]()
Рис. 2. Меню базы данных
- Подменю Cars позволяет добавлять, просматривать и искать по различным критериям машины (рис. 3.).
- Подменю Mechanics and repairs позволяет производить действия, связанные с механиками и ремонтом (рис. 4).

Рис. 3. Подменю Cars Рис. 4. Подменю Mechanics and repairs
3.2. Данные
Для демонстрации работы некоторых запросов в базу данных были введены данные.
На рисунках 5-9 представлены таблицы базы данных AutoDB
Рис. 5. Таблица cars

Рис. 6. Таблица car_types Рис. 7. Таблица repair_types

Рис. 8. Таблица mechanics

Рис. 9. Таблица repairs
3.3. Формы и запросы
В данном разделе рассматриваются формы, реализующие запросы, и приводятся результаты некоторых запросов применительно к данным (п. 3.2).
Добавление машины
Добавление машины производится с помощью формы form_add_car (рис. 10)

Рис. 10. Форма для добавления машины
Для выбора типа машины установлены соответствующие свойства элемента управления ComboType типа ComboBox (табл. 1).
Таблица 1. Некоторые свойства элементов управления формы form_add_car
Тип элемента управления | Объект | Свойство или функция | Значение |
СomboBox | ComboType | RowSource | Car_types. car_type, car_type_id |
RowSourceType | 6 - Fields |
Функция Click кнопки “Добавить” (mand1):
select max(car_id) from cars into array arr
dimension arrval[9]
arrval[1] = arr[1] + 1
arrval[2] = form_add_car. TextVariety. text
arrval[3] = val(boType. value)
arrval[4] = val(form_add_car. TextYear. text)
arrval[5] = val(form_add_car. TextExpl. text)
arrval[6] = form_add_car. TextPlace. text
arrval[7] = val(form_add_car. TextCost. text)
arrval[8] = val(form_add_car. TextSpeed. text)
arrval[9] = val(form_add_car. TextCap. text)
select * from cars into cursor cur where ;
variety = arrval[2] and car_type_id = arrval[3];
and manuf_place = arrval[6] and manuf_year = arrval[4];
and speed = arrval[8] and exploitation = arrval[5];
and capacity = arrval[9] and cost = arrval[7]
if reccount() > 0
if MessageBox("Такая машина уже существеут. Продолжить?",4+32)=7
else
insert into cars from array arrval
MessageBox("Машина добавлена")
endif
else
insert into cars from array arrval
MessageBox("Машина добавлена ")
Endif
При нажатии на данную кнопку осуществляется проверка на существование машины с аналогичными свойствами. Если таковая имеется, запрашивается подтверждение на добавление машины. В случае положительного ответа или в случае отсутствия аналогичной машины в базе данных осуществляется добавление машины.
Просмотр сведений о машинах машин
Просмотр сведений о машинах производится с помощью формы form_q1 (рис. 11)

Рис. 11. Форма для просмотра сведений о машинах
Таблица 2. Некоторые свойства элементов управления формы form_q1
Тип элемента управления | Объект | Свойство или функция | Значение |
ListBox | ListNames | RowSource | cars. car_id, variety |
RowSourceType | 6 - Fields |
Функция form_q1.ListNames. InteractiveChange:
select car_type, manuf_place, manuf_year, speed, cost, capacity, exploitation;
from cars_types into array arr where car_id = val(form_q1.ListNames. value)
form_q1.TextType. value = arr[1]
form_q1.TextPlace. value = arr[2]
form_q1.TextYear. value = arr[3]
form_q1.TextSpeed. value = arr[4]
form_q1.TextCost. value = arr[5]
form_q1.TextCap. value = arr[6]
form_q1.TextExpl. value = arr[7]
Список ListNames содержит марки автомобилей. При выборе одной из них производится запись свойств этой машины в массив, элементы которого записываются в свойство value элементов управления типа ListBox
Вывод отсортированных сведений о машинах
Для вывода отсортированных сведений о машинах используется форма form_q2(рис. 12)

Рис. 12. Форма для вывода отсортированных сведений о машинах
Функция Click кнопки “Показать” (form_q2.Command1):
do case form_q2.optiongroup1.option1.value = 1
select cars. manuf_year as Год_выпуска, cars. variety as Марка, cars. exploitation as Срок_эксплуатации,;
cars. manuf_place as Страна_изготовитель,;
cars. cost as Цена, cars. speed as Скорость, cars. capacity as Вместимость, car_types. car_type as Тип;
from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
order by manuf_year
case form_q2.optiongroup1.option2.value = 1
select cars. variety as Марка, cars. manuf_year as Год_выпуска, cars. exploitation as Срок_эксплуатации,;
cars. manuf_place as Страна_изготовитель,;
cars. cost as Цена, cars. speed as Скорость, cars. capacity as Вместимость, car_types. car_type as Тип;
from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
order by variety
case form_q2.optiongroup1.option3.value = 1
select cars. cost as Цена, cars. variety as Марка, cars. manuf_year as Год_выпуска,;
cars. exploitation as Срок_эксплуатации, cars. manuf_place as Страна_изготовитель,;
cars. speed as Скорость, cars. capacity as Вместимость, car_types. car_type as Тип;
from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
order by cost
case form_q2.optiongroup1.option4.value = 1
select cars. exploitation as Срок_эксплуатации, cars. cost as Цена, cars. variety as Марка,;
cars. manuf_year as Год_выпуска, cars. manuf_place as Страна_изготовитель,;
cars. speed as Скорость, cars. capacity as Вместимость, car_types. car_type as Тип;
from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
order by exploitation
case form_q2.optiongroup1.option5.value = 1
select repairs. cost as Цена_ремонта,;
cars. exploitation as Срок_эксплуатации, cars. cost as Цена, cars. variety as Марка,;
cars. manuf_year as Год_выпуска, cars. manuf_place as Страна_изготовитель,;
cars. speed as Скорость, cars. capacity as Вместимость, car_types. car_type as Тип;
from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
inner join repairs on cars. car_id=repairs. car_id;
order by repairs. cost
case form_q2.optiongroup1.option6.value = 1
select repair_types. rep_type as Вид_ремонта,;
cars. exploitation as Срок_эксплуатации, cars. cost as Цена, cars. variety as Марка,;
cars. manuf_year as Год_выпуска, cars. manuf_place as Страна_изготовитель,;
cars. speed as Скорость, cars. capacity as Вместимость, car_types. car_type as Тип;
from repairs inner join (mechanics inner join repair_types on mechanics. rep_id=repair_types. rep_id);
on repairs. mech_id=mechanics. mech_id;
inner join (cars inner join car_types on cars. car_type_id = car_types. car_type_id);
on repairs. car_id=cars. car_id order by repair_types. rep_type
endcase
Поиск доли старых машин
Поиск доли старых машин производится с помощью формы form_q3 (рис. 13)

Рис. 13. Форма для поиска доли старых машин
Функция Click кнопки “Найти” (form_q3.ButtonFind):
expl = val(form_q3.TextExpl. text)
select * from cars into cursor cur
n_all = reccount()
select * from cars into cursor cur where exploitation > expl
n_old = reccount()
res = (n_old / n_all)*100
MessageBox("Доля старых машин: " + str(res) + "%")
Результат запроса для срока эксплуатации 10 лет представлен на рис. 14:

Рис. 14. Результат поиска доли старых машин
Поиск машин по ценам
Поиск машин по ценам производится с помощью формы form_q4 (рис. 15)

Рис. 15. Форма для поиска машин по ценам
В двух следующих запросах используются соотнесенные подзапросы.
Поиск самых дорогих машин по типам (form_q4.ButtonFind1.Click):
select c_first. variety as Марка, c_first. cost as Цена, ct_first. car_type as Тип;
from cars c_first inner join car_types ct_first on c_first. car_type_id = ct_first. car_type_id;
where c_first. cost = ;
(select max(cost) from cars c_second where c_first. car_type_id = c_second. car_type_id)
Результаты запроса представлены на рис. 16.

Рис. 16. Результаты поиска самых дорогих машин по типам
Поиск самых дешевых машин по типам (form_q4.ButtonFind2.Click):
select c_first. variety as Марка, c_first. cost as Цена, ct_first. car_type as Тип;
from cars c_first inner join car_types ct_first on c_first. car_type_id = ct_first. car_type_id;
where c_first. cost = ;
(select min(cost) from cars c_second where c_first. car_type_id = c_second. car_type_id)
Следующий запрос использует группировку по типам машин.
Поиск средней стоимости машин по типам (form_q4.ButtonFind3.Click):
select car_types. car_type as Тип, avg(cars. cost) as Средняя_стоимость;
from cars right join car_types on cars. car_type_id = car_types. car_type_id group by car_types. car_type_id
Результаты запроса представлены на рис. 17.

Рис. 17. Результаты поиска средней стоимости машин по типам
Поиск машин с ценой свыше 50000, или другой суммы в зависимости от положения переключателей (form_q4.ButtonFind4.Click):
cost_lim = 50000
if form_q4.optiongroupSumm. optionSumm2.value = 1
cost_lim = val(form_q4.textSumm. text)
endif
select * from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
where cars. cost > cost_lim
Поиск машин по стране-изготовителю и цене
Поиск машин по ценам и странам производится с помощью формы form_q5 (рис. 18)

Рис. 18. Форма для поиска машин по ценам и странам
Функция Click кнопки “Найти” (form_q5.ButtonFind):
select * from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
where cars. speed > val(form_q5.textSpeed. text) and cars. manuf_place = form_q5.textCountry. text
Поиск машин по сроку эксплуатации
Поиск машин по сроку эксплуатации производится с помощью формы form_q6(рис. 19)

Рис. 19 Форма для поиска машин по сроку эксплуатации
Функция Click кнопки “Найти” (form_q6.ButtonFind):
if form_q6.optiongroup1.optionAllTypes. value = 1
select cnt(car_id) as Количество_машин from cars where exploitation = val(form_q6.textExpl. text)
else
select car_types. car_type as Тип, cnt(cars. car_type_id) as Количество;
from car_types inner join cars on car_types. car_type_id = cars. car_type_id ;
where cars. exploitation = val(form_q6.textExpl. text);
group by cars. car_type_id;
union;
select car_types. car_type as Тип, 0 as Количество;
from car_types inner join cars on car_types. car_type_id = cars. car_type_id ;
where cars. car_type_id not in(select cars. car_type_id from cars where cars. exploitation = val(form_q6.textExpl. text));
group by cars. car_type_id
endif
В данном запросе в блоке else (поиск по каждому типу) используется объединение запросов. Это необходимо для вывода типов, в которых нет машин с заданным сроком эксплуатации, т. к. первый запрос select объединения эти типы не выбирает вообще.
Результаты запроса по каждому типу со сроком эксплуатации 12 лет представлены на рис. 20.

Рис. 20. Результаты поиска машин по сроку эксплуатации
Поиск машин по вместительности и году выпуска
Поиск машин по сроку эксплуатации производится с помощью формы form_q7(рис. 21).

Рис. 21. Форма для поиска машин по вместительности и году выпуска
Функция Click кнопки “Найти” (form_q7.ButtonFind):
select * from cars inner join car_types on cars. car_type_id = car_types. car_type_id;
where cars. capacity = val(form_q7.textCap. text) and cars. manuf_year = val(form_q7.textYear. text)
Добавление механика
Добавление механика производится с помощью формы form_add_mech (рис. 22)

Рис. 22. Форма для добавления механика
Таблица 3. Некоторые свойства элементов управления формы form_add_mech
Тип элемента управления | Объект | Свойство или функция | Значение |
СomboRepType | ComboType | RowSource | repair_types. rep_type, rep_id |
RowSourceType | 6 - Fields |
Функция Click кнопки “Добавить” (mand1):
select max(mech_id) from mechanics into array arr
dimension arrval[5]
arrval[1] = arr[1]+1
arrval[2] = form_add_mech. TextName. text
arrval[3] = val(form_add_mech. TextYear. text)
arrval[4] = val(form_add_mech. TextServ. text)
arrval[5] = val(boRepType. value)
select * from mechanics into cursor cur where ;
mechanics. name = arrval[2] and born_year = arrval[3] and;
service_len = arrval[4] and rep_id = arrval[5]
if reccount() > 0
if MessageBox("Такой механик уже есть в базе. Продолжить?",4+32)=7
else
insert into mechanics from array arrval
MessageBox("Механик добавлен")
endif
else
insert into mechanics from array arrval
MessageBox("Механик добавлен")
endif
Добавление механика аналогично добавлению автомобиля.
Просмотр характеристик механиков
Просмотр характеристик механиков производится с помощью формы form_q8 (рис. 23)

Рис. 23. Форма для просмотра механиков
Таблица 4. Некоторые свойства элементов управления формы form_q8
Тип элемента управления | Объект | Свойство или функция | Значение |
ListBox | ListNames | RowSource | mechanics. mech_id, name |
RowSourceType | 6 - Fields |
Функция form_q8.ListNames. InteractiveChange:
select born_year, rep_type, service_len from mechs_reps into array arr;
where mech_id = val(form_q8.ListNames. value)
form_q8.TextYear. value = arr[1]
form_q8.TextRep. value = arr[2]
form_q8.TextServ. value = arr[3]
Алгоритм просмотра сведений о механиках аналогичен алгоритму просмотра сведений об автомобилях.
Поиск по стоимости ремонта
Поиск по стоимости ремонта производится с помощью формы form_q9 (рис. 24).

Рис. 24. Форма для поиска по стоимости ремонта
Таблица 5. Некоторые свойства элементов управления формы form_q9
Тип элемента управления | Объект | Свойство или функция | Значение |
ListBox | ListMechs | RowSource | mechanics. mech_id, name |
RowSourceType | 6 - Fields |
Поиск самого дорогого ремонта (form_q9.ButtonFind1.Click):
select repair_types. rep_type as Вид_ремонта, mechanics. name as Механик, repairs. date as Дата, repairs. cost as Цена;
from repair_types inner join mechanics on repair_types. rep_id = mechanics. rep_id;
inner join repairs on repairs. mech_id = mechanics. mech_id;
where repairs. cost = (select max(cost) from repairs)
Результаты запроса представлены на рис. 25
![]()
Рис. 25. Результаты поиска самого дорогого ремонта
Поиск самого дешевого ремонта (form_q9.ButtonFind2.Click):
select repair_types. rep_type as Вид_ремонта, mechanics. name as Механик, repairs. date as Дата, repairs. cost as Цена;
from repair_types inner join mechanics on repair_types. rep_id = mechanics. rep_id;
inner join repairs on repairs. mech_id = mechanics. mech_id;
where repairs. cost = (select min(cost) from repairs)
Два следующих запроса выполняются для всех механиков или для каждого механика в зависимости от положения переключателя.
Поиск средней стоимости ремонта (form_q9.ButtonFind3.Click):
if form_q9.optiongroup1.optionAll. value = 1
select avg(cost) as Средняя_стоимость_ремонта from repairs
else
select mechanics. name as Механик, avg(repairs. cost) as Средняя_стоимость_ремонта;
from mechanics left join repairs on mechanics. mech_id=repairs. mech_id group by mechanics. mech_id
endif
Использование left join в данном запросе обусловлено тем, что в случае существования механика, не выполнявшего ремонт вообще, при использовании inner join в результирующей таблице запроса сведения о нем будут отсутствовать. Left join позволяет включить этих механиков в результат запроса. Средняя стоимость ремонта для таких механиков будет. NULL.
Результаты запроса по всем механикам представлены на рис. 26.

Рис. 26. Результаты поиска средней стоимости ремонта
Поиск машины со стоимостью ремонта в заданных пределах (form_q9.ButtonFind4.Click):
if form_q9.optiongroup1.optionAll. value = 1
select * from cars inner join repairs on cars. car_id=repairs. car_id;
where repairs. cost between val(form_q9.textCostMin. text) and val(form_q9.textCostMax. text)
else
select * from repairs inner join cars on repairs. car_id=cars. car_id inner join mechanics on repairs. mech_id=mechanics. mech_id;
where (repairs. cost between val(form_q9.textCostMin. text) and val(form_q9.textCostMax. text)) and mechanics. name = form_q9.listMechs. value
endif
Поиск данных за период времени
Для поиска данных за период используется форма form_q10 (рис. 27)

Рис. 27. Форма для поиска данных за период
Функция Click кнопки “Найти” (form_q10.Command1):
if form_q10.optiongroup2.optionMonth. value=1
month_minus = 1
else
month_minus = 3
endif
if month(date()) <= month_minus
date_min = date(year(date())-1,12+month(date())-month_minus, day(date()))
else
date_min = date(year(date()),month(date())-month_minus, day(date()))
endif
if form_q10.optiongroup1.optionQuan. value=1
select cnt(cost) as Количество_отремонтированных_машин from repairs where repairs. date between date_min and date()
else
select avg(cost) as Средняя_стоимость_ремонта from repairs where repairs. date between date_min and date()
endif
Временной интервал отсчитывается от текущей даты. Второй блок if вычисляет правильную граничную дату date_min.
Результат поиска количества отремонтированных машин за квартал представлен на рис. 28.
![]()
Рис. 28. Результат поиска количества отремонтированных машин за квартал
Поиск доли дешевых по стоимости ремонта машин
Для поиска доли дешевых по стоимости ремонта машин используется форма form_q11 (рис. 29).

Рис. 29. Поиск дешевых по стоимости ремонта машин
Так как каждая машина может ремонтироваться несколько раз, подсчет процента дешевых машин производится не от количества машин, а от количества ремонтов.
Функция Click кнопки “Найти” (form_q11.Command1):
if form_q11.optiongroup1.optionAll. value = 1
select * from repairs into cursor cur
n_all = reccount()
select * from repairs into cursor cur where cost < val(form_q11.textMaxCost. text)
n_chip = reccount()
messagebox(str((n_chip/n_all)*100) + "%", "Доля дешевых ремонтов")
else
select * from mechanics into cursor cur
n_types = reccount()
strRes = ""
for i=0 to n_types-1
n_chip=0
select mechanics. name from mechanics into array arr_name where mechanics. mech_id = i;
n_all = 0
select * from mechanics inner join repairs on mechanics. mech_id=repairs. mech_id into cursor cur1;
where mechanics. mech_id = i
n_all = reccount()
select * from cur1 into cursor cur2 where cost < val(form_q11.textMaxCost. text)
n_chip = reccount()
if n_all>0
strRes = strRes + alltrim(arr_name[1]) + ":" + str((n_chip/n_all)*100) + "%" + "; "
else
strRes = strRes + alltrim(arr_name[1]) + ": - " + "; "
endif
endfor
MessageBox(strRes, "Доля дешевых ремонтов для механиков")
endif
В данном запросе в цикле производится подсчет доли дешевых по стоимости ремонта машин для каждого механика. На каждой итерации цикла запрашивается ФИО механика, количество ремонтов для механика вообще и количество дешевых ремонтов. Вычисляется необходимая величина и вместе с ФИО добавляется к результирующей строке, которая выводится с помощью MessageBox.
Результаты запроса для каждого механика и ограничения в 5000 представлены на рис. 30.

Рис. 30. Результаты поиска доли дешевых по стоимости ремонта машин
Поиск механиков, стаж которых лежит в заданных пределах для заданного вида ремонта
Для поиска механиков по стажу используется форма form_q12 (рис. 31).

Рис. 29. Форма для поиска механиков по стажу
Таблица 6. Некоторые свойства элементов управления формы form_q12
Тип элемента управления | Объект | Свойство или функция | Значение |
ListBox | ListRepTypes | RowSource | repair_types. rep_type |
RowSourceType | 6 - Fields |
Функция Click кнопки “Найти” (form_q12.Command1):
select * from mechanics inner join repair_types on mechanics. rep_id = repair_types. rep_id;
where repair_types. rep_type = form_q12.ListRepTypes. value and;
mechanics. service_len between val(form_q12.textMin. text) and val(form_q12.textMax. text)
Добавление ремонта
Для добавления ремонта используется форма form_add_repair (рис. 32)

Рис. 32. Форма для добавления ремонта
Таблица 7. Некоторые свойства элементов управления формы form_add_repair
Тип элемента управления | Объект | Свойство или функция | Значение |
ListBox | ListCars | RowSource | cars. car_id, variety, manuf_year, exploitation, cost |
RowSourceType | 6 - Fields | ||
ListMechs | RowSource | mechs_reps. mech_id, name, born_year, service_len, rep_type | |
RowSourceType | 6 - Fields |
Добавление происходит следующим образом. Пользователь выбирает механика и машину из соответствующих списков, вводит дату и стоимость ремонта и нажимает на кнопку добавить. Таким образом, в таблицу может быть добавлен только ремонт уже существующей в базе данных машины существующим в базе данных механиком.
Функция Click кнопки “Добавить” (form_q11.Command1):
dimension arrval[4]
arrval[1] = val(form_add_repair. ListCars. value)
arrval[2] = val(form_add_repair. ListMechs. value)
arrval[3] = val(form_add_repair. TextCost. text)
arrval[4] = date(val(form_add_repair. TextYear. text), val(form_add_repair. TextMonth. text),val(form_add_repair. TextDay. text))
select * from repairs into cursor cur where ;
car_id = arrval[1] and cost = arrval[3] and ;
repairs. date = arrval[4] and mech_id = arrval[2]
if reccount() > 0
if MessageBox("Такой ремонт уже существует. Продолжить?",4+32)=7
else
insert into repairs from array arrval
MessageBox("Ремонт успешно добавлен")
endif
else
insert into repairs from array arrval
MessageBox("Ремонт успешно добавлен")
Endif
Добавление ремонта происходит по тому же алгоритму, что и добавление механика и автомобиля.
Просмотр сведений о ремонтах
Просмотр сведений об имеющихся в базе данных ремонтах осуществляется с помощью процедуры, вызываемой непосредственно из меню:
select cars. variety as Марка_машины, car_types. car_type as Тип_машины, mechanics. name as ФИО_механика,;
repair_types. rep_type as Вид_ремонта, repairs. date as Дата_ремонта, repairs. cost as Цена_ремонта from;
repairs inner join (mechanics inner join repair_types on mechanics. rep_id=repair_types. rep_id);
on repairs. mech_id=mechanics. mech_id;
inner join (cars inner join car_types on cars. car_type_id = car_types. car_type_id);
on repairs. car_id=cars. car_id order by repairs. data
Данный запрос объединяет все таблицы базы данных в одну и выводит некоторые поля полученной таблицы. В нем используются вложенные inner join, результаты которых являются аргументами для других inner join.
Результат запроса представлен на рис. 33.

Рис. 33. Результат запроса на просмотр сведений о ремонтах
4. Выводы
В результате данной работы была создана база данных AutoDB, содержащая сведения о машинах, их ремонте и механиках. Доступ пользователя к базе данных осуществляется с помощью меню, которое содержит все необходимые команды. Были сделаны следующие выводы:
- Структура базы данных зависит от характера задач, которые она решает. При одном и том же задании необходимо определять дополнительные условия и требования для лучшей структуризации данных и для предотвращения повторения информации.
- Один и тот же запрос можно реализовать по-разному. В случае простых запросов вариантов возникает немного, но если запрос сложный, выбор усложняется. Зачастую сложный поиск данных, состоящий из нескольких запросов и использующий циклы и условия, можно упростить с помощью соотнесенных подзапросов, объединения запросов, группировки данных и т. д.
- Иногда достаточно сложно организовать вывод данных в таблицу. В этом случае удобно использовать встроенные средства среды программирования, такие как MessageBox.
- Использование меню позволяет определить диапазон действий, которые доступны пользователю. Формы помогают сделать работу с базой данных интуитивно понятной.
- Связывание элементов управления с таблицей позволяет выводить данные или структуру таблицы в списках и других элементах управления, что облегчает взаимодействие пользователя с базой данных.


