Создание перекрестного отчета с изменяющимся числом столбцов
Для событий Форматирование (On Format) верхнего колонтитула (листинг 13.1) и области данных отчета (листинг 13.2) необходимо определить процедуры, которые бы заполняли поля заголовков и значений и скрывали неиспользуемые поля.
Листинг 13.1. Процедура обработки события Форматирование верхнего колонтитула
Private Sub PageHeader() Format(Cancel As Integer, FormatCount As Integer) Dim intx As Integer'Помещает заголовки столбцов в поля в верхнем колонтитуле. Me("Head" + Format(0)) = rstReport(0).Name For intX = 1 To intColumnCount - 1 Me("Head" + Format(intX)) =MonthRus(CInt(rstReport(intX).Name)) Next intX 'Вводит в ближайшее свободное поле заголовок "Итого". Me("Head" + Format(intColumnCount)) = "Итого"'Скрывает пустые поля в верхнем колонтитуле. For intX = (intColumnCount +1) To conTotalColumns - 1 Me("Head" + Format(intX)).Visible = FalseNext intX End SubВ этой процедуре используется функция MonthRus, которая по порядковому номеру месяца выдает его название. Мы здесь не приводим текста этой функции, надеясь, что вы сможете написать ее сами conTotalColumns – константа, которая описана на уровне модуля и значение которой определяет максимальное число столбцов в отчете. В данном примере conTotalColumns равна 14.
Листинг 13.2. Процедура обработки события Форматирование области данных 1
Private Sub Detaill_Format(Cancel As Integer, FormatCount As Integer) 'Вводит значения в поля и скрывает пустые поля. Dim intX As Integer'Проверяет, что не достигнут конец набора записей. If Not rstReport.EOF Then 'Помещает значения из набора записей в поля области данных If Me.FormatCount = 1 ThenFor intX = 0 To intColumnCount - 1 'Преобразует пустые значения в 0. Me("Col" + Format(intX)) = xtabCnulls(rstReport(intX)) Next intX 'Скрывает неиспользуемые поля в области данных. For intX = intColumnCount + 1 To conTotalColumns - 1 Me("Col" + Format(intX)).Visible = False Next intX 'Переходит к следующей записи в наборе.rstReport.Move NextEnd IfEnd IfEnd SubСвойство FormatCount отчета содержит значение, равное количеству столбцов для форматирования, поэтому в процедуре проверяется это свойство, и присвоение значений полям в области данных выполняется, только если это значение не 0. В процедуре используется также функция xtabCnulls, преобразующая пустое значение в 0.
Для события Печать (On Print) области данных отчета нужно создать процедуру, которая бы суммировала значения по строке отчета, выводила полученное значение в последнем столбце и, кроме того, добавляла эту сумму в массив итоговых значений по столбцам (листинг 13.3). Массив итоговых значений по столбцам IngRgColumnTotal и переменная IngReportTotal, определяющая общий итог, должны быть описаны на уровне модуля. Кроме того, они должны быть инициализированы, т. е. им нужно присвоить начальные значения 0. Это можно сделать в процедуре обработки события Загрузка (On Load) отчета.
