1

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

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

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

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

ответ

3

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

+0

Это довольно близко к тому, что я надеялся, что существовал я очень рад, что он построен прямо в доступе , Благодаря! –

0

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

К сожалению, я не могу загрузить форму нигде с моего рабочего компьютера, они блокируют это. Однако я могу сказать вам, что вам нужно выполнить поиск по 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 

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

enter image description here