Hallo Access-Freunde,
in meiner Kartierungsdatenbank für Pilze muss ich bei der Datenpflege immer mal Fundorte vereinigen, da es unterschiedliche Bezeichnungen für den gleichen Fundort gibt. Benutze ich dieses Vereinigungsformular, pauscht sich die .accdb in kürzester Zeit stark auf. Selbst die 2 GB Grenze habe ich schon erreicht! Nach Schließen und Komprimieren der Datenbank ist dann die Ausgangsgröße von 18 MB wieder erreicht. Ist dieses starke Aufpauschen wärend der Bearbeitung von Daten normal? Alle Tabellen sind nur als Verknüpfung, also Backend, eingebunden.
LG
Frank
Dass eine .accdb während der Benutzung wächst ist grundsätzlich erstmal normal. Wie groß dieses Wachstum ist, hängt von den ausgeführten Aktionen ab und lässt sich schwer einschätzen.
Ein Wachstum von ca. 18MB auf die Größenordnung von 2GB ist extrem ungewöhnlich und höchstwahrscheinlich nicht normal.
Was genau tut denn dein Vereinigungsformular?
Vielen Dank für deine Antwort.
Mein Vereinigungsformular vereinigt die ausgewählten unterschiedlichen Fundorte zu einem einheitlichen Fundort. Die resultierende ID des Fundortes wird dann in den dazugehörigen Tabellen geändert. Die "falschen" Fundorte werden gleichzeitig gelöscht.
LG
Frank
Hallo,
die Beschreibung des Vereinigungsformulars ist völlig unzureichend. Die Frage ist, was genau macht dieses Vereinigungsformular ?
Ein Formular kann Daten anzeigen, aber nichts vereinigen. Da muss doch Code und/oder Abfragen am Werk sein.
Und das solltest Du mal beschreiben.
Nach dem Löschen von Datensätzen sollte immer komprimiert/repariert werden, weil erst dann die Datensätze physisch gelöscht werden.
Speicherst Du Bilder in der DB ?
Hallo Klaus,
Bilder sind nicht in der DB gespeichert.
Der Code der Vereinigung lautet:
Private Sub exec_merge_fo(fo_dele As Boolean)
Dim Meldung As String
On Error GoTo Err_exec_merge_fo
Meldung = v_meldung1 & " '" & Me!Nr_Fundort.Column(1) & "' vereinigen"
If fo_dele Then Meldung = Meldung & " und " & v_meldung3 & "vornehmen"
Meldung = Meldung & "? "
If fo_dele Then Meldung = Meldung & cr_Warnung_bei_Fundort_loeschen
Meldung = Meldung & " " & v_meldung4
DoCmd.SetWarnings False
If Nachricht_mit_JaNein(Meldung) Then
DoCmd.RunSQL "UPDATE (basis_listenauswahl " _
& "INNER JOIN Fundortliste ON basis_listenauswahl.listenwert = Fundortliste.Fundort) " _
& "INNER JOIN beobachtung ON Fundortliste.nr_fundort = beobachtung.nr_fundort " _
& "SET beobachtung.nr_fundort = " & CStr(Me![Nr_Fundort]) _
& " WHERE (((basis_listenauswahl.auswahl)=True));"
If fo_dele Then
DoCmd.OpenQuery "basis_listenauswahl_update"
DoCmd.OpenQuery "Pflege_Fundortliste"
DoCmd.SetWarnings True
End If
Meldung = v_meldung1 & "'" & Me!Nr_Fundort.Column(1) & "' wurden vereinigt "
If fo_dele Then Meldung = Meldung & "und " & v_meldung3 & "vorgenommen"
Meldung = Meldung & "."
Nachricht_OK_Achtung (Meldung)
DoCmd.SetWarnings True
DoCmd.Close
DoCmd.OpenForm "Dialog_Fundortvereinigung"
End If
Exit_exec_merge_fo:
Exit Sub
Err_exec_merge_fo:
MsgBox Error$
Resume Exit_exec_merge_fo
End Sub
Hallo,
wozu öffnest Du die Abfragen "basis_listenauswahl_update" und "Pflege_Fundortliste" ?
Was machen die Abfragen, das öffnen alleine macht ja nichts.
Aktionsabfragen werden mit Execute ausgeführt und nicht mit RunSQL.
Die Abfrage "basis_listenauswahl_update" aktualisiert das Formular "Basis_Listenauswahl" für die entsprechende Vereinigung. Die Abfrage "Pflege_Fundortliste" ist eine Löschabfrage, die die "falschen Fundorte" löscht.
LG
Frank
Hallo,
nach dem Löschen von Datensätzen ist regelmäßig komprimieren/reparieren durchzuführen, weil wie gesagt erst dann die Datensätze wirklich gelöscht werden. also um das Komprieren kommst Du eh nicht herum.
Aktionsabfragen sind mit CurrentDb.Execute auszuführen.
Also so:
CurrentDb.Execute "UPDATE (basis_listenauswahl " _
& "INNER JOIN Fundortliste ON basis_listenauswahl.listenwert = Fundortliste.Fundort) " _
& "INNER JOIN beobachtung ON Fundortliste.nr_fundort = beobachtung.nr_fundort " _
& "SET beobachtung.nr_fundort = " & CStr(Me![Nr_Fundort]) _
& " WHERE (((basis_listenauswahl.auswahl)=True))", DbFailOnError
.
.
.
CurrentDb.Execute "basis_listenauswahl_update", DbFailOnError
CurrentDb.Execute "Pflege_Fundortliste", DbFailOnErrorDbFailOnError sorgt für eine Fehlermeldung wenn die Abfragen einen Datenfehler erzeugen. Nicht zu verwechseln mit SetWarnings das nur Warnmeldungen ausgibt (Wollen Sie....). Die Zeilen mit SetWarnings sind alle überflüssig.
Komprimieren ist aber in jedem Fall erforderlich.
Hallo Klaus,
deinen Code habe ich eingebaut. Vielen Dank! Ist es denn über einen vba-Befehl überhaupt möglich, nach jeder Vereinigung zu komprimieren?
LG
Frank
Hallo,
eine Datenbank sollte nicht aus sich selbst per VBA komprimiert werden.
Wenn das häufig gemacht wird, so kann man in den Optionen einstellen, dass die DB beim Schließen immer komprimiert wird.
Aufblähung und damit Bedarf von Komprimieren entsteht nur durch Anfügen + Löschen.
Löschen muss man die Datenmenge, die man unnütz zusätzlich erzeugt hat (= Müll).
Wenn Vereinigen bedeutet, man ergänzt die eine Tabelle nur um die Datensätze aus der anderen Tabelle, die es in Tabelle 1 nicht gibt, wird kein zu entsorgender Müll erzeugt, der Probleme erzeugt.
Es könnte sich also lohnen, diesen Prozess genauer zu betrachten und Kosten zu reduzieren.
Grundlagen - SQL ist leicht (4) - Aktualisierung einer Tabelle (https://www.ms-office-forum.net/forum/showthread.php?t=304156)
ich würde da über eine n:m-Tabelle zwischen "Fundorte" und "Fundorte" (Selfjoin)
nachdenken.