Создание перекрестного отчета с изменяющимся числом столбцов
Рассмотрим возможности обработки событий в отчете на примере отчета "Выработка сотрудников". Этот отчет строится на базе перекрестного запроса и показывает выработку сотрудников отдела продаж за год по месяцам. Максимальное число столбцов в отчете – 14. Первый столбец содержит фамилии сотрудников, следующие двенадцать столбцов – выработку для каждого месяца и последний столбец – итоговый. (Как выглядит этот отчет, мы показывали в разд. "Перекрестные отчеты" гл. 10.)
В качестве источника данных для такого запроса используется перекрестный запрос "Выработка сотрудников", представленный на рис. 13.35.
Рис. 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 должна быть определена на уровне модуля формы, т. к. она используется и другими процедурами данной формы.