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