1

作業用の小さな Access データベースが与えられました。それを作成した人は、レポートを生成するために多くのカスタム クエリを作成しました。私はレポートを修正する任務を負っていますが、最初にクエリを書いた人はいなくなり、ドキュメントを残しませんでした。

私の最大の問題は、彼が 5 レベル以上の深さでクエリをネストしていたことであり、そのままでは読むのが非常に困難です。彼が作成したクエリは通常この形式ですが、より複雑です。

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

また、CustomQuery{1,2,3} はそれぞれ、他の複数のサブクエリを参照するまったく同じ方法で記述されています。これは信じられないほど読みにくいだけでなく、クエリの 1 つを変更すると、別のクエリの別の場所で呼び出されていることに気付いていないため、別のレポートが壊れてしまうのではないかと心配しています。すべてのクエリを分析して、どのクエリが他のどのクエリによって呼び出されているかを把握する方法があるかどうか、および/またはそれらを自動的にネスト解除できるツールがあるかどうか、またはそれらすべてをトレースする必要があるかどうか疑問に思っています手動で。

4

2 に答える 2

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 に答える