Datenbank Tabelle nicht löschbar?!

  • VB6

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von blubaba.

    Datenbank Tabelle nicht löschbar?!

    Dim db As Database
    Dim td As TableDef
    RootDB = App.Path & "\Data\Qoutes.mdb"
    Set db = OpenDatabase(RootDB)


    For Each td In db.TableDefs
    If Left(td.Name, 4) = "Tick" Then
    db.TableDefs.Delete td.Name
    End If
    Next td
    ---------------------------
    Mit diesem kurzen Code wollte ich alle Tabellen in der Datenbank löschen, die mit "Tick" anfangen.

    Merkwürdigerweise, werden nicht alle Tabellen gelöscht. Es bleiben viele übrig.Einige weren also nicht gelöscht!! Wo liegt der Fehler?
    Hallo blubaba,

    werden nicht alle Tabellen gelöscht

    Bitte nenne uns die Namen der Tabellen, die nicht gelöscht werden. Wenn du keine Fehlermeldung beim Quelltext bekommst, wird der Versuch, die (übrig gebliebenen) Tabellen zu löschen gar nicht unternommen. Evtl kann es auch Leerzeichen am Anfang des Namens sein. Trim wird da helfen, die Groß-/Kleinschreibunf hat Marcus ja schon abgedeckt.

    Gruß Markus
    Hab den Fehler gefunden. Wenn man in einer For - Each Schleife eine Tabelle löscht läuft die Schleife nicht bis zum Ende!!

    So geht es richtig:

    RootDB = App.Path & "\Data\Qoutes.mdb"
    Set db = OpenDatabase(RootDB)

    'Emittelt alle relevante Tabaellennamen und speichert sie in einer 'Stringkette, 'getrennt durch den "Delimiter' "@".

    For Each td In db.TableDefs
    If Left(td.Name, 4) = "Tick" Then
    Kette = Kette + td.Name & "@"
    End If
    Next td

    'Nun kann Kette so aussehen:"Tick_AA@Tick_ABI@Tick_BBC"
    'Jetzt eine Array erstellen mit Hilfe der Splitfunktion

    TabName = Split(Left(Kette, Len(Kette) - 1), "@", , vbTextCompare)

    'Jetzt ensteht:TabName(0)="Tick_AA",TickName(1)="Tick_ABI" usw

    For a = 0 To UBound(TabName)
    db.TableDefs.Delete TabName(a)
    Next a

    Jetzt sind wirklich alle relevante Tabellen gelöscht!!

    Danke für den Applaus ;)
    es sind ungefähr 1800 tabellen, die mit "Tick_" anfangen.

    das problem tritt auf, wenn man in einer schleife als zähler eine objekteigenschaft wählt, wie zb "count". wenn man nämlich meinen ursprüngliche code nimmt, dann wurden beim ersten ablauf nur 900 tabellen von 1800 gelöscht. beim nächsten ablauf wurden 450 tabellen gelöscht usw. das liegt daran, das sich der wert "count" ändert,er geht um 1 runter! jeder 2 eintrag wird somit "üpersprungen". man darf also bei schleifen keine läufer nehmen, die sich innerhalb der schleife ändern

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „blubaba“ ()

    Hallo blubaba,

    genau das meine ich doch, du hast deinen Quelltext darauf aufgebaut:

    Quellcode

    1. For Each td In db.TableDefs

    Aus diesem Grund verstehe ich nicht, warum es Probleme gegeben hat. Du arbeitest ja nicht mit Count .


    Gruß Markus
    Original von alchimist
    Hallo blubaba,

    genau das meine ich doch, du hast deinen Quelltext darauf aufgebaut:

    Quellcode

    1. For Each td In db.TableDefs

    Aus diesem Grund verstehe ich nicht, warum es Probleme gegeben hat. Du arbeitest ja nicht mit Count .


    Gruß Markus

    explizit nicht. wenn du aber die count eigenschaft im überwachungsfenster anschaust, dann verringert sie sich immer um 1, wenn man eine tabelle löscht! eine for - each schleife greift intern auf die count eigenschaft zu. deswegen ja auch das gleiche fehlerbild!
    Hallo blubaba,

    zumindest unter Access97 kann deine Aussage nicht stimmen! Wenn ich die folgenden Quelltext ausprobiere (Tabellennamen: aa, ab, ba, bb, ca, cb):

    Brainfuck-Quellcode

    1. Option Compare Database
    2. Option Explicit
    3. Sub listTables()
    4. Dim i As Long
    5. Debug.Print "--- Liste aller Tabellen ---"
    6. For i = 0 To CurrentDb.TableDefs.Count - 1
    7. Debug.Print CurrentDb.TableDefs(i).Name
    8. Next i
    9. Debug.Print "----------------------------"
    10. End Sub
    11. Sub DeleteCount()
    12. 'hier entsteht ein Fehler
    13. Dim i As Long
    14. Debug.Print "--- Löschung von Tabellen mit COUNT---"
    15. For i = 0 To CurrentDb.TableDefs.Count - 1
    16. If Mid(CurrentDb.TableDefs(i).Name, 2, 1) = "a" Then
    17. Debug.Print CurrentDb.TableDefs(i).Name & vbTab & " --- GELÖSCHT ---"
    18. CurrentDb.TableDefs.Delete CurrentDb.TableDefs(i).Name
    19. Else
    20. Debug.Print CurrentDb.TableDefs(i).Name
    21. End If
    22. Next i
    23. Debug.Print "---------------------------------------"
    24. End Sub
    25. Sub DeleteEach()
    26. Dim oTb As TableDef
    27. Debug.Print "--- Löschung von Tabellen mit COUNT---"
    28. For Each oTb In CurrentDb.TableDefs
    29. If Mid(oTb.Name, 2, 1) = "a" Then
    30. Debug.Print oTb.Name & vbTab & " --- GELÖSCHT ---"
    31. CurrentDb.TableDefs.Delete oTb.Name
    32. Else
    33. Debug.Print oTb.Name
    34. End If
    35. Next oTb
    36. Debug.Print "---------------------------------------"
    37. End Sub


    führen sie nur in einem Fall zu einer Fehlermeldung.

    Gruß Markus
    hallo markus,

    hab es jetzt nicht ausprobiert(ist sehr spät, will ins bett), aber versuch mal folgendes:

    lösche alle tabellen mit der prozedure "DeleteEach".
    überwache die eigenschaft "CurrentDb.TableDefs.count" im überwachungsfenster. diese geht einen runter bei jedem löschvorgang und es weden nicht alle tabellen gelöscht.