[Access 2003 SP3] DAO.Database.TableDefs

15/09/2009 - 22:08 von Lars P. Wolschner | Report spam
Hallo,

kann es sein, daß der Container der TableDefs Elemente im Verlaufe
einer Access-Anwendung verliert?

Ich binde eine Reihe von Tabellen aus einer anderen Access-
Datenbank ein und möchte sie zum Schluß auch wieder entfernen:

8<
Public Function lDetachTables( _
ByVal db As DAO.Database) As Long

lDetachTables = Data.lNoCount

If (db Is Nothing) Then Exit Function

Dim lCount As Long, tbldef As DAO.TableDef
lCount = Data.lNoCount
For Each tbldef In db.TableDefs
If CBool(tbldef.Attributes And dbAttachedTable) Then
db.TableDefs.Delete tbldef.Name
lCount = lCount + 1
End If
Next tbldef

lDetachTables = lCount

End Function

8



Der Paramater db ist dabei immer die Datenbank mit dem VBA-Code
selbst, ich habe ihn hier nur der Klarheit halber hinzugefügt. In
der realen Implementation gibt es ihn nicht, sondern es wird auf
eine globale DAO.Database-Variable zugegriffen, die einmal mit
Application.CurrentDb initialisiert wird.

Wenn man sich die Namen der so durchmusterten DAO.TableDef-Elemente
ausgeben làßt, bemerkt man das Fehlen einiger Tabellen, die dann
auch im Datenbankfenster sichtbar zurückbleiben. Nutze ich eine
entsprechende Methode meines "data dictionary", das die wichtigsten
DAO.Objekte in einer eigenen Struktur vorhàlt und dabei auch ein
Verknüpfungsattribut mitführt, wird alles zuverlàssig gelöscht.

Es scheint auch zu funktionieren, die verknüpften Tabellen zuerst
in einer VBA.Collection zu versammeln, und deren Elemente dann in
einem zweiten Arbeitsschritt zu löschen:

8<
Public Function colTblAttached( _
ByVal db As DAO.Database) As VBA.Collection

If (db Is Nothing) Then Exit Function

Dim tbldef As DAO.TableDef
Set colTblAttached = New VBA.Collection
For Each tbldef In db.TableDefs
If CBool(tbldef.Attributes And dbAttachedTable) Then _
colTblAttached.Add tbldef, tbldef.Name
Next tbldef

End Function

Public Function lDetachTables( _
ByVal db As DAO.Database) As Long

lDetachTables = Data.lNoCount

Dim colTbl As VBA.Collection
Set colTbl = colTblAttached(db)
If (colTbl Is Nothing) Then Exit Function

Dim lCount As Long, tbldef As DAO.TableDef
lCount = Data.lNoCount
For Each tbldef In colTbl
tbldefDelete tbldef
lCount = lCount + 1
Next tbldef

lDetachTables = lCount

End Function

8



Mit freundlichen Grüßen
Lars P. Wolschner
 

Lesen sie die antworten

#1 Josef Poetzl
15/09/2009 - 22:38 | Warnen spam
Hallo!

Lars P. Wolschner schrieb:
kann es sein, daß der Container der TableDefs Elemente im Verlaufe
einer Access-Anwendung verliert?



Sie gehen nicht verloren sondern werden übersprungen, sobald du die
Auflistung mit for-each durchlàufst und innerhalb dieser Schleife eine
Tabelle löscht.

Abhilfe bringt eine For-Next-Schleife, die rückwàrts durchlaufen wird.

Prinzip:
For cnt = db.TableDefs.Count - 1 To 0 Step -1
Set tbldef = db.TableDefs(cnt)
If CBool(tbldef.Attributes And dbAttachedTable) Then
db.TableDefs.Delete tbldef.Name
End If
Next


mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen