- •Пояснительная записка
- •Введение
- •Анализ предметной области
- •Структура базы данных
- •Клиент для работы с бд
- •Меню соединения с базой данных
- •Главное меню приложения
- •Просмотр базы данных
- •Регистрация ремонтов
- •План на текущий месяц
- •Просроченные ремонты
- •Анализ видов ремонта
- •По срокам
- •По дате окончания
- •По стоимости
- •Поиск ремонтов
- •По виду
- •По марке
- •За период
- •За все время
- •За месяц
- •Заключение
- •Источники
Регистрация ремонтов
Форма регистрации ремонтов создана для более удобного редактирования существующих и добавления новых записей в таблицу ремонтов. Она предоставляет более наглядный способ заполнения полей в записях. Внешний вид формы:
Как видно по скриншоту, данное окно позволяет задать все поля для новой строки в таблице REPAIR. При этом выбор станка и типа ремонта производится из ниспадающих списков, которые берут свои данные из таблицMACHINEиREPAIRTYPEсоответственно. Для инициализации компонентов формы при загрузке приложения вызывается методregistration_load():
/* загрузка страницы регистрации ремонтов */
private void registration_load() {
bsRepairs.DataSource = dtRepair;
//связь ComboBox'ов с нужными полями в таблицах
comboRegMachine.DataSource = dtMachine;
comboRegMachine.DisplayMember = "MACHINE_CODE";
comboRegRepairType.DataSource = dtRepairType;
comboRegRepairType.DisplayMember = "REPAIRTYPE_NAME";
//установка текущих значений
repairs_current_changed();
}
Для того, чтобы в данных компонентах при перемещении по таблице отображались правильные данные, при нажатии на кнопки перехода к следующей / предыдущей записям вызывается метод repairs_current_changed():
/* регистрация ремонтов - обновление всех полей формы */
private void repairs_current_changed() {
//выбранная в навигаторе строка
DataRowView cur_drw = (DataRowView)bsRepairs.Current;
DataRow drow = cur_drw.Row;
string machine_code = drow.Field<string>("MACHINE_CODE");
set_machine_combo_to(machine_code);
int repairtype_code = drow.Field<int>("REPAIRTYPE_CODE");
set_repairtype_combo_to(repairtype_code);
DateTime date = drow.Field<DateTime>("REPAIR_STARTDATE");
set_date_field_to(date);
string note = drow.Field<string>("REPAIR_NOTE");
set_note_field_to(note);
string done = drow.Field<string>("REPAIR_DONE");
set_done_field_to(done);
//сброс флагов изменения и новой строки
reg_repair_changed = false;
reg_new = -1;
}
Данный метод последовательно обновляет все поля формы в соответствии с информацией, содержащейся в текущей (выбранной) строке таблицы.
При нажатии на кнопку «OK» формы сначала производится проверка, какое действие совершил пользователь – модификацию записи или добавление новой записи. В зависимости от этого выбираются дальнейшие действия. Если была осуществлена модификация, то происходит простое обновление данных в БД. Если вставка записи, то формируетсяinsert-запрос на добавление новой строки с параметрами, выбранными пользователем в компонентах формы:
Код SQL-запроса:
insert into repair(MACHINE_CODE,
REPAIRTYPE_CODE,
REPAIR_STARTDATE,
REPAIR_NOTE,
REPAIR_DONE)
values (:machine_code,
:reptype_code,
:startdate,
:note,
:done)
Реализация в приложении:
private void tsRepair_OK_Click(object sender, EventArgs e) {
//если была вставка новой строки
if (reg_new != -1) {
//извлечение кода станка
DataRowView machine_rowview =
(DataRowView)comboRegMachine.SelectedItem;
DataRow machine_row = machine_rowview.Row;
string machine_code = machine_row.Field<string>("MACHINE_CODE");
//извлечение кода ремонта
DataRowView reptype_rowview =
(DataRowView)comboRegRepairType.SelectedItem;
DataRow reptype_row = reptype_rowview.Row;
int reptype_code = reptype_row.Field<int>("REPAIRTYPE_CODE");
/*
... и т.д для всех полей
*/
//запись результатов в БД
OleDbCommand cmd = new OleDbCommand("<код запроса>", con, trans);
cmd.Parameters.AddWithValue("machine_code", machine_code);
cmd.Parameters.AddWithValue("reptype_code", reptype_code.ToString());
cmd.Parameters.AddWithValue("startdate", dt.ToShortDateString());
cmd.Parameters.AddWithValue("note", note);
cmd.Parameters.AddWithValue("done", done);
cmd.ExecuteNonQuery();
}
adRepair.Update((DataTable)bsRepairs.DataSource);
dtRepair.Clear();
adRepair.Fill(dtRepair);
bsRepairs.MoveLast();
dtMachine.Clear();
adMachine.Fill(dtMachine);
reg_repair_changed = false;
reg_new = -1;
}
Для удобства чтения исходного кода здесь и в дальнейшем текст запроса во вставках будет заменяться строкой <текст запроса>.
Если данные в строке были изменены, но пользователь не нажал «OK», показывается диалоговое окно, в котором он должен выбрать, сохранить сделанные изменения или нет:
В зависимости от выбранного варианта происходит либо откат изменений, либо вызов приведенной выше функции сохранения.