Построение модели DFD и реализация в СУБД Visual FoxPro
2.15 Модель предметной области описывается следующим неформальным текстом:
В университете занятия проводятся в различных корпусах.
Каждый корпус имеет уникальное название.
Номера аудиторий уникальны в пределах одного корпуса.
Каждая аудитория характеризуется числом посадочных мест, типом (поточная, лекционная, лаборатория, компьютерный класс).
Один и тот же тип может быть у различных аудиторий.
Каждый корпус имеет свой адрес.
К каждой аудитории прикреплен один сотрудник, ответственный за пожарную безопасность.
Один сотрудник может быть ответственным за несколько аудиторий.
Сотрудник имеет табельный номер, ФИО, должность, служебный телефон.
а. Постройте функциональную модель для заданной предметной области с помощью методологии DFD:
идентифицировать систему
определить сущности
определить потоки данных между сущностями и системой
б. Спроектируйте структуру базы данных методом «Сущность - Связь» для разработанной функциональной модели.
в. Структуру спроектированной базы данных реализуйте с помощью любой СУБД. Приложение должно содержать следующие объекты: формы, отчеты и меню.
Построение функциональной модели
Систему назовём «Система учёта аудиторий».
Данная система хранит информацию об аудиториях. Преподаватели и студенты могут найти в ней сведения о местоположении корпуса, а также о типе аудитории, числе посадочных мест и других сведений, зная лишь название корпуса и номер аудитории. Администрация, в случае обнаружения нарушений правил пожарной безопасности в какой либо из аудиторий, при помощи данной системы может быстро найти все сведения о сотруднике, ответственном за пожарную безопасность в данной аудитории.
Определим сущности предметной области:
Корпуса
Аудитории
Сотрудники
Определим потоки данных между сущностями и системой.
Функциональная модель представлена при помощи диаграмм потоков данных (DFD). Контекстная диаграмма приведена на рисунке 2.15.1, а её детализация на рисунке 2.15.2.
Рис. 2.15.1. Контекстная диаграмма
Рис. 2.15.2.Детализированная диаграмма потоков данных
Словарь данных
@ИМЯ = ПОИСК АУДИТОРИИ
@ТИП = дискретный поток
@БНФ = Название корпуса + Номер аудитории
@ИМЯ = ДАННЫЕ О КОРПУСЕ
@ТИП = дискретный поток
@БНФ = Название корпуса + Адрес
@ИМЯ = ДАННЫЕ ОБ АУДИТОРИИ
@ТИП = дискретный поток
@БНФ = Название корпуса + Номер аудитории + Число посадочных мест + Тип аудитории + Сотрудник
@ИМЯ = ДАННЫЕ О СОТРУДНИКЕ
@ТИП = дискретный поток
@БНФ = Табельный номер + ФИО + Должность + Служебный телефон
@ИМЯ = ТИП АУДИТОРИИ
@ТИП = дискретный поток
@БНФ = {«поточная», «лекционная», «лаборатория», «компьютерный класс»}
@ИМЯ = СВЕДЕНИЯ ОБ АУДИТОРИИ
@ТИП = дискретный поток
@БНФ = Название корпуса + Номер аудитории + Число посадочных мест + Тип аудитории + Адрес
@ИМЯ = ОТЧЁТ О ПОЖАРНОЙ БЕЗОПАСНОСТИ
@ТИП = дискретный поток
@БНФ = ПОИСК АУДИТОРИИ + ДАННЫЕ О СОТРУДНИКЕ
@ИМЯ = ИНФОРМАЦИЯ О КОРПУСЕ
@ТИП = дискретный поток, внутренний
@БНФ = ДАННЫЕ О КОРПУСЕ
@ИМЯ = ИНФОРМАЦИЯ ОБ АУДИТОРИИ
@ТИП = дискретный поток, внутренний
@БНФ = ДАННЫЕ ОБ АУДИТОРИИ
@ИМЯ = ИНФОРМАЦИЯ О СОТРУДНИКЕ
@ТИП = дискретный поток, внутренний
@БНФ = ДАННЫЕ О СОТРУДНИКЕ
@ИМЯ = ИСКАТЬ СВЕДЕНИЯ ОБ АУДИТОРИИ
@ТИП = дискретный поток, внутренний
@БНФ = ПОИСК АУДИТОРИИ
@ИМЯ = РЕЗУЛЬТАТ ПОИСКА АУДИТОРИИ
@ТИП = дискретный поток, внутренний
@БНФ = СВЕДЕНИЯ ОБ АУДИТОРИИ
@ИМЯ = ИСКАТЬ СВЕДЕНИЯ О СОТРУДНИКЕ
@ТИП = дискретный поток, внутренний
@БНФ = ПОИСК АУДИТОРИИ
@ИМЯ = СВЕДЕНИЯ О СОТРУДНИКЕ
@ТИП = дискретный поток, внутренний
@БНФ = ДАННЫЕ О СОТРУДНИКЕ
Спецификация процессов
Спецификация процесса A0.1
@ВХОД = ДАННЫЕ О КОРПУСЕ
@ВЫХОД = ИНФОРМАЦИЯ О КОРПУСЕ
@СПЕЦПРОЦ A0.1 ФОРМИРОВАТЬ ИНФОРМАЦИЮ О КОРПУСЕ
ЕСЛИ добавить ИНФОРМАЦИЮ О КОРПУСЕ ТО
ИНФОРМАЦИЯ О КОРПУСЕ = ДАННЫЕ О КОРПУСЕ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ О КОРПУСЕ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ О КОРПУСЕ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ О КОРПУСЕ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ О КОРПУСЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.2
@ВХОД = ДАННЫЕ О СОТРУДНИКЕ
@ВЫХОД = ИНФОРМАЦИЯ О СОТРУДНИКЕ
@СПЕЦПРОЦ A0.2 ФОРМИРОВАТЬ ИНФОРМАЦИЮ О СОТРУДНИКЕ
ЕСЛИ добавить ИНФОРМАЦИЮ О СОТРУДНИКЕ ТО
ИНФОРМАЦИЯ О СОТРУДНИКЕ = ДАННЫЕ О СОТРУДНИКЕ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ О СОТРУДНИКЕ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ О СОТРУДНИКЕ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ О СОТРУДНИКЕ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ О СОТРУДНИКЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.3
@ВХОД = ДАННЫЕ ОБ АУДИТОРИИ
@ВЫХОД = ИНФОРМАЦИЯ ОБ АУДИТОРИИ
@СПЕЦПРОЦ A0.3 ФОРМИРОВАТЬ ИНФОРМАЦИЮ ОБ АУДИТОРИИ
ЕСЛИ добавить ИНФОРМАЦИЮ ОБ АУДИТОРИИ ТО
ИНФОРМАЦИЯ ОБ АУДИТОРИИ = ДАННЫЕ ОБ АУДИТОРИИ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ ОБ АУДИТОРИИ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ ОБ АУДИТОРИИ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ ОБ АУДИТОРИИ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ ОБ АУДИТОРИИ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.4
@ВХОД = ПОИСК АУДИТОРИИ
@ВХОД = РЕЗУЛЬТАТ ПОИСКА АУДИТОРИИ
@ВЫХОД = ИСКАТЬ СВЕДЕНИЯ ОБ АУДИТОРИИ
@ВЫХОД = СВЕДЕНИЯ ОБ АУДИТОРИИ
@СПЕЦПРОЦ A0.4 ВЫДАТЬ СВЕДЕНИЯ ОБ АУДИТОРИИ
ЕСЛИ осуществляется поиск аудитории ТО
ИСКАТЬ СВЕДЕНИЯ ОБ АУДИТОРИИ = ПОИСК АУДИТОРИИ
СВЕДЕНИЯ ОБ АУДИТОРИИ = РЕЗУЛЬТАТ ПОИСКА АУДИТОРИИ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.5
@ВХОД = ПОИСК АУДИТОРИИ
@ВХОД = СВЕДЕНИЯ О СОТРУДНИКЕ
@ВЫХОД = ИСКАТЬ СВЕДЕНИЯ О СОТРУДНИКЕ
@ВЫХОД = ОТЧЁТ О ПОДАРНОЙ БЕЗОПАСНОСТИ
@СПЕЦПРОЦ A0.5 ВЫДАТЬ ОТЧЁТ О ПОЖАРНОЙ БЕЗОПАСНОСТИ
ЕСЛИ осуществляется поиск ответственного сотрудника за пожарную безопасность в аудитории ПОИСК АУДИТОРИИ ТО
ИСКАТЬ СВЕДЕНИЯ О СОТРУДНИКЕ = ПОИСК АУДИТОРИИ
ОТЧЁТ О ПОДАРНОЙ БЕЗОПАСНОСТИ = ПОИСК АУДИТОРИИ + СВЕДЕНИЯ О СОТРУДНИКЕ
КОНЕЦ ЕСЛИ
Проектирование структуры базы данных
Для разработанной функциональной модели спроектируем структуру базы данных.
Имеются три сущности предметной области: Корпуса, Аудитории и Сотрудники. Определим связи между этими двумя сущностями. Связь «Корпуса – Аудитории» имеет тип «один ко многим». Аудитория идентифицируется номером аудитории и названием корпуса. Так как номер уникален только в пределах одного корпуса, то сочетание значений названия корпуса и номера аудитории в этом корпусе уникально для каждой аудитории. Следовательно, в одном корпусе может быть несколько аудиторий, но одна конкретная аудитория находится только в одном корпусе.
Связь «Аудитории – Сотрудники» имеет тип «многие к одному», так как к каждой аудитории прикреплен один сотрудник, ответственный за пожарную безопасность, но один сотрудник может быть ответственным за несколько аудиторий.
Диаграмма связей между сущностями представлена на рисунке 2.15.3
Рис. 2.15.3. Диаграмма связей между сущностями
Произведём идентификацию атрибутов и определим, какие из них будут входить в уникальные идентификаторы сущностей.
Корпус имеет название корпуса и адрес. Так как каждый корпус имеет уникальное название, то атрибут «Название корпуса» будет являться уникальным идентификатором (первичным ключом), значение которого однозначно идентифицирует каждый экземпляр сущности «Корпус».
Каждая аудитория характеризуется числом посадочных мест, типом, также к каждой аудитории прикреплён один сотрудник, ответственный за пожарную безопасность. Для однозначной идентификации этой сущности достаточно совокупности значений атрибутов «Название корпуса», к которому принадлежит эта аудитория и «Номер аудитории». Первый атрибут является также и внешним ключом, так как реализует связь с сущностью «Корпуса».
Сущность «Сотрудники» имеет атрибуты: «Табельный номер сотрудника», «ФИО», «Должность», «Служебный телефон». Уникальным идентификатором этой сущности является атрибут «Табельный номер сотрудника». Атрибуты «ФИО» и «Должность» для этой цели не годятся, так как могут быть не уникальны даже в совокупности. Атрибут служебный телефон тоже не подходит, ибо может содержать неопределённые значения (NULL), что недопустимо для первичного ключа.
Структура спроектированной базы данных приведена на рисунке 2.15.4
Рис. 2.15.4. Структура БД
Эта структура находится в третьей нормальной форме, так как нет повторяющихся атрибутов, нет атрибутов, зависящих только от части уникального идентификатора и нет атрибутов, зависящих от атрибутов, не входящих в уникальный идентификатор.
Уникальный идентификатор сущности «Аудитории» состоит из двух атрибутов «Название корпуса» и «Номер аудитории». Ни число посадочных мест, ни тип, ни табельный номер сотрудника не зависят только от атрибута «Название корпуса» или атрибута «Номер аудитории». Например, в одном и том же корпусе может быть несколько аудиторий, имеющих одно и то же число посадочных мест, значит атрибут «Число посадочных мест» не зависит функционально от атрибута «Название корпуса». Также может быть, что в разных корпусах под одним номером могут оказаться аудитории, имеющие одно и то же число посадочных мест. Опять же один номер может идентифицировать несколько сущностей, а не одну. Для функциональной зависимости необходимо, чтобы каждому значению зависимого атрибута соответствовало только одно значение зависящего от него атрибута. Аналогично, не зависят от части уникального идентификатора и значения атрибутов «тип» и «Табельный номер сотрудника», так как они не уникальны и могут повторяться для разных аудиторий, то есть один и тот же тип может быть у различных аудиторий и один сотрудник может быть ответственным за несколько аудиторий.
Покажем, что в схеме БД нет атрибутов, зависящих от неключевых.
Для сущности «Сотрудник» атрибут «Должность» не зависит от атрибута «ФИО», ибо значения атрибута «ФИО» не уникальны, а значит, для одного и того же значения атрибута «ФИО» может быть несколько значений атрибута «Должность». Обратная зависимость тоже отсутствует, ибо значение атрибута «Должность» не уникально. Атрибут «Служебный телефон» мог бы рассматриваться как альтернативный ключ, если бы не мог содержать неопределенных значений.
У сущности «Корпуса» имеется только один неключевой атрибут «Адрес».
У сущности «Аудитории» имеются три неключевых атрибута: «Табельный номер сотрудника», «Число посадочных мест» и «Тип». Покажем, что между ними нет функциональных зависимостей. Один сотрудник может быть ответственным за несколько аудиторий, среди которых могут оказаться и аудитории с разным числом посадочных мест, значит значения атрибута «Число посадочных мест» не зависят функционально от значений атрибута «Табельный номер сотрудника». Для разных аудиторий, характеризующихся одним и тем же числом посадочных мест, могут быть разные сотрудники, значит значения атрибута «Табельный номер сотрудника» не зависят функционально от значений атрибута «Число посадочных мест». Значения атрибута «Тип» не уникальны, то есть один и тот же тип может быть у различных аудиторий, среди которых могут оказаться как несколько аудиторий, к которым прикреплены разные сотрудники, так и несколько аудиторий, характеризующихся разным числом посадочных мест. Значит ни значения атрибута «Табельный номер сотрудника», ни атрибута «Число посадочных мест» функционально не зависят от значений атрибута «Тип». Аналогично можно показать, что атрибут «Тип» не зависит ни от одного из атрибутов «Табельный номер сотрудника» и «Число посадочных мест», ибо один сотрудник может быть ответственным за несколько аудиторий, среди которых могут оказаться несколько аудиторий, имеющих разный тип, также как и среди нескольких аудиторий с одним и тем же числом посадочных мест могут оказаться несколько аудиторий, имеющих разный тип.
Определим таблицы базы данных и укажем типы данных и ограничения для каждого поля.
Таблица Аудитории (Auditoriums)
Наименование поля |
Тип данных |
Ограничения |
Название корпуса (name_build) |
Строка (20) |
Входит в состав первичного ключа |
Номер аудитории (number_aud) |
Целое число |
Входит в состав первичного ключа |
Табельный номер сотрудника (number_emp) |
Целое число |
NOT NULL |
Число посадочных мест (number_pla) |
Целое число |
NOT NULL |
Тип (type_) |
Строка (20) |
NOT NULL |
Таблица Корпуса (Buildings)
Наименование поля |
Тип данных |
Ограничения |
Название корпуса (Name_build) |
Строка (20) |
Первичный ключ |
Адрес (Address) |
Строка (20) |
NOT NULL |
Таблица Сотрудники (Employees)
Наименование поля |
Тип данных |
Ограничения |
Табельный номер сотрудника (number_emp) |
Целое число |
Первичный ключ |
ФИО (FIO) |
Строка (30) |
NOT NULL |
Должность (Jobtitle) |
Строка (20) |
NOT NULL |
Служебный телефон (telephone) |
Строка (10) |
Реализация спроектированной базы данных при помощи СУБД Visual FoxPro
Создадим проект приложения баз данных. Для чего выберем в главном меню File – New, затем выберем Project и укажем New File – введём имя проекта Auditoriums и сохраним файл проекта (*.PJT). Далее откроется окно Project Manager (диспетчер проектов) в котором перейдём на вкладку Data (Данные) и выберем пункт Free Tables(Свободные таблицы) и нажмём кнопку New. Появится окно, в котором выберем New Table (Новая таблица) и сохраним таблицу как Auditoriums.dbf. После этого на экране появится диалоговое окно Table Designer(Конструктор таблиц) в котором введём названия всех полей таблицы Аудитории (Auditoriums), укажем их типы данных и ограничения.
Рис. 2.15.5. Построение таблицы Аудитории (Auditoriums)
Аналогично создадим две другие таблицы Buildings.dbf и Employees.dbf.
Теперь создадим базу данных и добавим в неё уже созданные свободные таблицы. В окне Диспетчера проектов на вкладке Data выберем пункт Databases и нажмём кнопку New. Появится окно, в котором выберем New Database (Новая база данных) и сохраним базу данных как Auditoriums.dbc. В появившемся окне Database Designer (Построитель базы данных) выберем из контекстного меню Add Table… (Добавить таблицу)
Рис. 2.15.6. Добавление таблицы в БД
В появившемся диалоговом окне открытия файла выберем сразу все три созданные таблицы и нажмём ОК.
Определим индексы для таблиц. Для этого в окне Диспетчера проектов на вкладке Data выберем пункт Databases, затем выберем созданную базу данных Auditoriums, в которой выберем пункт Tables (Таблицы). Появится список из трёх добавленных в базу данных таблиц, в котором выберем таблицу Auditoriums и нажмём кнопку Modify (Изменить). В появившемся окне конструктора таблиц перейдём на вкладку Indexes (Индексы). Создадим индекс первичного ключа таблицы. В поле Name введём имя индекса PK_auditor, а из раскрывающегося списка Type (Тип) выберем тип индекса Primary (Первичный), затем нажмём кнопку справа от поля Expression (Выражение) и введём значение индексного выражения в окне построителя выражений «ALLTRIM(name_build+STR(number_aud))», что означает конкатенацию двух строковых значений: значения поля name_build, имеющего стоковой тип и строкового представления числа, взятого из поля number_aud. Преобразование числа в строку осуществляется при помощи функции STR. Функция ALLTRIM убирает из выражения начальные и конечные значения. Так как совокупность значений этих строк должна быть уникальной, то при вводе данных в таблицу будет проверятся уникальность значения этого индекса, то есть совокупности значений двух полей, хотя по отдельности в этих полях могут присутствовать одинаковые значения.
Теперь создадим два регулярных индекса для определения внешних ключей. Первый FK_buildin, тип – Regular, выражение – «name_build» и второй FK_employe, тип – Regular, выражение – «number_emp».
Аналогично определим первичные ключи при помощи индекса Primary для двух других таблиц, назовём их PK_buildin и PK_employe.
Создадим отношения между таблицами. Для этого в окне конструктора базы данных щёлкаем мышью на имени индекса PK_buildin таблицы Buildings к индексу FK_buildin таблицы Auditoriums.
Рис. 2.15.7. Схема отношений базы данных
Создание форм
Создадим три формы по одной для каждой таблицы при помощи мастера форм. Для создания формы нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Form и нажать кнопку New. Выберем Form Wizard, затем выберем мастера создания формы с одной таблицы Form Wizard. На первом шаге необходимо выбрать таблицу и поля, которые будут применяться в форме. Укажем таблицу AUDITORIUMS базы данных AUDITORIUMS (не свободную таблицу, потому, что мы её уже добавили в базу данных) и выберем все поля, переместив их в список Selected fields (Выбранные поля).
Рис. 2.15.8. Создание формы при помощи мастера форм
На втором шаге выберем стиль формы.
На третьем шаге укажем поля, по которым будет происходить упорядочение записи и порядок сортировки записей. Выберем упорядочение по значению поля Название корпуса (name_build), для чего переместим его в список Selected fields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртом шаге введём заголовок для формы в поле Type a title for your form, введём Аудитории. Выберем Save and modify it in the Form designer (Сохранить и изменить форму в Конструкторе форм).
Форма откроется в окне конструктора форм, в котором изменим надписи, для чего выделим нужную надпись и в окне свойств Properties - auditoriums.scx изменим свойство Caption. Сохраним изменения, выбрав File – Save.
Рис. 2.15.9. Форма для таблицы «Аудитории»
Аналогично создадим формы для двух других таблиц.
Создадим форму для двух связанных таблиц Аудитории (Auditoriums) и Корпуса (Buildings)(Рис. 2.15.10.). Для этого выберем мастера создания формы, использующего связанные таблицы One-toForm Wizard.
На первом шаге необходимо выбрать поля из родительской таблицы, которые будут применяться в форме. Выберем таблицу Buildings базы данных AUDITORIUMS и выберем из этой таблицы поля Название корпуса (Name_building) и Адрес (Address), переместив их в список Selected fields (Выбранные поля).
На втором шаге выберем поля из дочерней таблицы. Здесь мы выберем таблицу Auditoriums и выберем из этой таблицы поля Номер аудитории (Number_aud), Число посадочных мест (Number_pla) и Тип (type_).
На третьем шаге указывается связь таблиц. Оставим связку по полю Название корпуса (Name_build).
На четвёртом шаге укажем стиль формы.
На пятом шаге укажем поля, по которым будет происходить упорядочение записи и порядок сортировки записей. Выберем упорядочение по значению поля Название корпуса (name_build) и дополнительную сортировку по полю Адрес (Address), для чего переместим их в список Selected fields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На шестом шаге введём заголовок для формы в поле Type a title for your form, введём Аудитории и корпуса. Выберем Save and modify it in the Form designer (Сохранить и изменить форму в Конструкторе форм). Сохраним форму как Auditoriums and Buildings.scx.
Рис. 2.15.10. Создание формы для связанных таблиц при помощи мастера форм
Форма откроется в окне конструктора форм, в котором изменим надписи, для чего выделим нужную надпись и в окне свойств Properties - auditoriums.scx изменим свойство Caption. Также изменим названия столбцов и ширину полей объекта формы grid1, для чего выберем этот объект и в окне свойств в верхнем выпадающем списке выберем для первого столбца Column1 и изменим ширину поля, указав нужное число в значении свойства Width (Ширина). Для указания текста заголовка этого поля выберем в том же выпадающем списке окна свойств Header1 и введём название в свойство Caption. Сохраним изменения, выбрав File – Save.
Рис. 2.15.11. Изменение свойств столбца объекта grid1
Рис. 2.15.12. Форма «Аудитории и корпуса»
Создание отчётов
Для создания отчётов нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Reports(Отчёты) и нажать кнопку New. После этого откроется диалоговое окно New Report (Новый отчёт) Выберем New Report. Появится окно конструктора отчётов Report Designer. Определим среду данных для отчёта, для чего выберем из контекстного меню пункт Data Environment (Среда данных). Щёлкнем правой кнопкой мыши в окне среды данных и выберем в появившемся контекстном меню пункт Add…(Добавить). Добавим таблицы Auditoriums и Buildings и установим связи между ними. Разместим надписи столбцов в области Page Header (Верхний колонтитул) окне конструктора отчётов, а в поле Detail разместим поля из таблиц. Для добавления поля выберем его из окна среды данных отчёта или поместим объект Field (Поле) из элементов управления отчётом Report Controls. При этом появится диалоговое окно Report Expression (Выражение для отчёта), затем введём в поле Expression наименование требуемого поля. В области Page Footer поместим значение, указывающее общее количество строк в отчёте и выведем текущую дату. Для того чтобы вывести значение числа строк, поместим в полосу Page Footer объект Field (Поле). В окне Report Expression нажжём кнопку Calculations (Вычисления), после чего появится диалоговое окно Calculate Field (Вычисляемое поле), в котором выберем операцию Count (Количество), а в поле Expression укажем наименование первого поля – Name_build. Для того, чтобы вывести текущую дату необходимо поместить объект Field (Поле) и в окне Report Expression ввести в поле Expression выражение DATE() – функцию по вычислению текущей даты. Рядом добавим соответствующие надписи, поместив на макет формы объекты Label (Надпись) и введя требуемые надписи. Сохраним отчёт.
Рис. 2.15.13. Макет отчёта в окне конструктора форм.
Создание меню
Для создания меню нужно в окне Диспетчера проектов перейти на вкладку Other (Другое), где выбрать пункт Menus (Меню) и нажать кнопку New. После этого откроется диалоговое окно New Menu (Новое меню) Выберем Menu. Появится окно конструктора меню Menu Designer. Введём названия пунктов меню в поле Prompt (Наименование), а в раскрывающемся списке Result (Результат) определим действия, происходящие при выборе пункта меню. Введём подменю «Таблицы», для чего в поле Prompt введём название пункта меню «Таблицы», а в списке Result укажем sub>menu (Подменю), затем нажмём на кнопку Create (Создать) после чего в раскрывающемся списке Menu Level (Уровень меню) появится название созданного подменю. Все остальные пункты, созданные на этом уровне, будут пунктами подменю для пункта меню «Таблицы». Создадим пункт «Аудитории». Для этого в списке Result укажем Command (Команда) и введём «DO FORM «c:\бд auditoriums\формы\auditoriums.scx»«, что значит открыть форму auditoriums.scx. Аналогично создадим пункты для открытия трёх других форм.
Рис. 2.15.14. Создание меню
Затем в списке Menu Level (Уровень меню) выберем верхний уровень – Menu Bar и введём ещё одно подменю «БД», в котором укажем два пункта «Отчёт» и «Выход». В поле ввода команды для пункта «Отчёт» введём «REPORT FORM «c:\бд auditoriums\отчёты\report1.frx» PREVIEW», т. е открытие файла отчёта. Для пункта «Выход» укажем команду QUIT.
Чтобы меню можно было использовать в приложении, сначала его нужно сгенерировать. Для этого используется пункт системного меню Menu (Меню) и диалоговое окно Generate Menu (Генерация меню). В этом окне укажем файл, в котором будет сохранено меню, после чего нажмём кнопку Generate (Генерация).
Созданное меню необходимо запустить на экранной форме. Если просто в Диспетчере проекта выделить меню и нажать Run (Выполнить), то меню будет запущено в главном окне Visual FoxPro. Для того чтобы меню запускалось в форме приложения баз данных, необходимо установить флажок Top-Level Form (Форма верхнего уровня) в диалоговом окне General Options (Основные опции) и снова запустить процесс генерации меню.
Теперь создадим главную форму приложения, из которой будут открываться все остальные. Назовём её Main_form. На эту форму поместим четыре кнопки, и зададим команды на запуск соответствующих форм при нажатии на эти кнопки. Поместим на макет формы компонент Command Button (Командная кнопка), у которого в свойстве Caption напишем текст надписи на кнопке, например, для кнопки вызова формы Аудитории так и напишем Аудитории. Затем перейдём на вкладку Methods (Методы) окна Properties (Свойства) формы и выбираем метод Click Event (Событие щелчок). Щёлкнем два раза на названии события, после чего появится окно Command1.Click, в котором введём
DO FORM «c:\бд auditoriums\формы\auditoriums.scx»
Окно ввода команды, выполняющейся при нажатии на кнопку окно Command1.Click, можно вызвать и двойным щелчком на макете кнопки.
Аналогично создадим кнопки вызова других форм и отчёта.
Теперь поместим на эту форму созданное ранее меню. Для этого сначала установим свойство формы ShowWindow равным 2 – As top level form (Как форма верхнего уровня), затем в методе Init Event пропишем
DO «C:\БД Auditoriums\MENU1.MPR» WITH THIS, .T..
Создадим файл основной программы. Для этого в окне Диспетчера проекта перейдём на вкладку Code, где выберем пункт Programs (Программы) и нажмём кнопку New….Появится окно Program1, в котором напишем
DO FORM «c:\бд auditoriums\формы\main_form.scx»
_SCREEN.Visible = .T.
READ EVENTS
Сначала откроется окно главной формы, затем значение свойства Visible (Видимость) окна проставим в Истина. Затем зададим точку останова командой READ EVENTS, то есть после выполнения этой команды программа будет ожидать действий пользователя, и все следующие за ней команды не будут выполнятся до тех пор, пока не будет выполнена команда CLEAR EVENTS. Поместим эту команду в обработчик события Destroy Event (Закрытие формы) главной формы Main_form.
Сохраним файл программы как Program1.prg и сделаем этот файл основной в приложении, для чего выделим его в Диспетчере проекта и в контекстном меню выберем пункт Set Main (Сделать основным). Файл при этом станет выделенным жирным шрифтом.
Рис. 2.15.15. Окно главной формы
Построение исполняемого файла
Для того чтобы сделать исполняемый файл с расширением .exe, необходимо выбрать опцию Build Executable (Построить исполняемый файл) в диалоговом окне Build Options (Опции построения), которое вызывается при нажатии кнопки Build (Построить) в окне диспетчера проекта. Потом нажать ОК и указать куда следует поместить исполняемый файл.
Чтобы в готовом файле .exe в процессе ввода часть русских букв автоматически не заменялись латинскими буквами из-за несовпадения кодовых страниц, необходимо в директорию, где находится .exe файл поместить файл конфигурации CONFIG.FPW, в котором указать
CODEPAGE=1251
Также можно поместить этот файл внутрь исполняемого файла. Для этого нужно добавить файл конфигурации в проект на закладке Other в раздел Text Files. Слева от имени файла не должно быть значка перечеркнутого кружка. Однако следует понимать, что такой файл невозможно будет изменить у клиента, поэтому оставим его рядом с .exe файлом, не помещая внутрь.
По умолчанию, в момент запуска файла .exe, если файл конфигурации не включен внутрь файла .exe, то файл конфигурации будет подхвачен из той же директории, в которой находится файл .exe.
2.16 Модель предметной области описывается следующим неформальным текстом
1. У каждой студенческой группы только один куратор.
2. Название группы уникально.
3. Имя куратора не уникально.
4. Каждый преподаватель может быть куратором в нескольких группах.
5. У каждого куратора может быть только одна должность.
6. Одну и ту же должность могут иметь несколько преподавателей.
7. Несколько должностей могут иметь один и тот же оклад.
8. Преподаватель имеет ФИО, год рождения, ученую степень, адрес.
а.Постройте функциональную модель для заданной предметной области с помощью методологии DFD:
идентифицировать систему
определить сущности
определить потоки данных между сущностями и системой
б.Спроектируйте структуру базы данных методом «Сущность - Связь» для разработанной функциональной модели.
в.Структуру спроектированной базы данных реализуйте с помощью любой СУБД. Приложение должно содержать следующие объекты: формы, отчеты и меню.
Построение функциональной модели
Систему назовём «Система учёта студенческих групп». Определим сущности предметной области:
группы
преподаватели
Данная система хранит информацию о студенческих группах и их кураторах. Пользователь этой системы может найти информацию о преподавателе, являющемся куратором в искомой группе. При вводе данных о группе указываются также сведения о преподавателе, являющемся в данной группе куратором. Данные о группе будут только тогда занесены в базу данных, когда в ней будут найдены сведения об этом преподавателе в таблице «Преподаватели». Сведения о преподавателях вводятся отдельно.
Функциональная модель представлена при помощи диаграмм потоков данных (DFD).
Контекстная диаграмма приведена на рисунке 2.16.1, а её детализация на рисунке 2.16.2.
Рис. 2.16.1.Контекстная диаграмма
Рис. 2.16.2.Детализированная диаграмма потоков данных
Словарь данных
@ИМЯ = ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ
@ТИП = дискретный поток
@БНФ = ФИО + Год рождения + Учёная степень + Адрес
@ИМЯ = ДАННЫЕ О ГРУППЕ
@ТИП = дискретный поток
@БНФ = Название группы + Имя куратора + ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ + Должность + Оклад
@ИМЯ = ПОИСК КУРАТОРА
@ТИП = дискретный поток
@БНФ = Название группы
@ИМЯ = ИНФОРМАЦИЯ О КУРАТОРЕ
@ТИП = дискретный поток
@БНФ = ДАННЫЕ О ГРУППЕ
@ИМЯ = ИНФОРМАЦИЯ О ПРЕПОДАВАТЕЛЯХ
@ТИП = внутренний поток
@БНФ = ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ
@ИМЯ = ИНФОРМАЦИЯ О ГРУППЕ
@ТИП = внутренний поток
@БНФ = Название группы + Имя куратора + Должность + Оклад + ID_Преподавателя
@ИМЯ = НАЙТИ ПРЕПОДАВАТЕЛЯ
@ТИП = внутренний поток
@БНФ = ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ
@ИМЯ = РЕЗУЛЬТАТ ПОИСКА ПРЕПОДАВАТЕЛЯ
@ТИП = внутренний поток
@БНФ = ID_Преподавателя
@ИМЯ = ПОИСК ИНФОРМАЦИИ О КУРАТОРЕ
@ТИП = внутренний поток
@БНФ = ПОИСК КУРАТОРА
@ИМЯ = ДАННЫЕ О ГРУППАХ И ПРЕПОДАВАТЕЛЯХ
@ТИП = внутренний поток
@БНФ = ДАННЫЕ О ГРУППЕ
Спецификация процессов
Спецификация процесса A0.1
@ВХОД = ДАННЫЕ О ГРУППЕ
@ВХОД = РЕЗУЛЬТАТ ПОИСКА ПРЕПОДАВАТЕЛЯ
@ВЫХОД = НАЙТИ ПРЕПОДАВАТЕЛЯ
@ВЫХОД = ДАННЫЕ О ГРУППЕ
@СПЕЦПРОЦ A0.1 ПРОВЕРИТЬ НАЛИЧИЕ ПРЕПОДАВАТЕЛЯ
НАЙТИ ПРЕПОДАВАТЕЛЯ = ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ из ДАННЫЕ О ГРУППЕ
ЕСЛИ РЕЗУЛЬТАТ ПОИСКА ПРЕПОДАВАТЕЛЯ не равен NULL ТО
ДАННЫЕ О ГРУППЕ = ДАННЫЕ О ГРУППЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.2
@ВХОД = ДАННЫЕ О ГРУППЕ
@ВЫХОД = ИНФОРМАЦИЯ О ГРУППЕ
@СПЕЦПРОЦ A0.2 ФОРМИРОВАТЬ ИНФОРМАЦИЮ О ГРУППЕ
ЕСЛИ добавить ИНФОРМАЦИЮ О ГРУППЕ ТО
ИНФОРМАЦИЯ О ГРУППЕ = ДАННЫЕ О ГРУППЕ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ О ГРУППЕ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ О ГРУППЕ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ О ГРУППЕ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ О ГРУППЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.3
@ВХОД = ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ
@ВЫХОД = ИНФОРМАЦИЯ О ПРЕПОДАВАТЕЛЯХ
@СПЕЦПРОЦ A0.3 ФОРМИРОВАТЬ ИНФОРМАЦИЮ О ПРЕПОДАВАТЕЛЯХ
ЕСЛИ добавить ИНФОРМАЦИЮ О ПРЕПОДАВАТЕЛЯХ ТО
ИНФОРМАЦИЯ О ПРЕПОДАВАТЕЛЯХ = ДАННЫЕ О ПРЕПОДАВАТЕЛЯХ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ О ПРЕПОДАВАТЕЛЯХ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ О ПРЕПОДАВАТЕЛЯХ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ О ПРЕПОДАВАТЕЛЯХ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ О ПРЕПОДАВАТЕЛЯХ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.4
@ВХОД = ПОИСК КУРАТОРА
@ВХОД = ДАННЫЕ О ГРУППАХ И ПРЕПОДАВАТЕЛЯХ
@ВЫХОД = ПОИСК ИНФОРМАЦИИ О КУРАТОРЕ
@ВЫХОД = ИНФОРМАЦИЯ О КУРАТОРЕ
@СПЕЦПРОЦ A0.4 ПОИСК КУРАТОРА
ПОИСК ИНФОРМАЦИИ О КУРАТОРЕ = ПОИСК КУРАТОРА
ВЫПОЛНИТЬ Поиск в БД ИНФОРМАЦИИ О КУРАТОРЕ
ИНФОРМАЦИЯ О КУРАТОРЕ = найденные в БД ДАННЫЕ О ГРУППАХ И ПРЕПОДАВАТЕЛЯХ
Проектирование структуры базы данных
Выделим две сущности: Группы и Преподаватели.
Связь между этими сущностями имеет тип «многие к одному» так как каждый преподаватель может быть куратором в нескольких группах и в каждой группе может быть только один куратор.
Сущность «Преподаватели» имеет атрибуты: ФИО, Год рождения, учёная степень, Адрес. Ни один из этих атрибутов не уникален для каждого конкретного преподавателя. К тому же для разных преподавателей могут совпадать сразу совокупность значений таких атрибутов, как ФИО, год рождения и Учёная степень. Поэтому выделим отдельный атрибут ID_Преподавателя, однозначно идентифицирующий каждый экземпляр сущности «Преподаватели». От атрибутов, не входящих в состав уникального идентификатора, функционально не зависят другие атрибуты.
Сущность «Группа» имеет атрибуты: Название группы, Имя куратора, Должность, Оклад, ID_Преподавателя (являющегося куратором данной группы). Так как название группы уникально, то это атрибут будет являться уникальным идентификатором для сущности «Группы». Все остальные атрибуты функционально зависят от уникального идентификатора.
«Имя куратора». В каждой студенческой группе только один куратор.
«Должность». У каждого куратора, а значит и группы, может быть только одна должность.
«Оклад». У каждой должности только один оклад.
«ID_Преподавателя». В каждой группе только один куратор, а значит и один преподаватель является куратором в данной группе.
Так как несколько должностей могут иметь один и тот же оклад, но каждая должность может иметь только один оклад, то атрибут «Оклад» функционально зависит от атрибута «Должность», не входящего в состав уникального идентификатора. Атрибут «Должность» также не может рассматриваться в качестве альтернативного ключа, ибо нет функциональной зависимости ключевого атрибута «Название группы» от атрибута «Должность», то есть одна и та же должность куратора может быть в разных группах, а альтернативный ключ должен идентифицировать каждую запись, а не набор записей. Отсюда следует, что данная структура не находится в третьей нормальной форме. Для приведения её в третью нормальную форму необходимо выделить отдельную сущность «Должности» и атрибуты «Должность» и «Оклад» выделить для этой сущности.
Определим степени связей между сущностями.
Связь между сущностью «Группы» и «Преподаватели» имеет тип «Многие к одному», так как каждый преподаватель может быть куратором в нескольких группах, а у каждой группы может быть только один куратор.
Связь между сущностью «Группы» и «Должности» имеет тип «Многие к одному», так как одна и та же должность куратора может быть в разных группах и у каждой группы может быть только один куратор, значит и одна должность куратора.
Диаграмма связей между сущностями представлена на рисунке 2.16.3.
Рис. 2.16.3. Диаграмма связей между сущностями
Структура спроектированной базы данных приведена на рисунке 2.16.4.
Рис. 2.16.4. Структура БД
Определим таблицы базы данных и укажем типы данных и ограничения для каждого поля.
Таблица Группы (Groups)
Наименование поля |
Тип данных |
Ограничения |
Название группы (Name_group) |
Строка (20) |
Первичный ключ |
Имя куратора (Name_Kurat) |
Строка (30) |
NOT NULL |
Должность (Job_title) |
Строка (20) |
NOT NULL Внешний ключ |
ID_Преподавателя (ID_teacher) |
Целое число |
NOT NULL Внешний ключ |
Таблица Преподаватели (Teachers)
Наименование поля |
Тип данных |
Ограничения |
ID_Преподавателя (ID_teacher) |
Целое число |
Первичный ключ |
ФИО (FIO) |
Строка (30) |
NOT NULL |
Год рождения (Year_birth) |
Целое число |
NOT NULL |
Учёная степень (Degree) |
Строка (20) |
|
Адрес (Address) |
Строка (20) |
Таблица Должности (Job_titles)
Наименование поля |
Тип данных |
Ограничения |
Должность (Jobtitle) |
Строка (20) |
Первичный ключ |
Оклад (Salary) |
Целое число |
NOT NULL |
Реализация спроектированной базы данных при помощи СУБД Visual FoxPro
Создадим проект приложения баз данных. Для чего выберем в главном меню File – New, затем выберем Project и укажем New File – введём имя проекта student_groups и сохраним файл проекта (student_groups.pjx). Далее откроется окно Project Manager (диспетчер проекта) в котором перейдём на вкладку Data (Данные) и выберем пункт Databases и нажмём кнопку New… (Новая). Появится окно, в котором выберем New Database (Новая база данных) и сохраним базу данных как student_groups.dbc. В появившемся окне Database Designer (Построитель базы данных) выберем из контекстного меню New Table… (Новая таблица). Появится окно, в котором выберем New Table (Новая таблица) и сохраним таблицу как Groups.dbf. После этого на экране появится диалоговое окно Table Designer (Конструктор таблиц) в котором введём названия всех полей таблицы Группы (Groups), укажем их типы данных и ограничения. Создадим индексы для таблицы. Индексы нужны для определения первичного и внешнего ключей в базе данных. Для создания индекса перейдём на вкладку Indexes (Индексы). Сначала создадим индекс первичного ключа таблицы. В поле Name введём имя индекса PK_Groups, а из раскрывающегося списка Type (Тип) выберем тип индекса Primary (Первичный), затем нажмём кнопку справа от поля Expression (Выражение) и введём значение индексного выражения в окне построителя выражений «name_group», то есть укажем, что первичным ключом будет поле name_group. Теперь создадим два регулярных индекса для определения внешних ключей. Первый FK_Job_tit, тип – Regular, выражение – «Job_title» и второй FK_Teacher, тип – Regular, выражение – «ID_teacher».
Аналогично создадим две другие таблицы Teachers.dbf и Job_titles.dbf и определим индексы первичного ключа и назовём их PK_Teacher и PK_Job_tit, а в выражении проставим название поля первичного ключа.
Создадим отношения между таблицами. Для этого в окне конструктора базы данных щёлкаем мышью на имени индекса PK_Teacher таблицы Teachers и переносим к индексу FK_Teacher таблицы Groups. Также создадим отношение между таблицами Job_titles и Teachers.
Рис. 2.16.5. Схема отношений базы данных
Создадим представление, выводящее значения полей всех трёх связанных таблиц. В Диспетчере проекта перейдём на вкладку Data(Данные) – Database затем выберем базу данных student_groups, в которой выберем пункт Local Views (Локальные Виды) и нажмём на кнопку New, затем выберем New View (Новое представление). В появившемся окне Add Table or View (Добавить таблицу или представление) выберем поочерёдно все три таблицы и нажмем кнопку Add (Добавить). В окне View Designer (Конструктор представления) появятся все три таблицы и автоматически добавятся связи, так как мы их уже задавали при построении схемы базы данных. Выберем в контекстном меню View SQL (Просмотр SQL) и появится окно просмотра SQL запроса для вида, в котором уже будет задана связка таблиц, поэтому добавим только какие поля мы будем выводить, для чего в разделе SELECT запроса на выборку введём список полей
Groups.Name_group, Groups.Name_Kurat, Groups.Job_title, Job_titles.Salary, Teachers.FIO, Teachers.Year_birth, Teachers.Degree, Teachers.Address.
Перейдём к окну конструктора представления и проверим правильность набранного кода, выбрав из контекстного меню Run Query (Выполнить запрос). Перейдём на вкладку Update General (Обновление) и поставим флажок Send SQL updates для того, чтобы можно было добавлять и редактировать значения полей в таблицах через это представление. Сохраним представление, выбрав File – Save. В появившемся окне View Name (Имя представления) введём Student_groups_View.
Создание форм
Создадим три формы по одной для каждой таблицы при помощи мастера форм. Для создания формы нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Form и нажать кнопку New. Выберем Form Wizard, затем выберем мастера создания формы с одной таблицы Form Wizard. На первом шаге необходимо выбрать таблицу и поля, которые будут применяться в форме. Укажем таблицу Groups базы данных Student_Groups и выберем все поля, переместив их в список Selected fields (Выбранные поля).
На втором шаге выберем стиль формы.
На третьем шаге укажем поля, по которым будет происходить упорядочение записи и порядок сортировки записей. Выберем упорядочение по значению поля Название группы (Name_group), для чего переместим его в список Selected fields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртом шаге введём заголовок для формы в поле Type a title for your form, введём Группы. Выберем Save and modify it in the Form designer (Сохранить и изменить форму в Конструкторе форм).
Форма откроется в окне конструктора форм, в котором изменим надписи, для чего выделим нужную надпись и в окне свойств Properties – groups.scx изменим свойство Caption. Сохраним изменения, выбрав File – Save.
Рис. 2.16.6. Форма для таблицы «Группы»
Аналогично создадим формы для двух других таблиц.
Создадим форму для представления Student_groups_View. Для этого также выберем создание формы в мастере форм и на первом этапе выберем представление и укажем использовать в форме все его поля. Укажем заголовком формы «Группы и их преподаватели», а после завершения работы мастера, откроем форму в окне конструктора и изменим подписи полей.
Создание отчётов
Для создания отчётов нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Reports(Отчёты) и нажать кнопку New. После этого откроется диалоговое окно New Report (Новый отчёт) Выберем New Report. Появится окно конструктора отчётов Report Designer. Определим среду данных для отчёта, для чего выберем из контекстного меню пункт Data Environment (Среда данных). Щёлкнем правой кнопкой мыши в окне среды данных и выберем в появившемся контекстном меню пункт Add…(Добавить). Добавим представление Student_groups_View. Перейдём к окну конструктора отчётов.
Для добавления всех полей из среды данных в отчёт выберем в главном меню окна Visual FoxPro Report – Quick Report (Быстрый отчет). Появится окно Quick Report в котором выберем вертикальное размещение полей, указав соответствующее положение переключателя в разделе Field Layout. Нажмём ОК, и в области Detail отчёта появятся все поля из среды данных отчёта. Изменим надписи для полей и добавим линию для разделения записей при просмотре.
В области Page Footer будут уже помешены поля, содержащие функцию вычисления значения Текущей даты и номера страницы. Добавим ещё поле, выводящее значение, указывающее общее количество строк в отчёте. Для того чтобы вывести значение числа строк, поместим в полосу Page Footer объект Field (Поле). В окне Report Expression нажжём кнопку Calculations (Вычисления), после чего появится диалоговое окно Calculate Field (Вычисляемое поле), в котором выберем операцию Count (Количество), а в поле Expression укажем наименование первого поля – student_groups_view.name_group. Рядом добавим соответствующие надписи, поместив на макет формы объекты Label (Надпись) и введя требуемые надписи. Сохраним отчёт.
Рис. 2.16.7. Макет отчёта в окне конструктора форм
Создание меню
Для создания меню нужно в окне Диспетчера проектов перейти на вкладку Other (Другое), где выбрать пункт Menus (Меню) и нажать кнопку New. После этого откроется диалоговое окно New Menu (Новое меню) Выберем Menu. Появится окно конструктора меню Menu Designer. Введём названия пунктов меню в поле Prompt (Наименование), а в раскрывающемся списке Result (Результат) определим действия, происходящие при выборе пункта меню. Введём подменю «Таблицы», для чего в поле Prompt введём название пункта меню «Таблицы», а в списке Result укажем sub>menu (Подменю), затем нажмём на кнопку Create (Создать) после чего в раскрывающемся списке Menu Level (Уровень меню) появится название созданного подменю. Все остальные пункты, созданные на этом уровне, будут пунктами подменю для пункта меню «Таблицы». Создадим пункт «Группы». Для этого в списке Result укажем Command (Команда) и введём «DO FORM «c:\student groups\формы\groups.scx»«, что значит открыть форму groups.scx. Аналогично создадим пункты для открытия трёх других форм.
Затем в списке Menu Level (Уровень меню) выберем верхний уровень – Menu Bar и введём ещё одно подменю «BD», в котором укажем два пункта «Отчёт» и «Выход». В поле ввода команды для пункта «Отчёт» введём «REPORT FORM «c:\student groups\отчёты\report.frx» PREVIEW», т. е открытие файла отчёта. Для пункта «Выход» укажем команду QUIT.
Чтобы меню можно было использовать в приложении, сначала его нужно сгенерировать. Для этого используется пункт системного меню Menu (Меню) и диалоговое окно Generate Menu (Генерация меню). В этом окне укажем файл, в котором будет сохранено меню, после чего нажмём кнопку Generate (Генерация).
Созданное меню необходимо запустить на экранной форме. Если просто в Диспетчере проекта выделить меню и нажать Run (Выполнить), то меню будет запущено в главном окне Visual FoxPro. Для того чтобы меню запускалось в форме приложения баз данных, необходимо установить флажок Top-Level Form (Форма верхнего уровня) в диалоговом окне General Options (Основные опции) и снова запустить процесс генерации меню.
Теперь создадим главную форму приложения, из которой будут открываться все остальные. Назовём её Main_form. На эту форму поместим четыре кнопки, и зададим команды на запуск соответствующих форм при нажатии на эти кнопки. Поместим на макет формы компонент Command Group (Группа командных кнопок), у которого в свойстве ButtonCount (Количество кнопок) укажем значение 4 по количеству форм. В выпадающем списке вверху окна свойств выбираем нужную кнопку и в свойство Caption напишем текст надписи на этой кнопке. Затем перейдём на вкладку Methods (Методы) и выбираем метод Click Event (Событие щелчок). Щёлкнем два раза на названии события, после чего появится окно Command1.Click, в котором введём команду DO FORM «<путь к файлу формы>«
Также поместим ещё две кнопки (компонент CommandButton) для вывода отчёта и выхода из программы. Изменим аналогично текст надписи и зададим обработчики события нажатия на эти кнопки.
Теперь поместим на эту форму созданное ранее меню. Для этого сначала установим свойство формы ShowWindow равным 2 – As top level form (Как форма верхнего уровня), затем в методе Init Event пропишем путь к файлу меню
DO «c:\student groups\меню\menu1.mpr» WITH THIS, .T.
Поместим в обработчик события Destroy Event (Закрытие формы) формы команду CLEAR EVENTS для того, чтобы можно было выйти из программы при закрытии формы.
Создадим файл основной программы. Для этого в окне Диспетчера проекта перейдём на вкладку Code, где выберем пункт Programs (Программы) и нажмём кнопку New….Появится окно Program1, в котором напишем
DO FORM «c:\student groups\формы\main_form.scx»
_SCREEN.Visible = .T.
READ EVENTS
Сначала откроется окно главной формы, затем значение свойства Visible (Видимость) окна проставим в Истина. Затем зададим точку останова командой READ EVENTS, то есть после выполнения этой команды программа будет ожидать действий пользователя, и все следующие за ней команды не будут выполнятся до тех пор, пока не будет выполнена команда CLEAR EVENTS.
Сохраним файл программы как Program1.prg и сделаем этот файл основной в приложении, для чего выделим его в Диспетчере проекта и в контекстном меню выберем пункт Set Main (Сделать основным). Файл при этом станет выделенным жирным шрифтом.
Построение исполняемого файла
Для того чтобы сделать исполняемый файл с расширением .exe, необходимо выбрать опцию Build Executable (Построить исполняемый файл) в диалоговом окне Build Options (Опции построения), которое вызывается при нажатии кнопки Build (Построить) в окне диспетчера проекта. Потом нажать ОК и указать куда следует поместить исполняемый файл.
Чтобы в готовом файле .exe в процессе ввода часть русских букв автоматически не заменялись латинскими буквами из-за несовпадения кодовых страниц, необходимо в директорию, где находится .exe файл поместить файл конфигурации CONFIG.FPW, в котором указать
CODEPAGE=1251
Также можно поместить этот файл внутрь исполняемого файла. Для этого нужно добавить файл конфигурации в проект на закладке Other в раздел Text Files.
2.17 Модель предметной области описывается следующим неформальным текстом:
1.Номер зачетки студента уникален, то есть не может быть двух студентов, у которых одинаковые номера зачеток
2.Несколько студентов, могут иметь одинаковые имена.
3.Каждый студент учится только в одной группе
4.В одной группе учатся несколько студентов.
5.Название группы уникально.
6.Каждая группа относится к одной кафедре.
7.К одной кафедре относится несколько групп.
8.Название кафедры уникально.
9.Студент имеет ФИО, год рождения, адрес. Кафедра название и зав. кафедрой.
а.Постройте функциональную модель для заданной предметной области с помощью методологии DFD:
идентифицировать систему
определить сущности
определить потоки данных между сущностями и системой
б.Спроектируйте структуру базы данных методом «Сущность - Связь» для разработанной функциональной модели.
в.Структуру спроектированной базы данных реализуйте с помощью любой СУБД. Приложение должно содержать следующие объекты: формы, отчеты и меню.
Построение функциональной модели
Систему назовём «Систему учёта студентов».
Данная система хранит информацию о студентах. Пользователь данной системы может быстро получить информацию о студенте, его группе и кафедре, к которой относится его группа, введя в поисковый запрос лишь номер зачётки искомого студента.
Сущности предметной области:
Студенты
Группы
Определим потоки данных между сущностями и системой.
Функциональная модель представлена при помощи диаграмм потоков данных (DFD).
Контекстная диаграмма приведена на рисунке 2.17.1, а её детализация на рисунке 2.17.2.
Рис. 2.17.1.Контекстная диаграмма
Рис. 2.17.2.Детализированная диаграмма потоков данных
Словарь данных
@ИМЯ = ДАННЫЕ О СТУДЕНТЕ
@ТИП = дискретный поток
@БНФ = Номер зачётки + Название группы + ФИО + Год рождения + Адрес
@ИМЯ = ДАННЫЕ О ГРУППЕ
@ТИП = дискретный поток
@БНФ = Название группы + Название кафедры + Зав. кафедрой
@ИМЯ = ПОИСК СТУДЕНТА
@ТИП = дискретный поток
@БНФ = Номер зачётки
@ИМЯ = СВЕДЕНИЯ О СТУДЕНТЕ И ГРУППЕ
@ТИП = дискретный поток
@БНФ = ДАННЫЕ О СТУДЕНТЕ + ДАННЫЕ О ГРУППЕ
@ИМЯ = ИНФОРМАЦИЯ О СТУДЕНИЕ
@ТИП = внутренний поток
@БНФ = ДАННЫЕ О СТУДЕНТЕ
@ИМЯ = ИНФОРМАЦИЯ О ГРУППЕ
@ТИП = внутренний поток
@БНФ = ДАННЫЕ О ГРУППЕ
@ИМЯ = НАЙТИ ГРУППУ
@ТИП = внутренний поток
@БНФ = Название группы
@ИМЯ = РЕЗУЛЬТАТ ПОИСКА ГРУППЫ
@ТИП = внутренний поток
@БНФ = НАЙТИ ГРУППУ
@ИМЯ = ПОИСК ИНФОРМАЦИИ О СТУДЕНТЕ
@ТИП = внутренний поток
@БНФ = ПОИСК СТУДЕНТА
@ИМЯ = ИНФОРМАЦИЯ О СТУДЕНТАХ И ГРУППАХ
@ТИП = внутренний поток
@БНФ = СВЕДЕНИЯ О СТУДЕНТЕ И ГРУППЕ
Спецификация процессов
Спецификация процесса A0.1
@ВХОД = ДАННЫЕ О СТУДЕНТЕ
@ВХОД = РЕЗУЛЬТАТ ПОИСКА ГРУППЫ
@ВЫХОД = ДАННЫЕ О СТУДЕНТЕ
@ВЫХОД = НАЙТИ ГРУППУ
@СПЕЦПРОЦ A0.1 ПРОВЕРИТЬ НАЛИЧИЕ ГРУППЫ
НАЙТИ ГРУППУ = Название группы из ДАННЫХ О СТУДЕНТЕ
ЕСЛИ РЕЗУЛЬТАТ ПОИСКА ГРУППЫ не равен NULL ТО
ДАННЫЕ О СТУДЕНТЕ = ДАННЫЕ О СТУДЕНТЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.2
@ВХОД = ДАННЫЕ О СТУДЕНТЕ
@ВЫХОД = ИНФОРМАЦИЯ О СТУДЕНТЕ
@СПЕЦПРОЦ A0.2 ФОРМИРОВАТЬ ИНФОРМАЦИЮ О СТУДЕНТЕ
ЕСЛИ добавить ИНФОРМАЦИЮ О СТУДЕНТЕ ТО
ИНФОРМАЦИЯ О СТУДЕНТЕ = ДАННЫЕ О СТУДЕНТЕ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ О СТУДЕНТЕ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ О СТУДЕНТЕ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ О СТУДЕНТЕ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ О СТУДЕНТЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.3
@ВХОД = ДАННЫЕ О ГРУППЕ
@ВЫХОД = ИНФОРМАЦИЯ О ГРУППЕ
@СПЕЦПРОЦ A0.3 ФОРМИРОВАТЬ ИНФОРМАЦИЮ О ГРУППЕ
ЕСЛИ добавить ИНФОРМАЦИЮ О ГРУППЕ ТО
ИНФОРМАЦИЯ О ГРУППЕ = ДАННЫЕ О ГРУППЕ
КОНЕЦ ЕСЛИ
ЕСЛИ изменить ИНФОРМАЦИЮ О ГРУППЕ ТО
ВЫПОЛНИТЬ редактировать ИНФОРМАЦИЮ О ГРУППЕ
КОНЕЦ ЕСЛИ
ЕСЛИ удалить ИНФОРМАЦИЮ О ГРУППЕ ТО
ВЫПОЛНИТЬ удалить ИНФОРМАЦИЮ О ГРУППЕ
КОНЕЦ ЕСЛИ
Спецификация процесса A0.4
@ВХОД = ПОИСК СТУДЕНТА
@ВХОД = ИНФОРМАЦИЯ О СТУДЕНТАХ И ГРУППАХ
@ВЫХОД = ПОИСК ИНФОРМАЦИИ О СТУДЕНТЕ
@ВЫХОД = СВЕДЕНИЯ О СТУДЕНТЕ И ГРУППЕ
@СПЕЦПРОЦ A0.4 ПОИСК СТУДЕНТА
ПОИСК ИНФОРМАЦИИ О СТУДЕНТЕ = ПОИСК СТУДЕНТА
ВЫПОЛНИТЬ ПОИСК ИНФОРМАЦИИ О СТУДЕНТЕ в БД
СВЕДЕНИЯ О СТУДЕНТЕ И ГРУППЕ = найденная в БД ИНФОРМАЦИЯ О СТУДЕНТАХ И ГРУППАХ
Проектирование структуры базы данных
Выделим три сущности: Студент, Кафедра и Группа.
Связь Студент – Группа имеет тип «Многие к одному» так как в одной группе могут учиться несколько студентов, но каждый студент учится только в одной группе. Связь Группа – Кафедра имеет тип «Многие к одному» так как к одной кафедре относится несколько групп и каждая группа относится к одной кафедре.
Рис. 2.17.3.Структура связей между сущностями
Сущность «Студент» имеет атрибуты: «Номер зачётки», «ФИО», «Год рождения», «Адрес», «Название группы».
Сущность «Группа» имеет атрибуты «Название группы», «Название кафедры».
Сущность «Кафедра» имеет атрибуты «Название кафедры», «Зав кафедрой».
Сущности «Студент» и «Группа» связаны по полю «Название группы», значение которого для сущности «Группа» уникально и является её первичным ключом.
Сущности «Группа» и «кафедра» связаны по полю «Название кафедры», значение которого для сущности «Кафедра» уникально и является её первичным ключом.
Рис. 2.17.4.Структура БД
Для каждой сущности все атрибуты функционально и не транзитивно зависят от первичного ключа и не зависят от части ключа, следовательно, структура базы данных находится в третьей нормальной форме. Атрибут функционально зависит от ключа, когда каждому значению ключа соответствует не более одного значения зависимого атрибута. Например, для ключевого поля «Номер зачётки» значение поля «ФИО» единственно, т. е. один и тот же номер зачётки не может быть более чем у одного студента. Атрибут транзитивно зависит от ключа, если он функционально зависит от ключа, а также от другого атрибута, функционально зависящего от ключа. Например, если объединить таблицы «Студент» и «Группа», то значения атрибута «Название кафедры» зависели бы функционально как от значений первичного ключа «Номер зачётки», так и от значений неключевого атрибута «Название группы». Так как студент учится только в одной кафедре и только в одной группе, и притом каждая группа относится только к одной кафедре.
Опишем структуру каждой таблицы.
Таблица «Студент» (student)
Наименование поля |
Тип данных |
Ограничения |
Номер зачётки (ID_zach) |
Целое число |
Первичный ключ |
Название группы (name_group) |
Строка (15) |
NOT NULL Внешний ключ |
ФИО (FIO) |
Строка (30) |
NOT NULL |
Год рождения (Year_birth) |
Дата |
|
Адрес (Address) |
Строка (30) |
Таблица «Группа» (Groups)
Наименование поля |
Тип данных |
Ограничения |
Название группы (name_group) |
Строка (15) |
Первичный ключ |
Название кафедры (name_Pulpit) |
Строка (15) |
NOT NULL Внешний ключ |
Таблица «Кафедра» (Pulpit)
Наименование поля |
Тип данных |
Ограничения |
Название кафедры (name_Pulpit) |
Строка (15) |
Первичный ключ |
Зав кафедрой (Zav_Pulpit) |
Строка (30) |
NOT NULL |
Реализация спроектированной базы данных при помощи СУБД Visual FoxPro
Создадим проект приложения баз данных. Для чего выберем в главном меню File – New, затем выберем Project и укажем New File – введём имя проекта students и сохраним файл проекта (students.pjx). Далее откроется окно Project Manager (диспетчер проекта) в котором перейдём на вкладку Data (Данные) и выберем пункт Databases и нажмём кнопку New… (Новая). Появится окно, в котором выберем New Database (Новая база данных) и сохраним базу данных как students.dbc. В появившемся окне Database Designer (Построитель базы данных) выберем из контекстного меню New Table… (Новая таблица). Появится окно, в котором выберем New Table (Новая таблица) и сохраним таблицу как Student.dbf. После этого на экране появится диалоговое окно Table Designer (Конструктор таблиц) в котором введём названия всех полей таблицы Студент (Student), укажем их типы данных и ограничения. Создадим индексы для таблицы. Индексы нужны для определения первичного и внешнего ключей в базе данных. Для создания индекса перейдём на вкладку Indexes (Индексы). Сначала создадим индекс первичного ключа таблицы. В поле Name введём имя индекса PK_ Students, а из раскрывающегося списка Type (Тип) выберем тип индекса Primary (Первичный), затем нажмём кнопку справа от поля Expression (Выражение) и введём значение индексного выражения в окне построителя выражений «ID_zach», то есть укажем, что первичным ключом будет поле Номер зачётки. Теперь создадим регулярный индекс для определения внешнего ключа FK_Groups, тип – Regular, выражение – «name_group».
Аналогично создадим две другие таблицы Groups.dbf и Pulpit.dbf. Для таблицы Groups.dbf определим индексы первичного и внешнего ключа и назовём их PK_Groups и FK_Pulpit, а в выражении для первичного ключа проставим название поля первичного ключа name_group, для внешнего ключа – название поля внешнего ключа name_Pulpit. Для таблицы Pulpit.dbf определим индекс для первичного ключа PK_Pulpit, выражение – «name_Pulpit».
Создадим отношения между таблицами. Для этого в окне конструктора базы данных щёлкаем мышью на имени индекса PK_Groups таблицы Groups и переносим к индексу FK_Groups таблицы Student. Также создадим отношение между таблицами Pulpit и Groups, для чего перенесём поле PK_Pulpit из таблицы Pulpit к полю FK_Pulpit таблицы Groups.
Полученная схема базы данных представлена на рисунке 2.17.5.
Рис. 2.17.5. Схема отношений базы данных
Создадим представление, выводящее значения полей всех трёх связанных таблиц. В Диспетчере проекта перейдём на вкладку Data (Данные) – Database затем выберем базу данных studens, в которой выберем пункт Local Views (Локальные Виды) и нажмём на кнопку New, затем выберем New View (Новое представление). В появившемся окне Add Table or View (Добавить таблицу или представление) выберем поочерёдно все три таблицы и нажмем кнопку Add (Добавить). В окне View Designer (Конструктор представления) появятся все три таблицы и автоматически добавятся связи, так как мы их уже задавали при построении схемы базы данных. Выберем в контекстном меню View SQL (Просмотр SQL) и появится окно просмотра SQL запроса для вида, в котором уже будет задана связка таблиц, поэтому добавим только те поля какие мы будем выводить, для чего в разделе SELECT запроса на выборку введём список полей
Student.id_zach, Student.name_group, Student.fio,;
Student.year_birth, Student.address, Pulpit.name_pulpit,;
Pulpit.zav_pulpit;
Перейдём к окну конструктора представления и проверим правильность набранного кода, выбрав из контекстного меню Run Query (Выполнить запрос). Перейдём на вкладку Update General (Обновление) где выберем все поля для изменения, зададим ключевые поля для представления и поставим флажок Send SQL updates для того, чтобы можно было добавлять и редактировать значения полей в таблицах через это представление. Сохраним представление, выбрав File – Save. В появившемся окне View Name (Имя представления) введём Studens_View.
Создание форм
Создадим три формы по одной для каждой таблицы при помощи мастера форм. Для создания формы нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Form и нажать кнопку New. Выберем Form Wizard, затем выберем мастера создания формы с одной таблицы Form Wizard. На первом шаге необходимо выбрать таблицу и поля, которые будут применяться в форме. Укажем таблицу Student базы данных Students и выберем все поля, переместив их в список Selected fields (Выбранные поля).
На втором шаге выберем стиль формы.
На третьем шаге укажем поля, по которым будет происходить упорядочение записи и порядок сортировки записей. Выберем упорядочение по значению поля Номер зачётки (ID_zach), для чего переместим его в список Selected fields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртом шаге введём заголовок для формы в поле Type a title for your form, введём Студенты. Выберем Save and modify it in the Form designer (Сохранить и изменить форму в Конструкторе форм).
Форма откроется в окне конструктора форм, в котором изменим надписи, для чего выделим нужную надпись и в окне свойств Properties – Student.scx изменим свойство Caption. Сохраним изменения, выбрав File – Save.
Рис. 2.17.6. Форма для таблицы «Группы»
Аналогично создадим формы для двух других таблиц.
Создадим форму для представления Students_View. Для этого также выберем создание формы в мастере форм и на первом этапе выберем представление и укажем использовать в форме все его поля. Укажем заголовком формы «Студенты и группы», а после завершения работы мастера, откроем форму в окне конструктора где изменим подписи полей.
Создание отчётов
Для создания отчётов нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Reports(Отчёты) и нажать кнопку New. После этого откроется диалоговое окно New Report (Новый отчёт) Выберем New Report. Появится окно конструктора отчётов Report Designer. Определим среду данных для отчёта, для чего выберем из контекстного меню пункт Data Environment (Среда данных). Щёлкнем правой кнопкой мыши в окне среды данных и выберем в появившемся контекстном меню пункт Add…(Добавить). Добавим представление Studens_View. Перейдём к окну конструктора отчётов.
Для добавления всех полей из среды данных в отчёт выберем в главном меню окна Visual FoxPro Report – Quick Report (Быстрый отчет). Появится окно Quick Report в котором выберем горизонтальное размещение полей, указав соответствующее положение переключателя в разделе Field Layout. Нажмём ОК, и в области Detail отчёта появятся все поля из среды данных отчёта. Изменим надписи для полей и добавим линию для разделения записей при просмотре.
В области Page Footer будут уже помешены поля, содержащие функцию вычисления значения Текущей даты и номера страницы. Добавим ещё поле, выводящее значение, указывающее общее количество строк в отчёте. Для того чтобы вывести значение числа строк, поместим в полосу Page Footer объект Field (Поле). В окне Report Expression нажжём кнопку Calculations (Вычисления), после чего появится диалоговое окно Calculate Field (Вычисляемое поле), в котором выберем операцию Count (Количество), а в поле Expression укажем наименование первого поля – students_view.Id_zach. Рядом добавим соответствующие надписи, поместив на макет формы объекты Label (Надпись) и введя требуемые надписи. Сохраним отчёт.
Рис. 2.17.7. Макет отчёта в окне конструктора форм
Создание меню
Для создания меню нужно в окне Диспетчера проектов перейти на вкладку Other (Другое), где выбрать пункт Menus (Меню) и нажать кнопку New. После этого откроется диалоговое окно New Menu (Новое меню) Выберем Menu. Появится окно конструктора меню Menu Designer. Введём названия пунктов меню в поле Prompt (Наименование), а в раскрывающемся списке Result (Результат) определим действия, происходящие при выборе пункта меню. Введём подменю «Таблицы», для чего в поле Prompt введём название пункта меню «Таблицы», а в списке Result укажем sub>menu (Подменю), затем нажмём на кнопку Create (Создать) после чего в раскрывающемся списке Menu Level (Уровень меню) появится название созданного подменю. Все остальные пункты, созданные на этом уровне, будут пунктами подменю для пункта меню «Таблицы». Создадим пункт «Студенты». Для этого в списке Result укажем Command (Команда) и введём «DO FORM «c:\students\формы\student.scx»«, что значит открыть форму student.scx. Аналогично создадим пункты для открытия трёх других форм.
Затем в списке Menu Level (Уровень меню) выберем верхний уровень – Menu Bar и введём ещё одно подменю «BD», в котором укажем два пункта «Отчёт» и «Выход». В поле ввода команды для пункта «Отчёт» введём «REPORT FORM c:\students\отчёты\report.frx PREVIEW», т. е открытие файла отчёта. Для пункта «Выход» укажем команду QUIT.
Чтобы меню можно было использовать в приложении, сначала его нужно сгенерировать. Для этого используется пункт системного меню Menu (Меню) и диалоговое окно Generate Menu (Генерация меню). В этом окне укажем файл, в котором будет сохранено меню, после чего нажмём кнопку Generate (Генерация).
Созданное меню необходимо запустить на экранной форме. Если просто в Диспетчере проекта выделить меню и нажать Run (Выполнить), то меню будет запущено в главном окне Visual FoxPro. Для того чтобы меню запускалось в форме приложения баз данных, необходимо установить флажок Top-Level Form (Форма верхнего уровня) в диалоговом окне General Options (Основные опции) (пункт меню View или Menu) и снова запустить процесс генерации меню.
Теперь создадим главную форму приложения, из которой будут открываться все остальные. Назовём её Main_form. Поместим на макет формы компонент Command Group (Группа командных кнопок), у которого в свойстве ButtonCount (Количество кнопок) укажем значение 4 по количеству форм. В выпадающем списке вверху окна свойств выбираем нужную кнопку и в свойство Caption напишем текст надписи на этой кнопке. Затем перейдём на вкладку Methods (Методы) и выбираем метод Click Event (Событие щелчок). Щёлкнем два раза на названии события, после чего появится окно Command1.Click, в котором введём команду
DO FORM «<путь к файлу формы>«
Также поместим ещё один компонент Command Group с двумя кнопками для вывода отчёта и выхода из программы. Изменим аналогично текст надписи и зададим обработчики события нажатия на эти кнопки.
Теперь поместим на эту форму созданное ранее меню. Для этого сначала установим свойство формы ShowWindow равным 2 – As top level form (Как форма верхнего уровня), затем в методе Init Event пропишем путь к файлу меню
DO c:\students\меню\menu1.mpr WITH THIS, .T.
Поместим в обработчик события Destroy Event (Закрытие формы) формы команду CLEAR EVENTS для того, чтобы можно было выйти из программы при закрытии формы.
Создадим файл основной программы. Для этого в окне Диспетчера проекта перейдём на вкладку Code, где выберем пункт Programs (Программы) и нажмём кнопку New….Появится окно Program1, в котором напишем
DO FORM c:\students\формы\main_form.scx
_SCREEN.Visible = .T.
READ EVENTS
Сначала откроется окно главной формы, затем значение свойства Visible (Видимость) окна проставим в Истина. Затем зададим точку останова командой READ EVENTS, то есть после выполнения этой команды программа будет ожидать действий пользователя, и все следующие за ней команды не будут выполнятся до тех пор, пока не будет выполнена команда CLEAR EVENTS.
Сохраним файл программы как Program1.prg и сделаем этот файл основной в приложении, для чего выделим его в Диспетчере проекта и в контекстном меню выберем пункт Set Main (Сделать основным). Файл при этом станет выделенным жирным шрифтом.
Построение исполняемого файла
Для того чтобы сделать исполняемый файл с расширением .exe, необходимо выбрать опцию Build Executable (Построить исполняемый файл) в диалоговом окне Build Options (Опции построения), которое вызывается при нажатии кнопки Build (Построить) в окне диспетчера проекта. Потом нажать ОК и указать куда следует поместить исполняемый файл.
Чтобы в готовом файле .exe в процессе ввода часть русских букв автоматически не заменялись латинскими буквами из-за несовпадения кодовых страниц, необходимо в директорию, где находится .exe файл поместить файл конфигурации CONFIG.FPW, в котором указать
CODEPAGE=1251
Также можно поместить этот файл внутрь исполняемого файла. Для этого нужно добавить файл конфигурации в проект на закладке Other в раздел Text Files.