Производственная практика программиста. Пермский национальный исследовательский политехнический университет (пнипу)
Скачать 0.5 Mb.
|
Разработка приложения В рамках практики создан прототип приложения, работающего с системой заказа печатных плат, в соответствии с требованиями руководителя практики от предприятия. В качестве платформы для разработки программного решения выбрана Windows Presentation Foundation, язык программирования – C#, среда разработки – Visual Studio (версия Community 2017 года). В дальнейшем планировался переход БД с MS Access на Firebird. Технические характеристики рабочего места: Компьютер №138, OC Windows 7 Корпоративная версия 2009 Service Pack 1 Процессор – Intel(R) Core(TM)2 Duo CPU E8500 3.16GHz Оперативная память – 8 гб Тип системы – 64 разрядная ОС Жесткий диск – 512 мб На основании анализа карточки заказа были разработаны соответствующая модель данных, реализованная в виде системы взаимосвязанных таблиц в MS Access, и взаимодействующее с ними приложение. Рис. Схема данных БД Структура таблиц следующая: таблица [Cards] хранит сами карточки, таблица [Files] хранит даты заказов, таблица [File_names] содержит имена файлов, привязанных к определенной дате, а таблица [Annotations] включает в себя примечания к файлам. Все поля в таблицах имеют тип данных «короткий текст» за исключением ключевых полей-счетчиков ID и связанных с ними полей числового типа (например, ID_карты). В коде приложения реализованы такие стандартные функции, как создание, редактирование, отображение и удаление элементов, а также их фильтрация, в частности: Создание карточки заказа Редактирование атрибутов карточки Добавление нового набора файлов к карточке по дате Включение в набор новых файлов Редактирование примечаний к файлам Удаление карточек Удаление наборов и файлов, связанных с карточкой Поиск карточек по номеру ПП Созданы вспомогательные классы для работы с ключевыми объектами и их свойствами – Card, myItem, fn и rn. Так, класс Card воплощает структуру таблицы [Cards], класс myItem – таблицы [Files], класс fn – таблицы [Annotations] и класс rn – таблицы [File Names]. С целью продемонстрировать взаимосвязь классов и работу программы с источником данных, рассмотрим функцию GetDataCards(), предназначенную для считывания информации о карточках из БД, а также заполнения соответствующего списка для работы с ними. Первым делом необходимо установить соединение с самой БД. Для этого создается экземпляр специализированного класса OleDbConnection, предназначенного для работы с подключением к источнику данных, и если попытка заканчивается успешно, то мы открываем соединение и выполняем запрос к таблице [Cards]. Если же нам не удалось подключиться в первый раз, устанавливается временная задержка в 199 мс, после которой программа попробует установить соединение еще 5 раз (используем переменную-счетчик ErC). Если подключиться к БД так и не удалось, программа выдает сообщение об ошибке и сбрасывает соединение. Применяя оператор using, нам не приходится хранить в памяти каждое подключение, а использование оператора try-catch позволяет установить допустимое время соединения с БД и известить пользователя об ошибке в случае ее возникновения. В качестве параметра в конструктор класса OleDbConnection передается строка вида: "Provider=Microsoft.ACE.OLEDB.12.0; DataSource="+Environment.CurrentDirectory +\\DB.accdb, где Provider означает имя поставщика OLE DB, а Environment.CurrentDirectory – путь к текущей папке, где находится запускаемый файл. SQL запрос: SELECT * FROM Cards – выделение всех записей в таблице [Cards]. Соответствующие запросы будут генерироваться для связанных с карточкой данных. При выполнении запросов создается объект класса OleDbDataReader (присваиваем в него результат выполнения функции ReadCommand(), которая формирует команду, используя подключение и текст запроса, и строит на ее основе DataReader) и при помощи цикла while(reader.Read()) построчно считывается ответ из БД. В процессе чтения происходит создание нового экземпляра класса cardи заполнение его свойств, а также всех связанных с ним объектов из других таблиц (для каждого создается свой reader). Для инициализации каждой карточки используются вложенные циклы, работающие по следующей схеме: ДЛЯ КАЖДОЙ (карточки -> ДЛЯ КАЖДОГО (набора (даты) -> ДЛЯ КАЖДОГО (файла -> ДОБАВИМ ВСЕ ЕГО (примечания)))). Код функции можно посмотреть в приложении 1. После окончания разработки прототипа требования к модели данных усложнились, и помимо самих карточек добавились еще несколько новых сущностей (конструктор, версия, изделие, извещение, заказ печатной платы, изготовитель, предприятие-абонент). Сама схема и ее описание, а также описание связи между сущностями приводятся в главе «Заказы ПП». Пользовательский интерфейс При запуске приложения на главном окне в элементе управления listBox будут отображаться все созданные пользователем карточки, кнопки добавления новой даты и нового имени файла заблокированы. Если нажать на одну из карточек, информация о ней отобразиться в специализированных полях ввода, расположенных под listBox, а также в таблице listViewer, где будут показаны отсортированные по дате наборы файлов с примечаниями к ним. Рис. Вид главного окна приложения Для того чтобы изменить один из атрибутов карточки (например, фамилию конструктора), необходимо дважды нажать на соответствующее поле ввода. Закончив корректировку нужного атрибута и убрав фокус с поля ввода, пользователь сможет увидеть внесенные изменения. Также у пользователя есть возможность добавить новую дату в карточку: для этого необходимо выделить нужную карточку, ввести дату в поле ввода «Дата» и нажать на кнопку «Добавить». Для добавления файла к дате в таблице выделяется любая строка, информация о файле заносится в соответствующие поля ввода внизу формы (кроме «Дата») и нажимается кнопка «Добавить имя файла». Важно заполнять все поля, и, если одно из полей содержит несколько записей (например, два изготовителя), информацию необходимо прописать для каждой из них. Рис. Отображение блока файлов, входящих в карточку Вверху окна расположена форма для создания новой карточки. Чтобы раскрыть ее, достаточно нажать на кнопку с двунаправленной стрелкой. После заполнения всех полей и нажатия на кнопку «Добавить», новая карточка отобразится вместе со всеми остальными. Рис. Форма создания новой карточки Карточки можно удалять – для этого необходимо выделить нужную карточку в listBox и нажать на нее правой кнопкой мыши, тем самым открывая контекстное меню с одним единственным пунктом «Удалить». Тот же механизм работает и для удаления файлов по дате, только выделяется соответствующая строка в таблице. Но помимо этого данные по файлам можно редактировать, выбрав в контекстном меню пункт «Редактировать». Тогда откроется новое окно для внесения изменений, где из списка файлов, перечисленных в элементе comboBox (выпадающий список), можно выбрать любой из них и отредактировать все необходимые значения. Под самим comboBox расположено поле для изменения названия файла (вместо двух щелчков достаточно нажать один раз), а справа – столбцы, напоминающие шапку таблицы, но с возможностью редактировать содержимое. Нажав на кнопку «Изменить» и заново выбрав нужную карту, можно посмотреть обновленные данные в таблице. Рис. Вид окна изменения примечаний к файлам Форма будет автоматически обновляться при внесении любых изменений (кроме редактирования атрибутов карточек), однако если в «Строке для поиска» что-либо введено, все карточки, содержащие в своем номере ПП данную комбинацию символов, будут показаны в listBox (по умолчанию отображаются все имеющиеся карточки). «Строкой поиска» можно воспользоваться в любой момент, если пользователю понадобится найти какую-либо определенную карточку. Если при расширении какого-либо элемента окна все остальное содержимое выходит за его пределы, автоматически появляется полоса прокрутки, которую дополнительно можно прокручивать при помощи колесика мышки. Полоса прокрутки (scrollViewer) также добавлена для таблицы и у полей ввода, расположенных под таблицей (максимальное количество записей, одновременно отображаемых в поле, составляет четыре). |