1. Построение формы для ввода данных.
(основные этапы)
Вид готовой формы:

Размещаем в необходимом месте и с необходимыми размерами поля ввода на форме. Тип поля ввода 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
---

