Rubrik: Datenbanken · DAO | VB-Versionen: VB4, VB5, VB6 | 31.10.01 |
Datensätze schnell aktualisieren Mit dem QUERY-Objekt und der UPDATE-Anweisung lassen sich Datensätze schnell und einfach global innerhalb der Datenbank aktualisieren. | ||
Autor: Dieter Otter | Bewertung: | Views: 31.726 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Haben Sie sich auch schon öfters gefragt: "Wie lassen sich schnell und einfach Datenfelder bestimmter oder aller Datensätze einer Access-Datenbank automatisiert aktualisieren?"
Wenn man es anders nicht weiss, dann durchläuft man die Datenbank vom ersten bis zum letzten Datensatz, prüft, ob der aktuelle Datensatz für die Aktualisierung herangezogen werden muss - und wenn ja, dann führt man die Datensatz-Änderung durch. Das ganze sieht dann so aus:
Dim Db As Database Dim Rs As Recordset ' Datenbank öffnen Set Db = OpenDatabase("KUNDEN.MDB", False, False) ' Datenbank-Tabelle öffnen Set Rs = Db.OpenRecordset("Kunden") ' alle Datensätze druchlaufen With Rs If .RecordCount > 0 Then .MoveFirst Do Until .Eof ' Prüfen, ob der Datensatz aktualisiert ' werden muss If Rs("EMail_Info") = False Then If Not IsNull(Rs("EMail")) Then If Rs("EMail") <> "" Then Rs.Edit Rs("EMail_Info") = True Rs.Update End If End If End If .MoveNext Loop End If End With ' Datenbank schliessen Rs.Close Db.Close Set Db = Nothing
Welche Aktion wird hier nun ausgeführt?
Es soll das Datenfeld EMail_Info auf True gesetzt werden - aber nur wenn:
EMail_Info nicht schon den Wert True hat
UNDbeim Kunden eine EMail-Adresse gespeichert ist
"Ah... Bedingungen" - die lassen sich doch auch bestimmt duch eine SQL-Anweisung ausdrücken. Genau!. Also setzen wir die Bedingung zunächst in eine korrekte SQL-Syntax um:
SELECT EMail_Info FROM Kunden WHERE _ (EMail_Info = False) AND _ NOT (EMail Is Null) AND (EMail <> "")
Demnach öffnen wir die Kundentabelle (das Recordset) unter Einbeziehung obiger SQL-Abfrage. Somit fällt wenigstens erst einmal die aufwendige manuelle Prüfung der einzelnen Datensätze weg:
Dim Db As Database Dim Rs As Recordset Dim SQL As String ' Datenbank öffnen Set Db = OpenDatabase("KUNDEN.MDB", False, False) ' Datenbank-Tabelle öffnen SQL = "SELECT EMail_Info FROM Kunden WHERE " & _ "(EMail_Info = False) AND " & _ "NOT (EMail Is Null) AND (EMail <> "")" Set Rs = Db.OpenRecordset(SQL) ' Datensätze druchlaufen und aktualisieren With Rs If .RecordCount > 0 Then .MoveFirst Do Until .Eof Rs.Edit Rs("EMail_Info") = True Rs.Update .MoveNext Loop End If End With ' Datenbank schliessen Rs.Close Db.Close Set Db = Nothing
Das ganze sieht ja jetzt schon viel besser aus - und vor allen Dingen ist der Code auch viel kürzer geworden. Das Durchführen der Datensatz-Aktualisierungen erfolgt auch wesentlich schneller!
Lässt sich dieser Code aber vielleicht nicht noch weiter optimieren?
JA - und jetzt kommt das QUERY-Objekt ins Spiel
Für solch automatisierbaren Aktualisierungs-Vorgänge stellt uns das Access-Datenbankmodul ein mächtiges Werkzeug zur Verfügung - das QUERY-Objekt. Hierbei handelt es sich um eine Defintion einer Abfrage, bei der Datensätze nicht nur ermittelt werden, sondern u.a. Daten-Aktualisierungen direkt von der Datenbank-Engine ausgeführt werden.
Für unser obiges Beispiel eignet sich das QUERY-Objekt also hervorragend, denn:
- es muss eine bestimmte Datensatz-Gruppe selektiert werden UND
- es muss eine Daten-Aktualisierung vorgenommen werden
Unter Einsatz des QUERY-Objekts sieht der Code dann so aus:
Dim Db As Database Dim QUERY As QueryDef Dim SQL As String ' Datenbank öffnen Set Db = OpenDatabase("KUNDEN.MDB", False, False) ' QUERY-Abfrage und Aktion definieren SQL = "UPDATE Kunden SET EMail_Info = True WHERE " & _ "(EMail_Info = False) AND " & _ "NOT (EMail Is Null) AND (EMail <> "")" Set QUERY = Db.CreateQueryDef("", SQL) QUERY.Execute QUERY.Close Set QUERY = Nothing ' Datenbank schliessen Db.Close Set Db = Nothing
Wenn man den aktuellen Aktualisierungs-Code mit der ersten hier gezeigten Variante vergleicht, muss man doch feststellen, dass sich der Einsatz eines QUERY-Objekts wirklich sehr oft lohnt!