- •Пояснительная записка
- •Введение
- •Анализ предметной области
- •Структура базы данных
- •Клиент для работы с бд
- •Меню соединения с базой данных
- •Главное меню приложения
- •Просмотр базы данных
- •Регистрация ремонтов
- •План на текущий месяц
- •Просроченные ремонты
- •Анализ видов ремонта
- •По срокам
- •По дате окончания
- •По стоимости
- •Поиск ремонтов
- •По виду
- •По марке
- •За период
- •За все время
- •За месяц
- •Заключение
- •Источники
Поиск ремонтов
Данный пункт меню дает пользователю возможность просматривать зарегистрированные в системе ремонты, фильтруя их по различным параметрам, таким как вид ремонта, марка ремонтируемого станка, дата регистрации. Это меню состоит из нескольких подпунктов:
По виду
В данном пункте меню реализуется функция просмотра ремонтов из таблицы REPAIRтолько одного конкретного вида. Вид ремонта задается пользователем через выпадающий список. Вид формы:
Помимо всех ремонтов заданного вида на форме отображается общая сумма этих ремонтов. Таким образом, форма для своей работы использует сразу два запроса, на поиск ремонтов и на вычисление их общей стоимости.
Запрос на поиск ремонтов:
select r.REPAIR_STARTDATE,
r.MACHINE_CODE,
rt.REPAIRTYPE_NAME,
rt.REPAIRTYPE_COST,
r.REPAIR_DONE,
r.REPAIR_NOTE
from REPAIR r
inner join REPAIRTYPE rt
on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE
where rt.REPAIRTYPE_CODE = :rt_code
order by REPAIR_STARTDATE asc
Запрос выбирает из REPAIRвсе ремонты, код вида ремонта которых равен заданному пользователем (параметр:rt_codeопределяется через выбранный элемент выпадающего списка). Второй запрос аналогичен этому, но вместо выборки всех ремонтов, удовлетворяющих условию, он вычисляет их общую стоимость:
select
case
when (sum(rt.REPAIRTYPE_COST) is null)
then 0
else
sum(rt.REPAIRTYPE_COST)
end as S
from REPAIR r
inner join REPAIRTYPE rt
on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE
where rt.REPAIRTYPE_CODE = :rt_code
Для того, чтобы результат мог корректно отобразиться в текстовом поле, значение null, возвращаемое запросом, заменяется на 0.
Реализация в приложении:
/* просмотр ремонтов по виду */
private void btnRepairTypeOK_Click(object sender, EventArgs e) {
// извлечение выбранного типа из comboBox'а
DataRowView drw_type = (DataRowView)comboRepairType.SelectedItem;
DataRow dr_type = drw_type.Row;
int repairtype_code = dr_type.Field<int>("REPAIRTYPE_CODE");
// запрос и заполнение таблицы
OleDbCommand cmd = new OleDbCommand("<текст запроса 1>", con, trans);
cmd.Parameters.AddWithValue("rt_code", repairtype_code.ToString());
OleDbDataAdapter ad = new OleDbDataAdapter(cmd);
dtRepairTypeQ.Clear();
ad.Fill(dtRepairTypeQ);
dgRepairType.DataSource = dtRepairTypeQ;
ad.Dispose();
cmd.Dispose();
// запрос на вычисление суммы
cmd = new OleDbCommand("<текст запроса 2>", con, trans);
cmd.Parameters.AddWithValue("rt_code", repairtype_code.ToString());
ad = new OleDbDataAdapter(cmd);
dtRepairTypeQSum.Clear();
ad.Fill(dtRepairTypeQSum);
txtRepairTypeSum.Text
= ((decimal)dtRepairTypeQSum.Rows[0]["S"]).ToString();
cmd.Dispose();
ad.Dispose();
}
Пример работы запроса:
По марке
На этой форме реализуется фильтр ремонтов по марке станка. Внешний вид формы аналогичен предыдущей, за исключением того, что в ComboBox'е предоставляется выбор не вида ремонта, а марки ремонтируемого станка. Интерфейс формы с уже выполненным запросом:
Здесь также используются два запроса: на выбор ремонтов и на вычисление их общей стоимости.
Запрос на выбор ремонтов по марке станка:
select r.MACHINE_CODE,
rt.REPAIRTYPE_NAME,
rt.REPAIRTYPE_COST,
r.REPAIR_STARTDATE,
r.REPAIR_DONE,
r.REPAIR_NOTE
from REPAIR r
inner join REPAIRTYPE rt
on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE
inner join MACHINE m
on r.MACHINE_CODE = m.MACHINE_CODE
inner join MACHINE_TYPE mt
on m.MACHINETYPE_CODE = mt.MACHINETYPE_CODE
inner join MARK mk
on mt.MARK_CODE = mk.MARK_CODE
where mk.MARK_CODE = :mark_code
Запрос на вычисление общей стоимости:
select
case
when (sum(rt.REPAIRTYPE_COST) is null)
then 0
else
sum(rt.REPAIRTYPE_COST)
end as S
from REPAIR r
inner join REPAIRTYPE rt on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE
inner join MACHINE m on r.MACHINE_CODE = m.MACHINE_CODE
inner join MACHINE_TYPE mt on m.MACHINETYPE_CODE = mt.MACHINETYPE_CODE
inner join MARK mk on mt.MARK_CODE = mk.MARK_CODE
where mk.MARK_CODE = 5
Реализация данной функции в программе идентична предыдущему пункту, разница только в текстах запросов, передаваемых объектам OleDbCommand.