vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Datenbanken · DAO   |   VB-Versionen: VB4, VB5, VB631.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 OtterBewertung:  Views:  31.726 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein 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!
 



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.