Реферат по предмету "Информатика, программирование"


Построение модели DFD и реализация в СУБД Visual FoxPro

2.15 Модель предметной области описывается следующим неформальнымтекстом:
1.  В университете занятия проводятся вразличных корпусах.
2.  Каждый корпус имеет уникальное название.
3.  Номера аудиторий уникальны в пределаходного корпуса.
4.  Каждая аудитория характеризуется числомпосадочных мест, типом (поточная, лекционная, лаборатория, компьютерный класс).
5.  Один и тот же тип может быть уразличных аудиторий.
6.  Каждый корпус имеет свой адрес.
7.  К каждой аудитории прикреплен одинсотрудник, ответственный за пожарную безопасность.
8.  Один сотрудник может быть ответственнымза несколько аудиторий.
9.  Сотрудник имеет табельный номер, ФИО,должность, служебный телефон.
а. Постройтефункциональную модель для заданной предметной области с помощью методологии DFD:
·         идентифицировать систему
·         определить сущности
·         определить потоки данных междусущностями и системой
б. Спроектируйтеструктуру базы данных методом «Сущность — Связь» для разработаннойфункциональной модели.
в. Структуруспроектированной базы данных реализуйте с помощью любой СУБД. Приложение должносодержать следующие объекты: формы, отчеты и меню./>Построение функциональной модели
Систему назовём«Система учёта аудиторий».
Данная системахранит информацию об аудиториях. Преподаватели и студенты могут найти в нейсведения о местоположении корпуса, а также о типе аудитории, числе посадочныхмест и других сведений, зная лишь название корпуса и номер аудитории.Администрация, в случае обнаружения нарушений правил пожарной безопасности вкакой либо из аудиторий, при помощи данной системы может быстро найти всесведения о сотруднике, ответственном за пожарную безопасность в даннойаудитории.
Определимсущности предметной области:
o    Корпуса
o    Аудитории
o    Сотрудники
Определим потокиданных между сущностями и системой.
Функциональнаямодель представлена при помощи диаграмм потоков данных (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, затем выберем мастера создания формы с одной таблицы FormWizard. На первом шаге необходимо выбрать таблицу и поля, которыебудут применяться в форме. Укажем таблицу AUDITORIUMS базы данных AUDITORIUMS (несвободную таблицу, потому, что мы её уже добавили в базу данных) и выберем всеполя, переместив их в список Selected fields (Выбранные поля).
/>
Рис. 2.15.8.Создание формы при помощи мастера форм
На втором шагевыберем стиль формы.
На третьем шагеукажем поля, по которым будет происходить упорядочение записи и порядоксортировки записей. Выберем упорядочение по значению поля Название корпуса(name_build), для чего переместим его в список Selected fields(Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртомшаге введём заголовок для формы в поле Type a titlefor your form, введём Аудитории. Выберем Save and modifyit 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, введём Аудитории и корпуса. Выберем Saveand modify it in the Form designer (Сохранить и изменить форму в Конструкторе форм). Сохранимформу как Auditoriums andBuildings.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 (Поле) из элементов управления отчётом ReportControls. При этом появится диалоговое окно ReportExpression (Выражение для отчёта), затем введём в поле Expressionнаименование требуемого поля. В области Page Footer поместимзначение, указывающее общее количество строк в отчёте и выведем текущую дату.Для того чтобы вывести значение числа строк, поместим в полосу PageFooter объект 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 укажем Submenu(Подменю), затем нажмём на кнопку Create (Создать) после чего в раскрывающемся списке MenuLevel (Уровень меню) появится название созданного подменю. Все остальныепункты, созданные на этом уровне, будут пунктами подменю для пункта меню«Таблицы». Создадим пункт «Аудитории». Для этого в списке Result укажем Command(Команда) и введём «DO FORM «c:\бд auditoriums\формы\auditoriums.scx»«, чтозначит открыть форму auditoriums.scx. Аналогично создадим пункты для открытиятрёх других форм.
/>
Рис. 2.15.14.Создание меню
Затем в списке MenuLevel (Уровень меню) выберем верхний уровень – Menu Bar и введёмещё одно подменю «БД», в котором укажем два пункта «Отчёт» и «Выход». В полеввода команды для пункта «Отчёт» введём «REPORT FORM «c:\бдauditoriums\отчёты\report1.frx» PREVIEW», т. е открытие файла отчёта. Дляпункта «Выход» укажем команду QUIT.
Чтобы меню можнобыло использовать в приложении, сначала его нужно сгенерировать. Для этогоиспользуется пункт системного меню Menu (Меню) и диалоговое окно Generate Menu (Генерацияменю). В этом окне укажем файл, в котором будет сохранено меню, после чегонажмём кнопку Generate (Генерация).
Созданное менюнеобходимо запустить на экранной форме. Если просто в Диспетчере проектавыделить меню и нажать Run (Выполнить), то меню будет запущено в главном окне VisualFoxPro. Для того чтобы меню запускалось в форме приложения базданных, необходимо установить флажок Top-Level Form (Форма верхнего уровня) в диалоговом окне General Options (Основные опции) и снова запустить процесс генерации меню.
Теперь создадимглавную форму приложения, из которой будут открываться все остальные. Назовёмеё Main_form. На эту форму поместим четыре кнопки, и зададим команды назапуск соответствующих форм при нажатии на эти кнопки. Поместим на макет формы компонентCommand Button (Командная кнопка), у которого в свойстве Caption напишемтекст надписи на кнопке, например, для кнопки вызова формы Аудитории так инапишем Аудитории. Затем перейдём на вкладку Methods (Методы) окна Properties(Свойства) формы и выбираем метод Click Event (Событие щелчок). Щёлкнем два раза на названии события,после чего появится окно Command1.Click, в котором введём
DOFORM «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, в котором напишем
DOFORM «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 (Построить исполняемый файл) в диалоговом окне BuildOptions (Опции построения), которое вызывается при нажатии кнопки 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. После этого на экране появится диалоговое окно TableDesigner (Конструктор таблиц) в котором введём названия всех полейтаблицы Группы (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 Tableor 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 (Выполнить запрос). Перейдём на вкладку UpdateGeneral (Обновление) и поставим флажок Send SQL updates длятого, чтобы можно было добавлять и редактировать значения полей в таблицахчерез это представление. Сохраним представление, выбрав File – Save. Впоявившемся окне View Name (Имя представления) введём Student_groups_View./> Создание форм
Создадим триформы по одной для каждой таблицы при помощи мастера форм. Для создания формынужно в окне Диспетчера проектов перейти на вкладку Documents, где выбратьпункт Form и нажать кнопку New. Выберем Form Wizard, затем выберем мастера создания формы с одной таблицы FormWizard. На первом шаге необходимо выбрать таблицу и поля, которыебудут применяться в форме. Укажем таблицу Groups базы данных Student_Groups ивыберем все поля, переместив их в список Selected fields(Выбранные поля).
На втором шагевыберем стиль формы.
На третьем шагеукажем поля, по которым будет происходить упорядочение записи и порядоксортировки записей. Выберем упорядочение по значению поля Название группы(Name_group), для чего переместим его в список Selected fields(Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртомшаге введём заголовок для формы в поле Type a titlefor your form, введём Группы. Выберем Save and modifyit 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. Перейдём к окну конструктора отчётов.
Для добавлениявсех полей из среды данных в отчёт выберем в главном меню окна VisualFoxPro Report – Quick Report (Быстрый отчет). Появится окно Quick Report в которомвыберем вертикальное размещение полей, указав соответствующее положениепереключателя в разделе Field Layout. Нажмём ОК, и в области Detail отчёта появятся всеполя из среды данных отчёта. Изменим надписи для полей и добавим линию дляразделения записей при просмотре.
В области PageFooter будут уже помешены поля, содержащие функцию вычислениязначения Текущей даты и номера страницы. Добавим ещё поле, выводящее значение,указывающее общее количество строк в отчёте. Для того чтобы вывести значениечисла строк, поместим в полосу 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 укажем Submenu(Подменю), затем нажмём на кнопку Create (Создать) после чего в раскрывающемся списке MenuLevel (Уровень меню) появится название созданного подменю. Все остальныепункты, созданные на этом уровне, будут пунктами подменю для пункта меню«Таблицы». Создадим пункт «Группы». Для этого в списке Result укажем Command(Команда) и введём «DO FORM «c:\student groups\формы\groups.scx»«, чтозначит открыть форму groups.scx. Аналогично создадим пункты для открытия трёхдругих форм.
Затем в списке MenuLevel (Уровень меню) выберем верхний уровень – Menu Bar и введёмещё одно подменю «BD», в котором укажем два пункта «Отчёт» и «Выход». В полеввода команды для пункта «Отчёт» введём «REPORT FORM «c:\studentgroups\отчёты\report.frx» PREVIEW», т. е открытие файла отчёта. Для пункта«Выход» укажем команду QUIT.
Чтобы меню можнобыло использовать в приложении, сначала его нужно сгенерировать. Для этогоиспользуется пункт системного меню Menu (Меню) и диалоговое окно Generate Menu (Генерацияменю). В этом окне укажем файл, в котором будет сохранено меню, после чегонажмём кнопку Generate (Генерация).
Созданное меню необходимозапустить на экранной форме. Если просто в Диспетчере проекта выделить меню инажать Run (Выполнить), то меню будет запущено в главном окне VisualFoxPro. Для того чтобы меню запускалось в форме приложения базданных, необходимо установить флажок 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 (Как форма верхнего уровня), затем в методе InitEvent пропишем путь к файлу меню
DO«c:\student groups\меню\menu1.mpr» WITH THIS, .T.
Поместим вобработчик события Destroy Event (Закрытие формы) формы команду CLEAR EVENTS для того,чтобы можно было выйти из программы при закрытии формы.
Создадим файлосновной программы. Для этого в окне Диспетчера проекта перейдём на вкладку Code, гдевыберем пункт Programs (Программы) и нажмём кнопку New….Появится окноProgram1, в котором напишем
DOFORM «c:\student groups\формы\main_form.scx»
_SCREEN.Visible = .T.
READ EVENTS
Сначалаоткроется окно главной формы, затем значение свойства Visible (Видимость) окнапроставим в Истина. Затем зададим точку останова командой READ EVENTS, то естьпосле выполнения этой команды программа будет ожидать действий пользователя, ивсе следующие за ней команды не будут выполнятся до тех пор, пока не будетвыполнена команда CLEAR EVENTS.
Сохраним файлпрограммы как Program1.prg и сделаем этот файл основной в приложении, для чеговыделим его в Диспетчере проекта и в контекстном меню выберем пункт Set Main (Сделатьосновным). Файл при этом станет выделенным жирным шрифтом./> Построение исполняемого файла
Для того чтобысделать исполняемый файл с расширением .exe, необходимо выбратьопцию Build Executable (Построить исполняемый файл) в диалоговом окне BuildOptions (Опции построения), которое вызывается при нажатии кнопки 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. После этого на экране появится диалоговое окно TableDesigner (Конструктор таблиц) в котором введём названия всех полейтаблицы Студент (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 Tableor 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 (Выполнить запрос). Перейдём на вкладку UpdateGeneral (Обновление) где выберем все поля для изменения, зададимключевые поля для представления и поставим флажок Send SQL updates длятого, чтобы можно было добавлять и редактировать значения полей в таблицахчерез это представление. Сохраним представление, выбрав File – Save. В появившемсяокне View Name (Имя представления) введём Studens_View./> Создание форм
Создадим триформы по одной для каждой таблицы при помощи мастера форм. Для создания формынужно в окне Диспетчера проектов перейти на вкладку Documents, где выбратьпункт Form и нажать кнопку New. Выберем Form Wizard, затем выберем мастера создания формы с одной таблицы FormWizard. На первом шаге необходимо выбрать таблицу и поля, которыебудут применяться в форме. Укажем таблицу Student базы данных Students ивыберем все поля, переместив их в список Selected fields(Выбранные поля).
На втором шагевыберем стиль формы.
На третьем шагеукажем поля, по которым будет происходить упорядочение записи и порядоксортировки записей. Выберем упорядочение по значению поля Номер зачётки (ID_zach), для чегопереместим его в список Selected fields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртомшаге введём заголовок для формы в поле Type a titlefor your form, введём Студенты. Выберем Save and modifyit 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. Перейдём к окну конструктора отчётов.
Для добавлениявсех полей из среды данных в отчёт выберем в главном меню окна VisualFoxPro Report – Quick Report (Быстрый отчет). Появится окно Quick Report вкотором выберем горизонтальное размещение полей, указав соответствующееположение переключателя в разделе Field Layout. Нажмём ОК, и в области Detail отчёта появятся всеполя из среды данных отчёта. Изменим надписи для полей и добавим линию дляразделения записей при просмотре.
В области PageFooter будут уже помешены поля, содержащие функцию вычислениязначения Текущей даты и номера страницы. Добавим ещё поле, выводящее значение,указывающее общее количество строк в отчёте. Для того чтобы вывести значениечисла строк, поместим в полосу 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 укажем Submenu (Подменю), затем нажмём на кнопку Create (Создать) послечего в раскрывающемся списке Menu Level (Уровень меню) появится название созданного подменю. Всеостальные пункты, созданные на этом уровне, будут пунктами подменю для пунктаменю «Таблицы». Создадим пункт «Студенты». Для этого в списке Result укажем Command(Команда) и введём «DO FORM «c:\students\формы\student.scx»«, что значит открыть форму student.scx. Аналогично создадимпункты для открытия трёх других форм.
Затем в списке MenuLevel (Уровень меню) выберем верхний уровень – Menu Bar и введёмещё одно подменю «BD», в котором укажем два пункта «Отчёт» и «Выход». В полеввода команды для пункта «Отчёт» введём «REPORT FORMc:\students\отчёты\report.frx PREVIEW», т. е открытие файла отчёта. Для пункта«Выход» укажем команду QUIT.
Чтобы меню можнобыло использовать в приложении, сначала его нужно сгенерировать. Для этогоиспользуется пункт системного меню Menu (Меню) и диалоговое окно Generate Menu (Генерацияменю). В этом окне укажем файл, в котором будет сохранено меню, после чегонажмём кнопку Generate (Генерация).
Созданное менюнеобходимо запустить на экранной форме. Если просто в Диспетчере проектавыделить меню и нажать Run (Выполнить), то меню будет запущено в главном окне VisualFoxPro. Для того чтобы меню запускалось в форме приложения базданных, необходимо установить флажок 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 (Как форма верхнего уровня), затем в методе InitEvent пропишем путь к файлу меню
DOc:\students\меню\menu1.mpr WITH THIS, .T.
Поместим вобработчик события Destroy Event (Закрытие формы) формы команду CLEAR EVENTS для того,чтобы можно было выйти из программы при закрытии формы.
Создадим файлосновной программы. Для этого в окне Диспетчера проекта перейдём на вкладку Code, гдевыберем пункт Programs (Программы) и нажмём кнопку New….Появится окноProgram1, в котором напишем
DOFORM c:\students\формы\main_form.scx
_SCREEN.Visible = .T.
READ EVENTS
Сначалаоткроется окно главной формы, затем значение свойства Visible (Видимость) окнапроставим в Истина. Затем зададим точку останова командой READ EVENTS, то естьпосле выполнения этой команды программа будет ожидать действий пользователя, ивсе следующие за ней команды не будут выполнятся до тех пор, пока не будет выполненакоманда CLEAR EVENTS.
Сохраним файлпрограммы как Program1.prg и сделаем этот файл основной в приложении, для чеговыделим его в Диспетчере проекта и в контекстном меню выберем пункт Set Main (Сделатьосновным). Файл при этом станет выделенным жирным шрифтом./> Построение исполняемого файла
Для того чтобысделать исполняемый файл с расширением .exe, необходимо выбратьопцию Build Executable (Построить исполняемый файл) в диалоговом окне BuildOptions (Опции построения),которое вызывается при нажатии кнопки Build (Построить) в окне диспетчерапроекта. Потом нажать ОК и указать куда следует поместить исполняемый файл.
Чтобы в готовомфайле .exe в процессе ввода часть русских букв автоматически незаменялись латинскими буквами из-за несовпадения кодовых страниц, необходимо вдиректорию, где находится .exe файл поместить файл конфигурации CONFIG.FPW, в которомуказать
CODEPAGE=1251
Также можнопоместить этот файл внутрь исполняемого файла. Для этого нужно добавить файлконфигурации в проект на закладке Other в раздел Text Files.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.