Access 2007, как использовать VBA для циклического выполнения запросов и циклических отчетов о печати

У меня есть существующий модуль, который печатает серию отчетов на основе запроса (отчет класса CAP gr 5), проходя через другую таблицу (School_room_grade). Отчеты были распечатаны на основе условия WhereCondition в модуле, совпадающего со строками в таблице School_room_grade. Этот процесс используется для того, чтобы у каждой комбинации school_room_grade были свои отчеты вместе, и повторение отчетов не требуется.

Один из отчетов (CAP Math Gr 5) был изменен и теперь включает 7 связанных подотчетов, что замедляет процесс. Каждый из подотчетов основан на одном и том же запросе, но отсортирован по разным полям. Я подумал, что было бы лучше разорвать связь между подотчетами и ограничить запрос только одной комбинацией «школа_комната_класс» за раз. Когда я впервые сделал отчет, не связывая вложенные отчеты, казалось, что он работает быстрее. Но, конечно, когда он не связан, сортировка отчетов не работает.

Я думал, что мне следует сделать вложенный цикл с запросом снаружи, а затем выполнить цикл печати отчетов. Как вы думаете, это улучшит скорость?

Вот исходный код печати отчета, который работал до добавления в связанный отчет.

Option Compare Database

'------------------------------------------------------------
' Print Grade 5 & 6 CAP homeroom reports
'
'------------------------------------------------------------
Sub PrintReports()

    Dim rs As DAO.Recordset
    Dim rptArr As Variant
    Dim rpt As Long

    rptArr = Array("CAP MATH GR 5", "CAP ELA GR 5")

    Set rs = CurrentDb.OpenRecordset("school_room_query_table_5")

    With rs
        .MoveFirst
        Do While Not .EOF
            For rpt = LBound(rptArr) To UBound(rptArr)
                DoCmd.OpenReport ReportName:=rptArr(rpt), View:=acViewNormal, _
                    WhereCondition:="[school_room_grade] = '" & rs!school_room_grade & "'"
            Next
            .MoveNext
        Loop
        .Close
    End With

    MsgBox "Done"

End Sub

Запрос, на котором основаны все отчеты: [cap class report gr 5] — поле критериев — [school_room_grade]. Таблица, используемая для цикла, — [school_room_query_table_5], а соответствующее поле — [school_room_grade].

Я никогда не выполнял цикл по именованному запросу - можно ли это сделать?


person Brent    schedule 21.10.2010    source источник
comment
Я решил разделить запрос на два и запустить отчеты из этих отдельных запросов меньшего размера. Это улучшило производительность. Мне все еще интересно узнать, можно ли перебрать именованный запрос и просто сослаться на имя запроса, или вам нужно скопировать весь синтаксис в VBA и поместить поле критериев в оператор where этого синтаксиса.   -  person Brent    schedule 22.10.2010


Ответы (1)


Dim db as Database
Dim rs as RecordSet

Set db = DAO.OpenDatabase("Database path")
Set rs = db.OpenRecordSet("Query name")

For i = 0 To rs.QueryDefs.Count - 1

     rs.QueryDefs.Name

next i

Что-то вроде этого должно работать, чтобы перебирать имена всех имен определений запросов.

person Roi-Kyi Bryant    schedule 26.08.2011