Добавление новых функций к форме Классный журнал - предметы.
Как вы видите, классный журнал работает уже хорошо. Однако в него нужно добавить несколько нужных новых функций. Журнал показывает оценки по выбранному предмету и классу. Но показывает ВСЕ оценки данного класса по данному предмету. А оценок может быть много. Поэтому необходимо ввести специальные функции для того, чтобы можно было вводить ограничения по датам. Сделаем поля и кнопки для того, чтобы было удобно вводить ограничения по датам.
- Откройте в режиме конструктора форму «Классный журнал – предметы».
- Справа от полей Предмет и преподаватель поставьте два поля (не поля со списком), и подпишите их: «Дата – ОТ:» и «Дата – ДО:»
- Правой кнопкой щелкните на поле Дата ОТ: (на поле, а не на его подписи!) и выберите - Свойства – Другие и смените имя на «От». Аналогично замените имя списка Дата – ДО на «До». Заблокируйте оба списка. (Свойства – Данные – Блокировка – Да). Пока закройте конструктор формы.
- В главном окне базы правой кнопкой щелкните на форме «Дата» и выберите – Копировать. Затем щелкните правой кнопкой на пустом месте Главного окна базы и выберите Вставить. Введите имя новой формы «Дата – ОТ». Еще раз вставьте форму и назовите ее «Дата – ДО».
-
Главное окно базы - Аналогично создайте макрос ПодстановкаДатыДО, который должен подставлять в поле «До»формы Классный журнал – предметы значение поля Дата формы Дата – ДО.
- Откройте в режиме конструктора форму Дата – ОТ и войдите в свойства кнопки Подставить дату. Перейдите на вкладку События и в событии нажатия кнопки выберите макрос ПодстановкаДатыОт. Закройте макет и конструктор.
- Аналогично в режиме конструктора откройте форму Дата – ДО и свяжите событие нажатия ее кнопки с макросом ПодстановкаДатыДО.
- Сделайте формы Дата – ОТ и Дата – ДО модальными (Конструктор – макет – другие – модальное окно – да)
- Откройте в конструктора форму Классный журнал – предметы и справа от поля Дата От: поставьте кнопку. В настройках: Работа с формой – Открыть форму – «Дата – ОТ» - Текст – «ввести дату». Закройте конструктор.
- Откройте форму Классный журнал, выберите класс и откройте журнал. Если все правильно, то после нажатия кнопки Ввести дату появляется окно ввода соответствующей даты и после нажатия кнопки дата вставляется в нужное поле. Однако потом приходится вручную окно выбора даты закрывать. Это неудобно.
- Откройте в режиме конструктора макрос ПодставитьДатуОТ. Во второй строчке введите (выберите) команду Закрыть. В аргументах укажите: Тип объекта – форма, Имя объекта - , Дата – ОТ, сохранение – Да. Аналогично измените макрос ПодставитьДатуДо. Теперь при выборе дат окна выбора сами закрываются. Проверьте!
Все работает? Да. Но зачем нам нужно заполнять поля дат? Как и где будет производиться отбор данных подчиненной формы?
А мы сделаем две формы – одна будет выводить данные, как она сейчас выводит – не взирая на дату, а вторая – только те оценки класса поданному предмету, которые входят в указанный диапазон дат. Для этого нам придется кардинально изменить форму Классный журнал – предметы.
- В главном окне базы выделите форму Классный журнал – подчиненная форма. Скопируйте ее и вставьте под именем Классный журнал – по датам.
- Откройте в режиме конструктора форму Классный журнал – предметы.
- Щелкните правой кнопкой по подчиненной форме (там, где оценки) и выберите Вырезать (не Копировать!). Подчиненная форма должна исчезнуть.
- Вставьте на место исчезнувшей формы объект Вкладка. Растяните его так, чтобы он занимал все оставшееся место от вырезанной формы.
- Выберите левую (из двух) вкладку, щелкните правой кнопкой мыши внутри нее и выберите Вставить. Вырезанная подчиненная форма должна вставиться внутрь вкладки. Растяните форму по размеру вкладки, оставляя справа место для будущих кнопок (см. рис.)
- Щелкните правой кнопкой мыши на заголовке первой вкладки, выберите – Другие и введите имя «Все оценки».
- Переименуйте правую (вторую) вкладку «Выбор по датам».
- Перейдите на вкладку «Выбор по датам» и переместите окно конструктора так, чтобы стало видно Главное окно базы.
- С главного окна базы перетащите на вкладку «Выбор по датам» форму Классный журнал – по датам. Удалите надпись сверху от появившейся таблице (в ней будет написано - Классный журнал – подчиненная форма, но на самом деле это новая форма) и растяните новую подчиненную форму на все пространство вкладки, оставив справа точно такое же место под кнопки.
- Находясь на вкладке «Выбор по датам», войдите в макет подчиненной формы. Перейдите на вкладку Данные и щелкните по кнопке справа на строке Источник записей.
- В появившемся запросе перейдите в верхнее поле, щелкните правой кнопкой мышью и выберите – Добавить таблицу. Добавьте таблицу Предметы. Справа от всех поле запроса добавьте запрос по таблице Предметы по полю Предмет. В условие отбора запишите условие, при котором отбирались бы только оценки, полученные по тому предмету, который сейчас введен в поле Предмет формы Классный журнал – предметы: Forms![Классный журнал - предметы]![Предмет]
- В поле дата в строке Условие отбора напишите условие, которое отбирает данные между датой, написанной в поле ОТ и датой, написанной в поле ДО: Between Forms![Классный журнал - предметы]![От] And Forms![Классный журнал - предметы]![До] (все вводится в одну строчку!)
- Закройте макет и конструктор.
- Откройте форму Классный журнал.
- Выберите класс, параллель и нажмите кнопку Открыть журнал.
- В журнале выберите предмет, введите даты отбора.
- Пользуясь вкладками, проверьте, работает ли отбор по датам во вкладке «Выбор по датам».
- Попытайтесь изменить даты. Однако при этом ничего не меняется, пока предмет не сменим и не вернемся назад. Это происходит потому, что подчиненная форма не обновляется автоматически после смены дат.
- Перейдите в макрос ПодставитьДатуОТ, и в третьей строчке выберите команду обновление, а в аргументе Имя элемента поставьте «Классный журнал - по датам». Аналогично измените макрос ПодставитьДатуДО.Теперь при вводе даты таблица будет автоматически обновляться. Проверьте!
Создание отчетов
Средние оценки по предмету
Создадим отчет, который будет выводить средние оценки учеников класса по выбранному предмету, а так же отчет, который выводит то же самое, но еще и в указанном диапазоне дат.
Для работы с такими отчетами нам нужны вспомогательные таблицы, которые создадим при помощи запросов.
Создание запросов
- Выйдите на запросы и создайте запрос в режиме конструктора. Включите в него все таблицы – Ученики, Предметы и Журнал Оценок. В запросе первое поле вычисляется по полю Фамилия из таблицы Ученики, далее - Имя, Класс, Параллель (из той же таблицы Ученики), пятое поле – из поля Предмет таблицы Предметы, шестое – из поля Оценка таблицы Журнал Оценок и седьмое – из поля Дата таблицы Журнал оценок. Этот запрос должен содержать только данные о том классе, который выбран в форме Классный журнал, и о том предмете, который выбран в форме Классный журнал – предметы. Введите при помощи построителя выражений соответствующие условия отбора в нужные поля. Например, отбор по предметам производится по значению поле Предмет формы Классный журнал – предметы: [Forms]![Классный журнал - предметы]![Предмет].Сохраните запрос «Все оценки класса по предмету».
- В главном окне базы скопируйте запрос и копию назовите как «Все оценки класса по предмету по датам». Откройте этот запрос в режиме конструктора и в поле Дата добавьте условие отбора по диапазону дат, который задается в форме Классный журнал – предметы: Between Forms![Классный журнал - предметы]![От] And Forms![Классный журнал - предметы]![До].
- Теперь, когда готовы запросы, которые из всех оценок фильтруют только нужную нам информацию, можно составить запросы на группировку, для того, чтобы вычислить средние оценки. Создайте в режиме конструктора запрос и в качестве источника введите запрос «Все оценки класса по предмету». Добавьте следующие поля - Фамилия, Имя, Оценка. Включите групповые операции. .
- В подле оценка вместо групповых операций Группировка выберите Выражение, а в верхней строке (Поле) введите выражение: Round(Avg([Все оценки класса по предмету]!Оценка)). Функция Avg вычисляет среднее арифметическое по полю Оценка запроса Все оценки класса по предмету, а функция Round округляет полученное значение до ближайшего целого числа. Добавьте сортировку по возрастанию по полю Фамилия. Закройте запрос и назовите его Средние оценки.
- Создайте точно такой же запрос, повторив действия пунктов 3-4, только в качестве источника выберите запрос Все оценки класса по предмету по датам. Это запрос должен делать то же самое - вычислять средние оценки, но уже только по интервалу дат, то есть на основании запроса Все оценки класса по предмету по датам. Сохраните запрос под именем Средние оценки по датам.