Code Snippet "VBA Access"
Hilfsfunktionen und Hilfsroutinen, um Abhängigkeiten von Access-Abfragen aufzudröseln
Besser als die Anzeige von Abhängigkeiten in Access 2003, weil diese bei SELECTs in WHERE-Clauses versagt
Option Compare Database
Option Explicit
'Achtung: Diese Prozeduren benötigen einen Verweis auf Microsoft DAO!
'------------------------------------------------------------
'Prozedur zum Testen von Abhängigkeiten in einer DB
Sub procTestDBObjects()
Dim objDBObjekt As AccessObject
Dim strResult As String
Dim objDictionaryFrm
Dim objDictionaryRpt
Set objDictionaryFrm = funFormsDatasources()
Set objDictionaryRpt = funReportsDatasources()
'Durch jede Tabelle loopen
strResult = "Tabellen" & vbCrLf & "--------------------------" & vbCrLf & vbCrLf
For Each objDBObjekt In Application.CurrentData.AllTables
Debug.Print objDBObjekt.Name
'Kommt diese Tabelle in Abfrage vor
strResult = strResult & vbCrLf & funInQueriesVorhanden(objDBObjekt.Name)
strResult = strResult & funInDictionaryItemVorhanden(objDBObjekt.Name, objDictionaryFrm)
strResult = strResult & funInDictionaryItemVorhanden(objDBObjekt.Name, objDictionaryRpt)
strResult = strResult & vbCrLf
Next
'Durch jede Abfrage loopen
strResult = strResult & vbCrLf & vbCrLf & vbCrLf & "Abfragen" & vbCrLf & "--------------------------" & vbCrLf & vbCrLf
For Each objDBObjekt In Application.CurrentData.AllQueries
Debug.Print objDBObjekt.Name
'Kommt diese Abfrage in Abfrage vor
strResult = strResult & vbCrLf & funInQueriesVorhanden(objDBObjekt.Name)
strResult = strResult & funInDictionaryItemVorhanden(objDBObjekt.Name, objDictionaryFrm)
strResult = strResult & funInDictionaryItemVorhanden(objDBObjekt.Name, objDictionaryRpt)
strResult = strResult & vbCrLf
Next
'Debug.Print strResult
Call procWriteTextfile(Application.CurrentProject.Path & "\" & _
Left(Application.CurrentProject.Name, Len(Application.CurrentProject.Name) - 4) & "_DBBeziehungen.txt", strResult)
End Sub
'------------------------------------------------------------
'Prozedur schreibt alle Queries in ein Textfile (Achtung: Unicode!)
Sub procTestSQL()
Dim db As DAO.Database
Dim objDBObjekt
Dim objDictionary
Dim strResult As String
Dim strFeldtrennzeichen
Dim strSatztrennzeichen
Dim wrkJet As Workspace
strFeldtrennzeichen = vbCrLf
strSatztrennzeichen = vbCrLf & vbCrLf
'Set db = CurrentDb
Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
Set db = wrkJet.OpenDatabase("F:\_temp\Nordwind.mdb", True)
Set objDictionary = funQueriesSQL(db)
strResult = funDictionaryItemsToString(objDictionary, strFeldtrennzeichen, strSatztrennzeichen)
Call procWriteTextfile(Left(db.Name, Len(db.Name) - 4) & "_SQL.txt", strResult)
strResult = ""
For Each objDBObjekt In db.TableDefs
strResult = strResult & vbCrLf & objDBObjekt.Name & funInDictionaryItemVorhanden(objDBObjekt.Name, objDictionary) & vbCrLf
Next
Debug.Print strResult
End Sub
'------------------------------------------------------------
'Schreibt Textdatei
Sub procWriteTextfile(ByVal strFilenameAndPath As String, ByVal strContent As String)
Dim objtextfile
Dim objfs
'FileSystemObject erzeugen
Set objfs = CreateObject("Scripting.FileSystemObject")
'Textdatei-Objekt erzeugen mit Überschreiben und mit Unicode
Set objtextfile = _
objfs.CreateTextFile(strFilenameAndPath, True, True)
objtextfile.write (strContent)
objtextfile.Close
End Sub
'------------------------------------------------------------
'Testet, ob ein gesuchter String in einem Item des Dictionaries vorkommt
Function funInDictionaryItemVorhanden(ByVal strObjName As String, ByVal objDictionary) As String
Dim objItem
Dim strResult As String
For Each objItem In objDictionary.Keys
'Debug.Print objItem & vbCrLf & objDictionary.Item(objItem) & vbCrLf
If InStr(objDictionary.Item(objItem), strObjName) > 0 Then
strResult = strResult & vbCrLf & " " & objItem
End If
Next
If strResult = "" Then
strResult = vbCrLf & " -"
End If
funInDictionaryItemVorhanden = strResult
End Function
'------------------------------------------------------------
'Erzeugt aus einem Dictionary einen String mit Key und Item
Function funDictionaryItemsToString(ByVal objDictionary, ByVal strFeldtrennzeichen, ByVal strSatztrennzeichen) As String
Dim objItem
Dim strResult As String
For Each objItem In objDictionary.Keys
strResult = strResult & objItem & strFeldtrennzeichen & objDictionary.Item(objItem) & strSatztrennzeichen
Next
funDictionaryItemsToString = strResult
End Function
'------------------------------------------------------------
'Holt die Datasources der Formulare und füllt sie in Dictionary ab
'Hilfsprozedur, damit die Formulare nur einmal geöffnet werden müssen
Function funFormsDatasources()
Dim objDictionary
Dim objForm As AccessObject
Set objDictionary = CreateObject("Scripting.Dictionary")
For Each objForm In Application.CurrentProject.AllForms
'Debug.Print objForm.Name
DoCmd.OpenForm objForm.Name, acDesign, , , acFormPropertySettings
'Debug.Print " " & Forms(objForm.Name).RecordSource
objDictionary.Add objForm.Name, Forms(objForm.Name).RecordSource
DoCmd.Close acForm, objForm.Name
Next
Set funFormsDatasources = objDictionary
End Function
'------------------------------------------------------------
'Holt die Datasources der Reports und füllt sie in Dictionary ab
'Hilfsprozedur, damit die Reports nur einmal geöffnet werden müssen
Function funReportsDatasources()
Dim objDictionary
Dim objDBObjekt As AccessObject
Set objDictionary = CreateObject("Scripting.Dictionary")
For Each objDBObjekt In Application.CurrentProject.AllReports
'Debug.Print objDBObjekt.Name
DoCmd.OpenReport objDBObjekt.Name, acDesign
'Debug.Print " " & Reports(objDBObjekt.Name).RecordSource
objDictionary.Add objDBObjekt.Name, Reports(objDBObjekt.Name).RecordSource
DoCmd.Close acReport, objDBObjekt.Name
Next
Set funReportsDatasources = objDictionary
End Function
'------------------------------------------------------------
'Holt SQL-Statements einer DB und füllt sie in Dictionary ab
'Hilfsprozedur, damit die Formulare nur einmal geöffnet werden müssen
Function funQueriesSQL(ByVal db As DAO.Database)
Dim objDictionary
Dim qdf As DAO.QueryDef
Set objDictionary = CreateObject("Scripting.Dictionary")
For Each qdf In db.QueryDefs
objDictionary.Add qdf.Name, qdf.SQL
Next qdf
Set funQueriesSQL = objDictionary
End Function
'------------------------------------------------------------
'Kommt ein bestimmtes DB-Objekt, d.h. Tabelle oder Abfrage, in einer Abfrage vor
Function funInQueriesVorhanden(ByVal strObjName As String) As String
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strResult As String
Set db = CurrentDb
For Each qdf In db.QueryDefs
If InStr(qdf.SQL, strObjName) > 0 Then
strResult = strResult & vbCrLf & " " & qdf.Name
End If
Next qdf
Set db = Nothing
If strResult = "" Then
strResult = vbCrLf & " -"
End If
funInQueriesVorhanden = strObjName & ": " & strResult
End Function
'------------------------------------------------------------
'Zeigt SQL einer beliebigen Abfrage an, ohne dass sie geöffnet werden muss
Function showSQLOfQuery(ByVal strObjName As String) As String
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strResult As String
Set db = CurrentDb
strResult = strObjName & vbCrLf & db.QueryDefs(strObjName).SQL
showSQLOfQuery = strResult
End Function