Удаление вложенных SQL-запросов MS Access

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

Моя самая большая проблема заключается в том, что он вложил запросы на 5+ уровней вглубь, и мне невероятно сложно читать так, как есть. Запросы, которые он написал, обычно имеют этот формат, но намного сложнее.

SELECT thisCol, thatCol, theOtherCol
FROM CustomQuery1, CustomQuery2, CustomQuery3 

И CustomQuery{1,2,3} написаны точно так же, как и ссылки на несколько других подзапросов. Я не только нахожу это невероятно трудным для чтения, но я беспокоюсь, если я изменю один из запросов, который, возможно, вызывается где-то еще в другом запросе, о котором я не знаю, что нарушит другой отчет. Мне интересно, есть ли способ проанализировать все запросы, чтобы выяснить, какие из них вызываются какими другими запросами, и/или есть ли какой-то инструмент, который может автоматически их не вкладывать, или мне просто нужно проследить их все вручную.


person Shaun Poore    schedule 05.01.2015    source источник


Ответы (2)


Одна вещь, которая вам очень поможет, — это Зависимости объектов, которая встроена в Access. Обратите внимание, что вам нужно будет включить автозамену имени при проверке, даже если она у вас отключена в остальное время, как обычно лучше. Кроме того, он не будет отображать ссылки на код VBA для запросов, поэтому вам придется проверять их самостоятельно с помощью поиска.

person Nathan Tuggy    schedule 05.01.2015
comment
Это довольно близко к тому, на что я надеялся, я очень рад, что он встроен прямо в доступ. Спасибо! - person Shaun Poore; 06.01.2015

Да, есть способ определить, используется ли запрос другим запросом. Я создал форму, чтобы сделать именно это, чтобы я мог выбирать несколько объектов базы данных и удалять их одновременно, потому что я ненавидел то, что Access позволяет вам изначально удалять только 1 объект базы данных (например, форму, таблицу и т. д.) за раз, и я хотел убедиться, что объекты базы данных, которые я хотел удалить, не упоминались где-либо еще.

К сожалению, я не могу никуда загрузить форму с рабочего компьютера, они блокируют это. Однако я могу сказать вам, что вам нужно выполнить поиск в QueryDef.SQL каждого QueryDef в вашей базе данных.

Вам придется немного разобрать это, но это VBA, который я написал для этого.

Private Sub ListObjects_Click()
' Search all queries for SQL containing the specified string.
Screen.MousePointer = 11
On Error GoTo Err_SearchQueries

Dim db As DAO.Database
Dim qdf As QueryDef

Dim varTest As Variant
Dim lngSearchCount As Long
Dim lngFoundCount As Long
Set db = CurrentDb

lngFoundCount = 0
lngSearchCount = 0

Me.txtTblSearch = "*** Beginning search for " & Me.ListObjects.Column(0) & "..." & vbCrLf

'Get a count of the database objects that will be searched
For Each qdf In db.QueryDefs
    With qdf
        If Left(qdf.Name, 3) = "~sq" Then
          lngSearchCount = lngSearchCount + 1
        End If
    End With
Next qdf

For Each qd In db.QueryDefs
    If InStr(1, qd.SQL, Me.ListObjects.Column(0)) > 0 Then
      If Left(qd.Name, 4) = "~sq_" Then
        If Mid(qd.Name, 5, 1) = "f" Then
          Me.txtTblSearch = txtTblSearch & "found in Form " & Right(qd.Name, Len(qd.Name) - 5) & vbCrLf
          lngFoundCount = lngFoundCount + 1
        ElseIf Mid(qd.Name, 5, 1) = "r" Then
          Me.txtTblSearch = txtTblSearch & "found in Report " & Right(qd.Name, Len(qd.Name) - 5) & vbCrLf
          lngFoundCount = lngFoundCount + 1
        ElseIf Mid(qd.Name, 5, 1) = "d" Then
          Me.txtTblSearch = txtTblSearch & "found in Report " & Right(qd.Name, Len(qd.Name) - 5) & vbCrLf
          lngFoundCount = lngFoundCount + 1
        ElseIf Mid(qd.Name, 5, 1) = "c" Then
          Me.txtTblSearch = txtTblSearch & "found in a control in Form " & Right(qd.Name, Len(qd.Name) - 5) & vbCrLf
          lngFoundCount = lngFoundCount + 1
        End If
      Else
        Me.txtTblSearch = txtTblSearch & "found in Query " & qd.Name & vbCrLf
        lngFoundCount = lngFoundCount + 1
      End If
    End If
Next qd
Set qd = Nothing
Set db = Nothing



Exit_SearchQueries:
Set qdf = Nothing
Set db = Nothing
Me.txtTblSearch = Me.txtTblSearch & vbCrLf
Me.txtTblSearch = Me.txtTblSearch & "*** Searched " & lngSearchCount & _
" objects, found " & lngFoundCount & " occurrences."
Screen.MousePointer = 0
Exit Sub

'If an error is thrown, alert the user as to which object caused it
Err_SearchQueries:
MsgBox Err.Description, vbExclamation, "Error " & Err.Number
If IsNull(qd.Name) Then
Else
  MsgBox "Possible issue with query: " & qd.Name
End If
Screen.MousePointer = 0
Resume Exit_SearchQueries


End Sub

Вот фото формы в действии, чтобы дать вам представление:

введите здесь описание изображения

person Johnny Bones    schedule 05.01.2015