Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Überprüfung von vorhandenen Tabellen

Begonnen von sellrich, Dezember 13, 2018, 16:01:29

⏪ vorheriges - nächstes ⏩

sellrich

Hallo. Ich möchte beim Starten meiner DB prüfen, ob alle notwendigen Tabellen vorhanden sind.
Nach sehr langer Suche habe ich für mein Problem folgende Funktion entdeckt :

Function fctTableExists(strTableSearch, strTableDelete As String) As Boolean
On Error GoTo fctTableExists_Error

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Set db = CurrentDb

For Each tdf In db.TableDefs
If tdf.Name = strTableSearch Then fctTableExists = True: strTableDelete = strTableSearch: Exit For
Next
 
fctTableExists_Exit:
    Exit Function
   
fctTableExists_Error:
    DoCmd.SetWarnings True
    MsgBox Error$
    Resume fctTableExists_Exit
   
End Function


Diese Funktion rufe ich nun mit
If fctTableExists("PREISE01", strTableDelete) = False Then
        DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12, "PREISE01", "C:\EXPORT\PREISE\PREISE01.xlsx", True
Else
        If MsgBox("Es ist ein Fehler aufgetreten. Bitte überprüfen Sie, ob die Tabelle PREISE01.xlsx in C:\EXPORT vorhanden sind.", vbOKOnly, "Warnung") = vbOK Then
            DoCmd.Quit
        End If
End If

auf. Nun meine Frage. Gibt es eine Möglichkeit bei der Zeile :
If fctTableExists("PREISE01", strTableDelete) = False Then

Mehrere Tabellen abzufragen? Habe im Netz dazu leider nichts gefunden. Aktuell habe ich diesen Abruf 5x im Code stehen, da ich nach 5 Tabellen abfrage. Ist an sich nicht schlimm (funktioniert ja genau wie es soll). Mich interessiert nur, ob es geht.

markusxy

Grundsätzlich kannst du das auch über eine Abfrage auf die Tabelle MSysObjects machen.
Da steht alles zur Tabelle drin. Ist einfacher und viel effizienter.

Um die Tabelle zu sehen, kannst du sie über Navigationsoptionen - Systemobjekte anzeigen einblenden.

LG Markus

Lachtaube

#2
Es gibt schon seltsame Anforderungen. Tabellen verschwinden doch nicht einfach so in einer Datenbank. Oder sind da Schelme am Werk, die unbemerkt im Backend Tabellen löschen?

Ich habe auch schon viel Müll im Internet gefunden - mit dem Unterschied, dass ich ihn nicht verwende. Systemtabellen sind halt nicht dokumentiert und könnten sich ohne Ankündigung von Version zu Version ändern. Eine Abfrage via Recordset oder DLookup dürfte auch kaum schneller als eine kleine Funktion sein. Z.B.
Function TableExists(TblName As String, _                     Optional ByVal ForceDbInitialization As Boolean) As Boolean
   
   Static db As DAO.Database
   Dim tdf As DAO.TableDef
   
   On Error Resume Next
   If db Is Nothing Or ForceDbInitialization Then Set db = CurrentDb
   Set tdf = db.TableDefs("TechCrunchContinentalUS")
   TableExists = CBool(Err.Number = 0)
End Function


Soll so eine Funktion mehrmals hintereinander aufgerufen werden, müssen ja die Tabellennamen irgendwo hinterlegt sein und entscheiden, wie mit dem Ergebnis umgegangen wird. Eine Möglichkeit wäre:

Sub Foo()   Static vTables As Variant
   Dim v As Variant
   
   If Not IsArray(vTables) Then
      vTables = Array("tblA", "tblB", "tblC")
   End If
   
   For Each v In vTables
      If Not TableExists(v) Then MsgBox "Tabelle '" & v & "' existiert nicht."
   Next
End Sub
Grüße von der (⌒▽⌒)

markusxy

@Lachtaube,
ich vermute, dass der Zugriff über die Collection sogar schneller ist, als über das Recordset.

Und mit einer ziemlich hohen Wahrscheinlichkeit finden sich die Objekte in der MSysObjects in Zukunft und X statt unter Name.  :-\