In Access verknüpfte Tabellen lokal kopieren

20. September 2008 von Werner Mager · Gelesen: 3158 · heute: 1

Hä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:

Modul TableTools

Eine Antwort zu “In Access verknüpfte Tabellen lokal kopieren”

  1. Thomas van der Schalk sagt:

    Hallo Herr Mager,

    gibt es eine Version, bei der auch die gesetzten Schlüssel übernommen werden?

    MFG
    Thomas van der Schalk

Hinterlasse eine Antwort