In Access verknüpfte Tabellen lokal kopieren
20. September 2008 von Werner Mager · Gelesen: 2830 · heute: 3Häufig wird Access auf Grund der komfortablen Oberfläche als Frontend für Server basierte Datenbanken (z.B. MS SLQL, MySQl oder Oracle) genommen. Die Tabellen sind dabei nicht direkt in Access gespeichert sondern lediglich verknüpft. Der einzige Nachteil dabei ist, dass man mit dem Frontend die Daten nun nicht so einfach mitnehmen kann. In diesem Artikel wird eine VBA Funktion vorgestellt, die es mit einem einzigen Befehl ermöglicht, die verknüpften Tabellen in lokale Tabellen zu verwandeln.
Lokale Tabellen finden
Sämtliche Tabellen sind in Access über das Objekt TabelDefs zugreifbar. Über eine einfache Foreach-Schleife können diese durchlaufen werden:
Dim td As TableDef For Each td In CurrentDb.TableDefs ... Next
Handelt es sich bei der Tabelle um eine verknüpfte Tabelle, so ist die String-Eigenschaft Connect der zugehörigen Tabellendefinition gesetzt. Folglich können verknüpfte Tabellen daran erkannt werden, dass Connect nicht leer ist. Beim Durchlaufen fällt zudem auf, dass es Tabellen gibt, die ~ im Namen beinhalten. Diese sind Access-Interne Tabellen und werden von uns einfach ignoriert. Durch die folgende Schleife sammeln wir alle verlinkten Tabellen in einer Collection:
Dim locals As New Collection ' Verlinkte Tabellen suchen Dim td As TableDef For Each td In CurrentDb.TableDefs If Not td.Connect = "" Then If InStr(td.Name, "~") = 0 Then locals.Add td.Name End If End If Next
Eine verknüpfte Tabelle in eine lokale Tabelle umwandeln
Um die verknüpfte Tabelle TabelleA samt Daten in eine lokale Tabelle TabelleB zu kopieren, verwenden wir den folgenden SQL-Befehl:
SELECT [TabelleA].* INTO [TabelleB] FROM [TabelleA];
Da wir die verknüpfte Tabelle ja durch die Lokale ersetzen wollen, müssen wir die verknüpfte Tabelle zuerst mit einem neuen Namen kopieren, dann die verknüpfte Tabelle löschen und schließlich der neuen Tabelle wieder den ursprünglichen Namen geben. Dies geschieht mit den folgenden 3 Zeilen:
DoCmd.RunSQL ("SELECT [" & Table & "].* INTO [local_" & Table & "] FROM [" & Table & "];") DoCmd.DeleteObject acTable, Table DoCmd.Rename Table, acTable, "local_" & Table
Die Funktion makeTablesLocal
Die beschriebenen Schritte werden nun in einer Funktion zusammengefaßt, die z.B. über die Direkteingabe aufgerufen werden kann:
Function makeTablesLocal() DoCmd.SetWarnings False Dim locals As New Collection ' Verlinkte Tabellen suchen Dim td As TableDef For Each td In CurrentDb.TableDefs If Not td.Connect = "" Then If InStr(td.Name, "~") = 0 Then locals.Add td.Name End If End If Next ' Tabellen umwandeln For Each Table In locals Debug.Print "Kopiere " & Table & "..." DoCmd.RunSQL ("SELECT [" & Table & "].* INTO [local_" & Table & "] FROM [" & Table & "];") DoCmd.DeleteObject acTable, Table DoCmd.Rename Table, acTable, "local_" & Table Next End Function
Und wie immer gibt es hier noch den gesamten Code zum Download: