1. Построение формы для ввода данных.

(основные этапы)

Вид готовой формы:

Использование мастера для подготовки шаблона. Используем таблицу testing, выбираем все поля кроме cid, внешний вид используем выровненный, выбираем пункт изменить внешний вид формы и переходим в конструктор форм. Редактирование визуальных элементов. Открываем окно свойств для формы в целом и изменяем следующие свойства:

Размещаем в необходимом месте и с необходимыми размерами поля ввода на форме. Тип поля ввода id_lecturer, id_student, id_discipline, id_exam следует преобразовать в поле с выпадающим списком.

Назначение полям наборов данных. Для каждого из перечисленных полей в окне свойств на вкладке данные значение поля тип источника строк должно быть «таблица или запрос». Поле источник строк должно содержать SQL-запрос, сгенерированный построителем запросов:

Для id_exam: SELECT * FROM exams;

Для id_discipline: SELECT id_discipline, name FROM disciplines;

Для id_students: SELECT students. id_student, students. lastname+" "+students. firstname+" "+students. patronymic AS fio, students. group, specializations. name FROM specializations INNER JOIN students ON specializations. id_way = students. id_way;

Для id_lecturer: SELECT lecturers. id_lecturer, lastname+" "+firstname+" "+patronymic AS fio, jobs. name, chairs. name FROM jobs INNER JOIN (chairs INNER JOIN lecturers ON chairs. id_chair = lecturers. id_chair) ON jobs. id_job = lecturers. id_job;

Так как в некоторых из перечисленных полей используется не менее двух столбцов данных, требуется определить формат вывода данных на экран путём настройки свойства «ширина столбцов» на вкладке «макет». Первый столбец данных, совпадающий со значением поля, определённом в свойстве «данные», на экран не выводится. Пример:

НЕ нашли? Не то? Что вы ищете?

Включаем «режим формы» и проверяем, что получилось.

2. Вводим выборку группы по номеру.

В случае созданной ранее формы это оказывается не очень тривиальной задачей, и лучше было бы создать форму заново, без участия мастера, включая создание кнопок перемещения по записям. Однако мы пойдём более простым, хотя и не самым хорошим, путём:

Изменим запрос на выборку данных для формы:

SELECT testing. id_exam, testing. id_discipline, testing. id_lecturer, testing. id_student, testing. result, testing. date, ment, students. group

FROM students INNER JOIN testing ON students. id_student = testing. id_student

ORDER BY testing. id_exam, testing. id_discipline, testing. id_lecturer, testing. id_student, testing. result;

Введём свободный выпадающий список с источником строк:

SELECT DISTINCT students. group FROM students ORDER BY students. group;

Введём для этого списка имя var_group и следующую реакцию на событие «изменение»:

Private Sub var_group_Change()

Me. Refresh

End Sub

В свойстве «источник строк» для списка студентов следует внести следующие изменения:

SELECT students. id_student, students. lastname+" "+students. firstname+" "+students. patronymic AS FIO, specializations. name

FROM specializations INNER JOIN students ON specializations. id_way = students. id_way

WHERE students. group=[var_group]

ORDER BY students. lastname+" "+students. firstname+" "+students. patronymic;

И самое главное, как же в поле var_group будет записываться номер группы текущей записи. А вот как: в свойствах формы в целом, для события «текущая запись» следует ввести:

Private Sub Form_Current()

var_group. Value = group

Me. Refresh

End Sub

Тестируем, и выявляем достаточное количество сбоев в работе этой изменённой формы.

3. Начинаем создавать форму для просмотра данных.

Вот то, что должно получиться:

Назовём новую форму «Просмотр данных», и создадим её с помощью конструктора. Форма не будет иметь собственного источника записей, поэтому в свойствах макета следует выключить «кнопки перехода», «область выделения» и «разделительные линии». Форма будет содержать несколько выпадающих списков с именами var_discipline, var_group, var_exam, а также подчинённую форму с именем «List», для которой принято табличное представление. Данные для заполнения выпадающих списков сформируем так же, как и в предыдущей форме. Каждому выпадающему списку назначим процедуру на событие «изменение»:

Private Sub var_discipline_Change()

Me. Refresh

End Sub

Private Sub var_exam_Change()

Me. Refresh

End Sub

Private Sub var_group_Change()

Me. Refresh

End Sub

Первоначально источником записей подчинённой формы пусть будет достаточно сложный запрос (его можно подготовить заранее как независимый запрос, и воспользоваться мастером для создания подчинённой формы):

SELECT disciplines. id_discipline, disciplines. name, exams. id_exam, exams. name,

students. lastname+' '+students. firstname+' '+students. patronymic AS student,

students. group, testing. result, testing. date,

lecturers. lastname+' '+lecturers. firstname+' '+lecturers. patronymic AS lecturer

FROM students INNER JOIN (lecturers

INNER JOIN (exams

INNER JOIN (disciplines

INNER JOIN testing

ON disciplines. id_discipline = testing. id_discipline)

ON exams. id_exam = testing. id_exam)

ON lecturers. id_lecturer = testing. id_lecturer)

ON students. id_student = testing. id_student

WHERE testing. id_discipline=[Forms]![Просмотр данных].[var_discipline]

AND testing. id_exam=[Forms]![Просмотр данных].[var_exam]

AND students. group = [Forms]![Просмотр данных].[var_group]

ORDER BY disciplines. name, exams. name, students. group, students. lastname, students. firstname

Поля в подчинённой форме, следовательно, будут такими:

В свойствах макета подчинённой формы можно исключить возможность её переключения из режима таблицы в режим формы.

Подсчитаем средний балл по результатам, которые выводятся в таблице. Для этого в примечании подчинённой формы создадим текстовое поле с именем avg_ball, данными которого будет выражение =Avg(Val([result])). В режиме таблицы это поле будет невидимо, поэтому в основной форме создадим текстовое поле, в котором будут отображаться данные из avg_ball. Данными этого поля будет выражение =List. Form! avg_ball. Форма готова, однако для конечного пользователя она слишком примитивна. Добавим «изюминку» в виде checkbox-ов (флажков), которыми можно выключать или включать действие соответствующих полей со списком. Дадим имена флажкам такие: sel_discipline, sel_exam, sel_group. Сделаем так, чтобы запрос, показанный в пункте 2, переписывался бы в подчинённую форму в зависимости от того, какие флажки включены. Это потребует написания сравнительно объёмного программного кода:

‘создаём три глобальные текстовые переменные

Public str_discipline

Public str_exam

Public str_group

‘пишем функцию, которая будет формировать источник записей для подчинённой формы

Private Sub Load_SQL()

SQL_string = "SELECT disciplines. id_discipline, disciplines. name, exams. id_exam, exams. name, students. lastname+' '+students. firstname+' '+students. patronymic AS student, students. group, testing. result, testing. date, lecturers. lastname+' '+lecturers. firstname+' '+lecturers. patronymic AS lecturer FROM disciplines INNER JOIN (exams INNER JOIN (lecturers INNER JOIN (students INNER JOIN testing ON students. id_student = testing. id_student) ON lecturers. id_lecturer = testing. id_lecturer) ON exams. id_exam = testing. id_exam) ON disciplines. id_discipline = testing. id_discipline WHERE 1=1 " + str_discipline + str_exam + str_group + "ORDER BY disciplines. name, exams. name, students. group, students. lastname, students. firstname;"

‘следующая строка записывает сформированную строку запроса в соответствующее свойство подчинённой формы

Me.[List].Form. RecordSource = SQL_string

End Sub

‘для каждого флажка к свойству «после обновления» прикрепляем следующий программный код:

Private Sub sel_discipline_AfterUpdate()

If sel_discipline. Value = True Then

var_discipline. Enabled = True

str_discipline = " AND testing. id_discipline = [Forms]![Просмотр данных].[var_discipline] "

Else

var_discipline. Enabled = False

str_discipline = " "

End If

Load_SQL

Me. Refresh

End Sub

Private Sub sel_exam_AfterUpdate()

If sel_exam. Value = True Then

var_exam. Enabled = True

str_exam = " AND testing. id_exam = [Forms]![Просмотр данных].[var_exam] "

Else

var_exam. Enabled = False

str_exam = " "

End If

Load_SQL

Me. Refresh

End Sub

Private Sub sel_group_AfterUpdate()

If sel_group. Value = True Then

var_group. Enabled = True

str_group = " AND students. group = [Forms]![Просмотр данных].[var_group] "

Else

var_group. Enabled = False

str_group = " "

End If

Load_SQL

Me. Refresh

End Sub

Форма готова, однако при её рестарте значения активных и неактивных полей будут мешать адекватному восприятию информации, поэтому можно в свойство формы «загрузка» дополнительно внести следующий код:

Private Sub Form_Load()

sel_discipline. Value = True

str_discipline = " AND testing. id_discipline = [Forms]![ Просмотр данных].[var_discipline] "

var_discipline. Enabled = True

sel_exam. Value = True

str_exam = " AND testing. id_exam = [Forms]![ Просмотр данных].[var_exam] "

var_exam. Enabled = True

sel_group. Value = True

str_group = " AND students. group = [Forms]![ Просмотр данных].[var_group] "

var_group. Enabled = True

Load_SQL

End Sub

---