Создание перекрестного отчета с изменяющимся числом столбцов
Для событий Форматирование (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 =
False
Next
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
Then
For
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
Next
End
If
End
If
End
Sub
Свойство FormatCount отчета содержит значение, равное количеству столбцов для форматирования, поэтому в процедуре проверяется это свойство, и присвоение значений полям в области данных выполняется, только если это значение не 0. В процедуре используется также функция xtabCnulls, преобразующая пустое значение в 0.
Для события Печать (On Print) области данных отчета нужно создать процедуру, которая бы суммировала значения по строке отчета, выводила полученное значение в последнем столбце и, кроме того, добавляла эту сумму в массив итоговых значений по столбцам (листинг 13.3). Массив итоговых значений по столбцам IngRgColumnTotal и переменная IngReportTotal, определяющая общий итог, должны быть описаны на уровне модуля. Кроме того, они должны быть инициализированы, т. е. им нужно присвоить начальные значения 0. Это можно сделать в процедуре обработки события Загрузка (On Load) отчета.