n4426
Goto Top

Datensatz über VBA hinzufügen (recordset.AddNew) dauert ewig

Hallo zusammen,

ich hab eine Access-Datenbank (Frontend). Als Backend verwende ich MS SQL Server 2008.

Mein Problem besteht darin, dass ich ein Log-Tabelle habe, die mittlerweile ca. 350.000 Datensätze enthält.

Wenn ich jetzt über diesen VBA-Code eine neuen Datensatz in die Tabelle schreibe, dauert es ca. 1-2 Sekeunden.

Ich hab jetzt zum Testen eine leere Tabelle mit gleicher Struktur angelegt. Da wird der Datensatz ohne merkliche verzögerung eingetragen (also weniger als 0,5 Sec).

Hat da einer von euch eine Idee, wie man das schneller hinbekommt? (eine leere Tabelle ist ja nicht wirklich die lösung)


Dim DB As Database
Dim rs As Recordset

Set DB = CurrentDb()


' Benutzerdaten  
Set rs = DB.OpenRecordset("TBL_History", dbOpenDynaset, dbSeeChanges)  
 
    rs.AddNew
        rs!ID = logIDNr
        rs!Tabelle = "TBL_123"  
        rs!User = thisUser.ID
        rs!Date = Date + Time
        rs!Feld = logFeld
        rs!WertALT = logWertAlt
        rs!WertNEU = logWertneu
    rs.Update
rs.Close

DB.Close

mfg
n4426

Content-ID: 170011

Url: https://administrator.de/contentid/170011

Printed on: November 11, 2024 at 10:11 o'clock

NetWolf
NetWolf Jul 19, 2011 at 12:40:21 (UTC)
Goto Top
Moin Moin,

ich vermute mal, dass ein oder mehrere Indexe in der Tabelle definiert sind. Das verzögert natürlich die Zugriffszeit.

Auch würde ich vor dem rs.AddNew ein rs.MoveLast einfügen. Das sollte das Schreiben beschleunigen.

Grundsätzlich ist die Frage: Wann wird diese Historie geschrieben? So wie ich das sehe, bei jeder Änderung in einem Feld!?
Das ist imho übertrieben. Wenn das Formular verlassen wird, könnten die geänderten Feldinhalte alle auf einmal geschrieben werden.

Wenn wirklich bei jeder Änderung eines Feldes diese Prozedur aufgerufen wird, solltest du nicht jedes mal den Recordset öffnen und wieder schließen.
Halte Ihn offen und schließe ihn wenn das Programm beendet wird.

Zusätzlich würde ich noch die ODBC Einstellungen von Access prüfen und reduzieren. Sorry, da gibt es keine Vorgabewerte, es hilft nur try & error in Abhängigkeit von der Umgebung.
Du solltest dir auch langfristig eine Lösung einfallen lassen, denn die Datensätze werden nicht weniger.

Vielleicht lässt es sich vereinbaren, dass nur der alte Wert mit User-ID und Zeit/Datum gespeichert wird, dann könnte man die bestehende Tabelle um diese Felder einfach erweitern.

Beispiel:
Aktuelles_Feld
Alter_Feldwert
User-ID
Datum/Zeit

Du hättest dann pro Feld natürlich drei zusätzliche Felder in der Tabelle, die du aber auch zu einem Feld zusammenfassen könntest. Historie = User-ID & "|" & Datum/Zeit & "|" & Alter_Feldwert
Der Vorteil, man könnte sehr schnell auf die alten Werte zugreifen face-smile

Grüße aus Rostock
Wolfgang
(Netwolf)
n4426
n4426 Jul 19, 2011 at 13:28:11 (UTC)
Goto Top
Hi Wolfgang,

als das rs.movelast hat jetzt zumindest nicht spürbar was verändert.

Wie kann ich den recordset offen halten?

Ich hab die Funktion zum schreiben des Logs in einem Modul abgelegt, das aus verschiedenen Formularen aufgerufen.

mfg
n4426

EDIT: oder ist es vieleicht besser, für das Log einfach nur ein SQL-Comand (INSERT ....) zu schreiben?
n4426
n4426 Jul 20, 2011 at 19:23:00 (UTC)
Goto Top
habs jetzt über DoCmd.RunSQL("Insert ....") gemacht, das läuft super schnell.

mfg
n4426
NetWolf
NetWolf Jul 20, 2011 at 23:14:46 (UTC)
Goto Top
*vordenkopfschlag*

logisch, klar ist das schneller als vorher einen Dynaset zu erzeugen.

Grüße aus Rostock
Wolfgang
(Netwolf)