1

我得到了一个小型的 Access 数据库来处理。创建它的人编写了许多自定义查询来生成报告。我的任务是修改报告,最初编写查询的人走了,没有留下任何文档。

我最大的问题是他将查询嵌套了 5 层以上,我很难按原样阅读。他编写的查询通常具有这种格式,但要复杂得多。

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

CustomQuery{1,2,3} 的编写方式与它们引用多个其他子查询的方式完全相同。我不仅发现这非常难以阅读,而且我担心如果我修改其中一个查询,它可能在另一个我不知道的查询中的其他地方调用它会破坏另一个报告。我想知道是否有一种方法可以分析所有查询以找出哪些查询被其他查询调用和/或是否有一些工具可以自动取消嵌套它们,或者我是否只需要跟踪它们手动。

4

2 回答 2

3

对您有很大帮助的一件事是“对象依赖项”窗格,它内置于 Access 中。请注意,您需要在检查时打开名称自动更正,即使您在其余时间关闭它,通常是最好的。此外,它不会显示对查询的 VBA 代码引用,因此您必须自己通过搜索来检查。

于 2015-01-05T20:19:58.883 回答
0

是的,有一种方法可以确定一个查询是否被另一个查询使用。我创建了一个表单来执行此操作,以便我可以选择多个数据库对象并同时删除它们,因为我讨厌 Access 如何只允许您一次本地删除 1 个数据库对象(即表单、表等),而我想确保我想删除的数据库对象没有在其他地方引用。

不幸的是,我无法从我的工作计算机上传表格,他们阻止了这些东西。但是,我可以告诉您,您需要做的是搜索数据库中每个 QueryDef 的 QueryDef.SQL。

您将不得不将其分开一点,但这是我为此编写的 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

这是一张正在运行的表格的图片,给你一个想法:

在此处输入图像描述

于 2015-01-05T21:16:30.163 回答