Создание перекрестного отчета с изменяющимся числом столбцов
Листинг 13.3. Процедура обработки события Печать области данных
Private
Sub
Detaill_Print(Cancel
As
Integer
, PrintCount
As
Integer
)
Dim
intX
As
Integer
Dim
IngRowTotal
As
Long
'Вычисляет сумму по строке и добавляет ее к итоговому значению по столбцу и общему итогу
If
Me
.PrintCount = 1
Then
IngRowTotal = 0
For
intX = 1
To
intColumnCount - 1
'Начиная со столбца 1 (первый столбец с перекрестными значениями), вычисляет сумму по строке.
lngRowTotal = IngRowTotal +
Me
(
"Col"
+ Format(intX))
'Добавляет итоговое значение для текущего столбца.
IngRgColurenTotal(intX) = IngRgColumnTotal(intX) +
Me
(
"Col"
+ Format(intX))
Next
intX
'Заносит сумму по строке в поле в области данных.
Me
(
"Col"
+ Format(intColumnCount)) = IngRowTotal
'Прибавляет сумму по строке к общему итогу.
IngReportTotal = IngReportTotal + IngRowTotal
End
If
End
Sub
Процедура обработки события Печать (On Print) примечания отчета должна заполнить поля примечания итоговыми значениями по столбцам из массива IngRgColumnTotal (листинг 13.4).
Листинг 13.4. Процедура обработки события Печать примечания
Private
Sub
ReportFooter4_Print(Cancel
As
Integer
, PrintCount
As
Integer
)
Dim
intX
As
Integer
'Помещает суммы по столбцам в поля примечания.
For
intX = 1 То intColumnCount - 1
Me
(
"Tot"
+ Format(intX)) = IngRgColumnTotal(intX)
Next
intX
'Помещает общий итог в поле примечания.
Me
(
"Tot"
+ Format(intColumnCount)) = IngReportTotal
'Скрывает неиспользуемые поля в примечании отчета.
For
intX = intColumnCount + 1
To
conTotalColumns - 1
Me
(
"Tot"
+ Format(intX)).Visible =
False
Next
intX
End
Sub
Для корректной работы нужно еще добавить две небольшие процедуры в свойства отчета:
- при закрытии отчета нужно закрыть базовый набор записей – обработка события Закрытие (On Close);
- при отсутствии данных в базовом наборе записей нужно закрыть этот набор и прервать формирование отчета – событие Отсутствие данных (On No Data).
Ниже приведены обе эти процедуры (листинги 13.5 и 13.6).
Листинг 13.5. Процедура обработки события Закрытие отчета
Private
Sub
Report_Close()
On
Error
Resume
Next
rstReport.Close
End
Sub
Листинг 13.6. Процедура обработки события Отсутствие данных отчета
Private
Sub
Report_NoData(Cancel
As
Integer
)
MsgBox
"Не найдены записи, удовлетворяющие указанным условиям."
, vbExclamation,
"Записи не найдены"
rstReport.Close Cancel =
True
End
Sub