Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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.

-  Использование меню позволяет определить диапазон действий, которые доступны пользователю. Формы помогают сделать работу с базой данных интуитивно понятной.

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