VBA, MS Access MS Access в примерах

Очистка от временных запросов создаваемых Формами и Отчетами

    При открытии любой формы или отчета, если она сама или любой из ее обьектов использует в качестве источника данных строку SQL то для каждого такого обьекта в базе данных создается временный запрос с префиксом ~sq_  + имя обьекта, которые не удаляется ни после закрытия формы, ни после сжатия. Можно перед обжатием на несколько (сотен) кил, уменьшить размер файла (перед пересылкой по почте например) используя данную процедуру.

Private Sub esDelTempQueries()
'es 14.12.04
'Удаление временных запросов от форм/отчетов
Dim qdf As QueryDef
Dim i As Integer
Dim c As Integer
Dim x As Long
On Error Resume Next
    CurrentDb.QueryDefs.Refresh
    For Each qdf In CurrentDb.QueryDefs
        If Left(qdf.Name, 4) = "~sq_" Then
            'Debug.Print qdf.SQL
            c = Len(qdf.SQL)
            CurrentDb.QueryDefs.Delete qdf.Name
            If Err.Number > 0 Then
                'Debug.Print Err.Description
                Err.Clear
            Else
                i = i + 1
                x = x + c
                'Debug.Print "Запрос - " & qdf.Name & " - Удален!"
            End If
        End If
    Next qdf
    If i > 0 Then
        Debug.Print "---------------------------------"
        Debug.Print "Итого удалено запросов: " & i & " содержащих: " & x & " байт"
    Else
        Debug.Print "Временные запросы не обнаружены"
    End If
End Sub

Обратная процедура - забиваем базу мусором по полной (ради любопытства)


Private Sub esRestoreTempQueries()
'es 14.12.04
'Восстановление временных запросов от всех форм/отчетов
Dim dbs As Database, ctr As Container, doc As Document
On Error GoTo RestoreTempQueriesErr
    Set dbs = CurrentDb
'Цикл по всем формам
    Set ctr = dbs.Containers!Forms
    For Each doc In ctr.Documents
    'Открытие формы в режиме редакции и в скрытом режиме
        DoCmd.OpenForm doc.Name, acDesign, "", "", , acHidden
    'Закрытие формы
        DoCmd.Close acForm, doc.Name, acSaveYes
    Next doc

'Цикл по всем Отчетам аналогично
    Set ctr = dbs.Containers!Reports
    For Each doc In ctr.Documents
        DoCmd.OpenReport doc.Name, acDesign, "", "", , acHidden
        DoCmd.Close acReport, doc.Name, acSaveYes
    Next doc
    Exit Sub
RestoreTempQueriesErr:
    MsgBox Err.Description & vbCrLf & "При обработке формы - " & doc.Name
End Sub


Назад ToTop
L.E. 19.10.2017
Рейтинг@Mail.ru