Перекрестный запрос "Выработка сотрудников"
Иллюстрация 13.35. Перекрестный запрос "Выработка сотрудников"

CCur(CLng([Заказано].[Цена]* [Количество]*(1-[Скидка])*100)/100)
Создание такого отчета требует написания довольно большого числа процедур обработки событий.
В запросе в качестве критерия выборки заказов указан год — 1998. Нужно вывести приглашение пользователю, чтобы он, в свою очередь, мог ввести желаемый год. Это можно сделать при открытии отчета. Сначала нужно создать базовый набор записей для отчета и посчитать, сколько получилось столбцов в этом наборе. Следующая процедура обрабатывает событие Открытие (On Open) отчета:
Private Sub Report_0pen(Cancel As Integer) On Error Resume Next
' Создает базовый набор записей для отчета.
Dim intX As Integer Dim qdf As QueryDef Dim frm As Form Dim StrSql As String
' Связывает переменную с текущей базой данных.
Set dbsReport = CurrentDb
' Открывает запрос (объект QueryDef).
Set qdf = dbsReport.QueryDefs("Выработка сотрудников")
' Запрашивает год.
Год = InputBox("Отчет за год:", "Год", 1998)
StrSql =Left(qdf.SQL, InStr(qdf.SQL, "where") - 1) & " WHERE_ (((Year([ДатаИсполнения]))= " & Год & "))" & Right(qdf.SQL, Len(qdf.SQL) - InStr(qdf.SQL, "GROUP BY") + 1)
qdf.SQL = StrSql
' Открывает набор записей
Set rstReport = qdf.OpenRecordset()
' Определяет количество столбцов в перекрестном запросе. intColumnCount = rstReport.Fields.Count
End Sub
Здесь переменная intColumnCount должна быть определена на уровне модуля формы, т. к. она используется и другими процедурами данной формы.
Для событий Форматирование (On Format) верхнего колонтитула (листинг 13.1) и области данных отчета (листинг 13.2) необходимо определить процедуры, которые бы заполняли поля заголовков и значений и скрывали неиспользуемые поля.