Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования Самарский государственный аэрокосмический университет имени академика С.П.Королёва Факультет информатики Кафедра информационных систем и технологий Пояснительная записка к курсовому проекту по курсу: “Проектирование БД” Вариант № 18 Выполнил: Федькаев А.В. студент группы 651 Руководитель проекта: Чигарина Елена Ивановна Самара 2008 РЕФЕРАТ Курсовой проект. Пояснительная записка: 16 стр., 13 рис., 2 ист. БАЗА ДАННЫХ, КОНЦЕПТУАЛЬНАЯ МОДЕЛЬ, ЛОГИЧЕСКАЯ МОДЕЛЬ, ФИЗИЧЕСКАЯ МОДЕЛЬ, МЕТОДОЛОГИЯ, SQL, ЗАПРОС, КУРСОР, ТРИГГЕР, НОРМАЛЬНАЯ ФОРМА, КОРТЕЖ, ДОМЕН С помощью CASE – средства ERWin построена логическая модель базы данных в методологии IDEF1X. Осуществлен переход от логической модели базы данных к физической и построена схема базы данных в СУБД Visual FoxPro и MS Access. Разработано два пользовательских приложения. 2 СОДЕРЖАНИЕ ЗАДАНИЕ 4 1. Описание предметной области 5 2. Логическая модель базы данных 5 3. Реализация проекта средствами FoxPro 4. 3.1. Физическая модель базы данных 3.2. Код приложения 6 3.2.1. Работа со справочной информацией 6 3.2.2. Работа с оперативной информацией 7 3.2.3. Составление отчета №2 9 3.2.4. Составление отчета №1 9 3.2.5. Составление отчета №3 10 Разработка приложения в среде MS Access 2003 и Delphi 7 4.1. Физическая модель базы данных 12 4.2. Интерфейсы системы 12 4.3. Код приложения 4.3.1. Составление отчета №1 15 4.3.2. Составление отчета №2 15 4.3.3. Составление отчета №3 15 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 16 3 ЗАДАНИЕ По описанию предметной области построить логическую модель базы данных по методологии IDEF1X. От логической модели перейти к физической модели. По физической модели сгенерировать схему базы данных в СУБД FoxPro и Access. Создать приложение средствами FoxPro. Создать приложение средствами Delphi, используя технологию ADO для доступа к данным, хранящимся в формате Access. Для каждого приложения разработать интерфейс пользователя, обеспечить ограничения целостности данных и удобные средства ведения данных. 4 1. Описание предметной области В городской администрации хранится информация о фирмах, занимающихся распространением компьютерной техники. Каждая фирма характеризуется названием, адресом, ФИО директора. Каждая фирма имеет сотрудников, характеризующихся ФИО, должностью, окладом. Каждая фирма имеет прайс-лист по имеющемуся в продаже товару. Фирма кроме того характеризуется формой собственности, общей площадью помещений, общим числом сотрудников. Запросы: 1. Вывести сведения в виде отчёта о фирмах, сгруппировав их по форме собственности. 2. Вывести сведения о сотрудниках указанной фирмы. 3. Вывести сведения о площадях фирм, расположенных в указанном районе. 2. Логическая модель базы данных Используя CASE – средство ERWin построим логическую модель базы данных в методологии IDEF1X. Результат моделирования представлен на рисунке 1. Рисунок 1 – Логическая структура базы данных 5 3. Разработка приложения в среде MS FoxPro v.8.0 3.1. Физическая модель базы данных Перейдем от логической модели базы данных к физической модели. По физической модели сгенерируем схему базы данных в СУБД Visual FoxPro. Дополним полученную схему связями. Схема БД показана на рисунке 2. Рисунок 2 – Физическая структура БД для реализации MS FoxPro 8.0 3.2. Код приложения Приложение реализовано в среде MS Visual FoxPro v.8.0 3.2.1 Работа со справочной информацией, на примере справочника “Район” Нажатие кнопки “Добавить” thisformset.fInput.tInput.Value = '' thisformset.command = 0 thisformset.fInput.Visible = .T. thisform.Enabled = .F. Нажатие кнопки “Изменить” thisformset.fInput.tInput.Value = thisform.gData.column1.text1.Value thisformset.command = 1 thisformset.fInput.Visible = .T. thisform.Enabled = .F. Нажатие кнопки “Удалить” DELETE FROM dst WHERE name_distr = thisformset.fRef.gData.column1.text1.Value thisform.Refresh Нажатие кнопки “Применить” 6 cmm = thisformset.command IF NOT EMPTY(thisform.tInput.Value) then TRY DO CASE CASE cmm = 0 INSERT INTO dst (name_distr) VALUES (thisform.tInput.Value) CASE cmm = 1 oldname = thisformset.fRef.gData.column1.text1.Value newname = thisform.tInput.Value UPDATE dst SET name_distr = newname WHERE name_distr = oldname ENDCASE thisform.Visible = .F. thisformset.fRef.Enabled = .T. thisformset.fRef.Refresh CATCH MESSAGEBOX("Íåêîððåêòíûé ââîä") ENDTRY ENDIF 3.2.2 Работа с оперативной информацией о фирмах Форма “Фирмы” Нажатие кнопки “Добавить” thisformset.fInput.tName.Value = '' thisformset.fInput.tAddr.Value = '' thisformset.fInput.cType.Value = '' thisformset.fInput.cDistr.Value = '' thisformset.fInput.tDirect.Value = '' thisformset.fInput.sArea.Value = 0 thisformset.fInput.sStaff.Value = 0 thisformset.command = 0 thisformset.fInput.Visible = .T. thisform.Enabled = .F. Нажатие кнопки “Изменить” thisformset.fInput.tName.Value = firmview.name_firm thisformset.fInput.cType.Value = firmview.name_owner thisformset.fInput.cDistr.Value = firmview.name_distr thisformset.fInput.tAddr.Value = firmview.addres thisformset.fInput.tDirect.Value = firmview.fio_direct thisformset.fInput.sArea.Value = firmview.area thisformset.fInput.sStaff.Value = firmview.staff thisformset.command = 1 thisformset.fInput.Visible = .T. thisform.Enabled = .F. Нажатие кнопки “Удалить” DELETE FROM firm WHERE name_firm = firmview.name_firm thisformset.fRef.gData.RecordSource = '' SELECT 1 USE SELECT 4 USE SELECT 3 USE SELECT 2 USE PACK firm USE Curs!firmview IN 0 thisformset.fRef.gData.RecordSource = 'firmview' thisform.Refresh Нажатие кнопки “Применить” 7 cmm = thisformset.command IF NOT EMPTY(thisform.tName.Value) AND NOT EMPTY(thisform.cType.Value) AND NOT EMPTY(thisform.cDistr.Value) AND NOT EMPTY(thisform.tAddr.Value) AND NOT EMPTY(thisform.tDirect.Value) then TRY SELECT id_distric FROM district WHERE name_distr = thisform.cDistr.Value INTO ARRAY idd SELECT id_ownership FROM ownershi WHERE name_owner=thisform.cType.Value INTO ARRAY ido DO CASE CASE cmm = 0 INSERT INTO firm (name_firm, id_distric, addres, fio_direct, id_ownership, area, staff) VALUES (thisform.tName.Value, idd(1), thisform.tAddr.Value, thisform.tDirect.Value, ido(1), thisform.sArea.Value, thisform.sStaff.Value) CASE cmm = 1 newname_firm = thisform.tName.Value newid_distric = idd(1) newaddres = thisform.tAddr.Value newfio_direct = thisform.tDirect.Value newid_ownership = ido(1) newarea = thisform.sArea.Value newstaff = thisform.sStaff.Value UPDATE firm SET name_firm = newname_firm, id_distric = newid_distric, addres = newaddres, fio_direct = newfio_direct, id_ownership = newid_ownership, area = newarea, staff = newstaff WHERE name_firm = thisformset.fRef.gData.column1.text1.Value ENDCASE thisform.Visible = .F. thisformset.fRef.Enabled = .T. thisformset.fRef.gData.RecordSource = '' SELECT 1 USE SELECT 4 USE SELECT 3 USE SELECT 2 USE USE Curs!firmview IN 0 thisformset.fRef.gData.RecordSource = 'firmview' thisformset.fRef.Refresh CATCH MESSAGEBOX("Íåêîððåêòíûé ââîä") ENDTRY ELSE MESSAGEBOX("Íåêîòîðûå ïîëÿ íå çàïîëíåíû") ENDIF На рисунке 3 представлен код SQL для отображения сведений о фирмах. Рисунок 3 – SQL код отображения записей о фирмах 8 3.2.3 Составление отчета №2 Вывести сведения о сотрудниках указанной фирмы. Нажатие кнопки «Показать»: SELECT f.name_firm, e.fio_employ, p.name_post, s.salary FROM firm AS f INNER JOIN ((post AS p INNER JOIN staff AS s ON p.id_post = s.id_post) INNER JOIN employee AS e ON e.id_employe = s.id_employe) ON f.id_firm = s.id_firm WHERE f.name_firm=thisform.cFirm.Value INTO CURSOR firm_emp thisform.gData.RecordSource = 'firm_emp' Форма отображения результатов выполнения запроса показана на рисунке 4. Рисунок 4 – Отображения отчета №1 3.2.4 Составление отчета №1 Вывести, в виде отчёта, информацию о фирмах сгруппировав их по форме собственности. Конструктор отчёта показан на рисунке 5. 9 Рисунок 5 – Конструктор отчета №1 Форма отображения отчета представлена на рисунке 6. Рисунок 6 – Форма отчета №1 3.2.5 Составление отчета №3 Вывести сведения о площадях фирм расположенных в указанном районе. Нажатие кнопки «Показать» SELECT firm.name_firm, district.name_distr, firm.area FROM district INNER JOIN firm ON district.id_distric = firm.id_distric WHERE district.name_distr=thisform.cDistr.Value INTO CURSOR firm_dstr thisform.gData.RecordSource = 'firm_dstr' 10 Форма отображения отчета представлена на рисунке 7. Рисунок 7 – Форма отчета №3 11 4. Разработка приложения в среде MS Access 2003 и Delphi 7 4.1. Физическая модель базы данных Перейдем от логической модели базы данных к физической модели. По физической модели сгенерируем схему базы данных в СУБД MS Access 2003. Дополним полученную схему связями. Схема БД показана на рисунке 8. Рисунок 8 – Физическая структура БД для реализации в MS Access 2003 4.2 Интерфейсы системы В систему можно зайти в качестве администратора или просто пользователя (рисунок Администратор 9). обладает всеми правами, пользователь может просматривать справочную и оперативную информацию, а также делать запросы. Рисунок 9 – Вход в БД Для выбора действий пользователь приложения использует главную форму программы (рисунок 10). 12 Рисунок 10 – Главное меню приложения Ведение справочников и оперативной информации осуществляется с помощью кнопок навигации. Для выбора отображаемой информации пользователю предоставляются три списка выбора со справочниками (рисунок 11), оперативной информацией (рисунок 12) и запросами (рисунок 13). При выборе запросов, в случае необходимости ввода дополнительной информации, появляется дополнительный список выбора. 13 Рисунок 11 – Отображение справочной информации о типах организации Рисунок 12 – Форма отображение оперативной информации о фирмах 14 Рисунок 13 – Отображение результатов запроса с параметром 4.3 Написание запросов к БД MSAccess 2003 4.3.1 Составление отчета №1 Вывести сведения о фирмах сгруппировав их по форме собственности. Текст запроса: SELECT f.name_firm, o.name_ownership, d.name_district, f.addres, f.fio_director, f.area, f.staff FROM ownership AS o INNER JOIN (firm AS f INNER JOIN district AS d ON f.id_district = d.id_district) ON o.id_ownership = f.id_ownership ORDER BY o.name_ownership 4.3.2 Составление отчета №2 Вывести информацию о сотрудниках фирмы указанной в параметре. Текст запроса: SELECT f.name_firm, e.fio_employee, p.name_post, s.salary FROM firm AS f INNER JOIN ((post AS p INNER JOIN staff AS s ON p.id_post = s.id_post) INNER JOIN employee AS e ON e.id_employee = s.id_employee) ON f.id_firm = s.id_firm WHERE f.name_firm=<параметр запроса> 4.3.3 Составление отчета №3 Вывести информацию о площадях фирм расположенных в указанном районе. Текст запроса: SELECT firm.name_firm, district.name_district, firm.area FROM district INNER JOIN firm ON district.id_district = firm.id_district WHERE district.name_district=<значение параметра> 15 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Чигарина Е.И. Лекции по курсу Базы данных. Самара, 2003 г. 2. Чигарина Е.И. CASE –средства проектирования баз данных. Самара, 2001 г. 16