Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Accdb vergrößert sich enorm bei Vereinigungen von Daten.

Begonnen von Mykis, Dezember 05, 2023, 11:03:05

⏪ vorheriges - nächstes ⏩

Mykis

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

PhilS

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?

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Mykis


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

MzKlMu

#3
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 ?
Gruß Klaus

Mykis

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

MzKlMu

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.
Gruß Klaus

Mykis

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

MzKlMu

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", DbFailOnError
DbFailOnError 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.
Gruß Klaus

Mykis

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

MzKlMu

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.
Gruß Klaus

ebs17

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                                                                                                                               
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

ich würde da über eine n:m-Tabelle zwischen "Fundorte" und "Fundorte" (Selfjoin)
nachdenken.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)