Иллюстрированный самоучитель по Microsoft Access 2002

Создание перекрестного отчета с изменяющимся числом столбцов

Листинг 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.