Практическое занятие № 23
Формирование выходной информации
Цель: Приобрести практические навыки по созданию клиентского приложения WINDOWSFORMS, взаимодействующего с таблицами базы данных, реализующими отношение M:N
ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛ
Связь между двумя таблицами с отношением M:N реализуется в реляционной модели данных через третью таблицу-связку.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Добавить в БД PERSONAL новую таблицу COURSE для хранения информации о курсах повышения квалификации сотрудников:
Таблица COURSE
Поле | Тип данных | Разрешить NULL | Назначение |
ID | int | нет | Первичный ключ |
NAME | nvarchar(200) | нет | Наименование курса повышения квалификации |
ABOUT | nvarchar(1000) | да | Описание курса повышения квалификации |
Записи таблицы COURSE связаны отношением M:N с таблицей PERSONAL (одни курсы повышения квалификации могут проходить несколько сотрудников, и один сотрудник может обучаться на разных курсах).
2. Для реализации данного отношения добавить в БД новую таблицу-связку TRAINING. Эта таблица предназначена хранения информации о прохождении курсов повышения квалификации нашими сотрудниками:
|
|
Таблица TRAINING
Поле | Тип данных | Разрешить NULL | Назначение |
DATE_BEG | smalldatetime | да | Дата начала курсов |
DATE_END | smalldatetime | да | Дата окончания курсов |
DOCUM | nvarchar(50) | да | Выдаваемый документ по окончанию курсов |
LENGTH_CRS | int | да | Длительность курсов в учебных часах |
COST | money | да | Стоимость курса |
FULLTIME | bit | да | Очное/Заочное обучение |
PERS_CODE | int | нет | Внешний ключ на таблицу PERSONAL |
COURSE_CODE | int | нет | Внешний ключ на таблицу COURSE |
В таблице TRAINING будет составной первичный ключ, включающий поля PERS_CODE,
COURSE_CODE.
После внесения всех изменений схема данных будет иметь вид:
Рис. 1
3. После завершения операций по изменению структуры БД, открыть приложение из предыдущего практического занятия.
В окне Data Source откройте конфигурацию для набора данных PERSONALDataSet (Рис. 2).
Рис. 2
Проставьте галочки напротив новых таблиц БД для их добавления в PERSONALDataSet. После завершения конфигурации у нашего PERSONALDataSet должна отобразится следующая схема данных (Рис. 3):
Рис. 3
4. Откройте основную форму (с меню) и добавьте новый подпункт в меню «Справочники» - «Курсы»:
Рис. 4
Создайте новую форму для справочника курсов (Рис. 5).
Рис. 5
Для подключения элементов интерфейса основной формы (Form1) к таблице COURSE, для начала необходимо разместить на форме (Form1) объект bindingSource из ToolBox. Установите для него следующие значения свойств (Рис. 6):
|
|
Рис. 6
Программный код для соответствующего пункта меню основной формы - отображения окна справочника «Курсы повышения квалификации»:
Разместите на форме Form1 с панели инструментов Toolbox компонент groupBox1 с заголовком «Прохождение курсов повышения квалификации» (свойство Text).
Выберете в окне Data Sources для таблицы TRAINING внутри таблицы PERSONAL (Рис. 7) форму представления данных DataGridView (чтобы показывались данные о пройденных курсах сотрудником организации):
Рис. 7
И перенесите, удерживая левую кнопку мыши, на groupBox1. В результате получится форма (Рис. 8).
Рис. 8
Обратите внимание, что BindingNavigator для таблицы TRAINING не был размещен.
Добавим его сами. Для этого выделите pERSONALBindingNavigator на нашей главной форме и нажмите на нем правую кнопку мыши - выберете команду копировать (Copy).
Затем на groupBox1 нажмите правую кнопку мыши и выберете команду вставить (Paste). В результате будет добавлен bindingNavigator1. Для bindingNavigator1 укажите:
- свойство Name в tRAININGBindingNavigator;
- в свойстве BindingSource укажите tRAININGBindingSource для привязки к таблице
TRAINING (Рис. 9):
Рис. 9
Для кнопки сохранения добавленного нами tRAININGBindingNavigator введите следующий код:
В окне основной формы Form1 выделите невизуальный объект tableAdapterManager (Рис. 10). TableAdapterManager — это компонент, который предоставляет функции сохранения данных в соответствующих таблицах данных. TableAdapterManager использует связи внешнего ключа, которые связывают таблицы данных для определения правильного порядка отправки команд
Insert, Update и Delete из набора данных в базу данных без нарушения ограничения внешнего ключа (ссылочная целостность) в базе данных.
Рис. 10
Так как в основном окне мы теперь будем редактировать данные из двух таблиц PERSONAL и TRAINING, необходимо для объекта tableAdapterManager указать соответствующие адаптеры таблиц (Рис. 11):
Рис. 11
Запустите программу и посмотрите, как отображаются данные в новой таблице на форме. Обратите внимание, что показываются курсы, на которых обучался только выбранный сотрудник (Рис. 12):
Рис. 12
Оформим tRAININGDataGridView (Edit Columns):
1) добавим заголовки колонок на русском языке;
2) уберем колонку PERS_CODE – это служебное поле внешнего ключа (будет заполняться автоматически);
3) для поля DOCUMENT (Выдаваемый документ по окончанию курсов) укажите тип колонки: DataGridViewComboBoxColumn (Рис. 13) и DisplayStyle = Nothing.
Рис. 13
В свойстве Items укажите:
Рис. 14
Теперь в приложении это поле будет выглядеть так (Рис. 15):
Рис. 15
4) для поля COST (Стоимость курса) укажите денежный формат – свойство DefaultCellStyle (Рис. 16):
Рис. 16
Теперь в приложении это поле будет выглядеть так (Рис. 17):
Рис. 17
6) к полю COURSE_CODE (Внешний ключ на таблицу COURSE) подключим таблицу COURSE (Курсов), чтобы пользователь мог выбрать курс из соответствующий таблицы БД.
Для поля COURSE_CODE укажите тип колонки: DataGridViewComboBoxColumn, DisplayStyle = Nothing и установите следующий набор свойств (эти свойства аналогичны тем, что мы использовали в предыдущей работе для оформления выпадающего списка для поля «Отдел»):
Рис. 18
Теперь в приложении это поле будет выглядеть так (Рис. 19):
Рис. 19