ADO Recordset #
Das ADO Recordset (ActiveX Data Objects) ist das zentrale Objekt für den Datenbankzugriff in EULANDA iScript. Es repräsentiert eine Ergebnismenge aus einer SQL-Abfrage als “virtuelle Tabelle” im Speicher.
Recordset erzeugen #
In EULANDA wird ein Recordset über Client.ExecuteSql erzeugt:
Dim rs
Set rs = Client.ExecuteSql("SELECT * FROM Artikel WHERE ArtNummer = 'ABC123'")
Die Methode führt die SQL-Abfrage aus und liefert ein geöffnetes Recordset zurück.
Navigation im Recordset #
Wichtige Eigenschaften #
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
EOF |
Boolean | True, wenn der Cursor hinter dem letzten Datensatz steht |
BOF |
Boolean | True, wenn der Cursor vor dem ersten Datensatz steht |
RecordCount |
Long | Anzahl der Datensätze (-1 wenn nicht ermittelbar) |
AbsolutePosition |
Long | Aktuelle Position des Cursors (1-basiert) |
Navigationsmethoden #
| Methode | Beschreibung |
|---|---|
MoveFirst |
Springt zum ersten Datensatz |
MoveLast |
Springt zum letzten Datensatz |
MoveNext |
Springt zum nächsten Datensatz |
MovePrevious |
Springt zum vorherigen Datensatz |
Move n |
Springt n Datensätze vorwärts (positiv) oder rückwärts (negativ) |
Leeres Recordset erkennen #
Ein Recordset ohne Datensätze hat sowohl BOF als auch EOF auf True:
Set rs = Client.ExecuteSql("SELECT * FROM Artikel WHERE 1=0")
If rs.BOF And rs.EOF Then
ellib.ShowMessage "Keine Datensätze gefunden"
End If
Feldzugriff #
Feldwerte lesen #
' Über Feldnamen (empfohlen)
wert = rs.Fields("ArtNummer").Value
' Kurzschreibweise
wert = rs("ArtNummer")
' Über Index (0-basiert)
wert = rs.Fields(0).Value
NULL-Werte behandeln #
Datenbankfelder können NULL sein. In VBScript muss dies explizit geprüft werden:
If IsNull(rs("Bemerkung")) Then
bemerkung = ""
Else
bemerkung = rs("Bemerkung")
End If
' Oder kompakt mit Hilfsfunktion
Function NullToEmpty(val)
If IsNull(val) Then NullToEmpty = "" Else NullToEmpty = val
End Function
bemerkung = NullToEmpty(rs("Bemerkung"))
Feldinformationen #
| Eigenschaft | Beschreibung |
|---|---|
Fields.Count |
Anzahl der Felder |
Fields(i).Name |
Name des Feldes (0-basiert) |
Fields(i).Type |
ADO-Datentyp des Feldes |
Fields(i).ActualSize |
Tatsächliche Größe des Wertes |
Fields(i).DefinedSize |
Definierte maximale Größe |
Standard-Verarbeitungsmuster #
Alle Datensätze durchlaufen (MoveNext/EOF) #
Das klassische Muster zur Verarbeitung aller Datensätze:
Option Explicit
Dim rs, sql, ausgabe
sql = "SELECT ArtNummer, Kurztext1, VK FROM Artikel WHERE AuslaufFlg = 0 ORDER BY ArtNummer"
Set rs = Client.ExecuteSql(sql)
ausgabe = ""
Do While Not rs.EOF
ausgabe = ausgabe & rs("ArtNummer") & " - " & rs("Kurztext1") & vbCrLf
rs.MoveNext
Loop
Set rs = Nothing
ellib.ShowMessage ausgabe
Wichtig: Vergessen Sie nicht
rs.MoveNextin der Schleife! Ohne diese Anweisung entsteht eine Endlosschleife.
Einzelnen Datensatz verarbeiten #
Wenn nur ein Datensatz erwartet wird:
Dim rs, artikelname, nummer
nummer = "4711"
Set rs = Client.ExecuteSql("SELECT Kurztext1 FROM Artikel WHERE ArtNummer = " &_
ellib.SqlString(nummer))
If Not rs.EOF Then
artikelname = rs("Kurztext1")
if IsNull(artikelname) Then artikelname = "(null)"
if Trim(artikelname) = "" Then artikelname = "(leer)"
Else
artikelname = "(nicht gefunden)"
End If
ellib.ShowMessage nummer & ": " & artikelname
Set rs = Nothing
Datensätze zählen #
Dim rs, anzahl
Set rs = Client.ExecuteSql("SELECT COUNT(*) AS Anzahl FROM Artikel WHERE AuslaufFlg=0")
anzahl = rs("Anzahl")
Set rs = Nothing
ellib.ShowMessage "Es gibt " & anzahl & " aktive Artikel"
Filter und Sortierung #
Filter-Eigenschaft #
Mit der Filter-Eigenschaft kann ein geöffnetes Recordset nachträglich gefiltert werden, ohne eine neue SQL-Abfrage auszuführen:
Option Explicit
Dim rs, sql
' Alle Artikel laden
sql = "SELECT ArtNummer, Kurztext1, WarenGr, VK FROM Artikel ORDER BY ArtNummer"
Set rs = Client.ExecuteSql(sql)
ellib.ShowMessage "Alle Artikel: " & rs.RecordCount
' Nur Artikel einer bestimmten Warengruppe anzeigen
rs.Filter = "WarenGr = 'ELEKTRONIK'"
ellib.ShowMessage "Gefiltert (ELEKTRONIK): " & rs.RecordCount
' Preisfilter
rs.Filter = "VK > 100"
ellib.ShowMessage "Gefiltert (VK > 100): " & rs.RecordCount
' Filter aufheben
rs.Filter = ""
ellib.ShowMessage "Ohne Filter: " & rs.RecordCount
Set rs = Nothing
Filter-Syntax #
| Operator | Beispiel | Beschreibung |
|---|---|---|
= |
"Status = 1" |
Gleich |
<> |
"Status <> 0" |
Ungleich |
>, <, >=, <= |
"VK >= 50" |
Vergleich |
LIKE |
"ArtNummer LIKE 'A*'" |
Mustervergleich (* = beliebig viele Zeichen) |
AND, OR |
"VK > 10 AND VK < 100" |
Logische Verknüpfung |
Hinweis: Der Filter arbeitet nur auf den bereits geladenen Daten. Für komplexe Filterungen ist eine angepasste SQL-Abfrage performanter.
Sort-Eigenschaft #
Die Sortierung kann ebenfalls nachträglich geändert werden:
rs.Sort = "VK DESC" ' Absteigend nach Preis
rs.Sort = "WarenGr, VK" ' Mehrere Felder
rs.Sort = "" ' Sortierung aufheben (Original)
Template-basierte Ausgabe #
Für die formatierte Ausgabe von Recordset-Daten bietet die ellib komfortable Funktionen.
ellib.ReplaceVars mit Recordset #
Ersetzt Platzhalter mit Feldwerten des aktuellen Datensatzes:
Option Explicit
Dim rs, zeile
Set rs = Client.ExecuteSql("SELECT Match, PLZ, Ort FROM Adresse WHERE ID = 956")
zeile = ellib.ReplaceVars("%MATCH% - %PLZ% %ORT%", rs)
ellib.ShowMessage zeile
Ausgabe:
FIRMA MEIER - 65510 Idstein
ellib.ReplaceVarsRecordset #
Verarbeitet alle Datensätze eines Recordsets auf einmal und fügt einen Trenner zwischen jede Zeile ein:
ellib.ReplaceVarsRecordset(Vorlage, Recordset, Zeilentrennung)
| Parameter | Beschreibung | |
|---|---|---|
Vorlage |
Text mit Platzhaltern in Prozentzeichen | |
Recordset |
Das zu verarbeitende Recordset | |
Zeilentrennung |
String, der zwischen jede Zeile eingefügt wird |
Beispiel: Adressliste erstellen #
Option Explicit
Dim rs, liste
Set rs = Client.ExecuteSql("SELECT TOP 10 Match, PLZ, Ort FROM Adresse ORDER BY Match")
liste = ellib.ReplaceVarsRecordset("%MATCH% - %PLZ% %ORT%", rs, vbCrLf)
ellib.ShowMessage liste
Ausgabe:
BAUER GMBH - 60311 Frankfurt FIRMA MEIER - 65510 Idstein MUELLER AG - 80331 München ...
Beispiel: CSV-Export #
Option Explicit
Dim rs, csv
Set rs = Client.ExecuteSql("SELECT ArtNummer, Kurztext1, VK FROM Artikel WHERE Gesperrt = 0")
' CSV mit Semikolon als Feldtrenner
csv = "ArtNummer;Kurztext1;VK" & vbCrLf
csv = csv & ellib.ReplaceVarsRecordset("%ArtNummer%;%Kurztext1%;%VK%", rs, vbCrLf)
ellib.SaveString csv, "C:\Export\artikel.csv"
Tipp: Für komplexe CSV-Exporte mit Anführungszeichen-Behandlung, konfigurierbaren Trennzeichen und weiteren Optionen bietet EULANDA die Funktion Client.RenderData.
Beispiel: HTML-Tabelle #
Option Explicit
Dim rs, html
Set rs = Client.ExecuteSql(_
"SELECT ArtNummer, Kurztext1, VK FROM Artikel WHERE VK > 100")
html = Client.renderData(rs, "preset=HTMLTable")
ellib.ShowHtml html, "Artikelliste", _
"Beispiel aus Entwickler-Dokumentation"
Die Template-Syntax ist identisch mit ellib.ReplaceObjectValues - Platzhalter werden in Prozentzeichen eingeschlossen und entsprechen den Feldnamen der SQL-Abfrage.
Daten als Array abrufen #
Die GetRows-Methode liefert alle Daten als zweidimensionales Array:
Option Explicit
Dim rs, daten, zeile, spalte
Set rs = Client.ExecuteSql("SELECT ArtNummer, Kurztext1 FROM Artikel WHERE AuslaufFlg = 0")
If Not rs.EOF Then
daten = rs.GetRows()
' daten(Spalte, Zeile) - Achtung: Spalte zuerst!
For zeile = 0 To UBound(daten, 2)
For spalte = 0 To UBound(daten, 1)
' Verarbeitung...
Next
Next
End If
Set rs = Nothing
Hinweis: Bei
GetRowsist die Indexierung(Spalte, Zeile), nicht(Zeile, Spalte).
Recordset klonen #
Mit Clone wird eine Kopie des Recordsets erstellt, die unabhängig navigiert werden kann:
Dim rs, rsKopie
Set rs = Client.ExecuteSql("SELECT * FROM Artikel")
Set rsKopie = rs.Clone
' Beide können nun unabhängig navigiert werden
rs.MoveFirst
rsKopie.MoveLast
Schreibzugriff (Übersicht) #
Das ADO Recordset unterstützt auch das Ändern von Daten. Diese Funktionen werden in EULANDA jedoch selten direkt verwendet, da Änderungen meist über die EULANDA-Datenobjekte oder direkte SQL-Befehle erfolgen.
| Methode | Beschreibung |
|---|---|
AddNew |
Neuen Datensatz anlegen |
Update |
Änderungen speichern |
Delete |
Aktuellen Datensatz löschen |
CancelUpdate |
Änderungen verwerfen |
Für Details zu diesen Methoden siehe die Microsoft ADO-Dokumentation.
Ressourcen freigeben #
Nach der Verwendung sollte das Recordset freigegeben werden:
Set rs = Nothing
Häufige Fehler #
Endlosschleife durch fehlendes MoveNext #
' FALSCH - Endlosschleife!
Do While Not rs.EOF
wert = rs("Feld")
' MoveNext fehlt!
Loop
' RICHTIG
Do While Not rs.EOF
wert = rs("Feld")
rs.MoveNext
Loop
Zugriff auf leeres Recordset #
' FALSCH - Fehler wenn Recordset leer
wert = rs("Feld")
' RICHTIG - Prüfung auf EOF
If Not rs.EOF Then
wert = rs("Feld")
End If
NULL-Werte nicht behandelt #
' FALSCH - Fehler bei NULL-Werten in Berechnungen
summe = rs("Menge") * rs("Preis")
' RICHTIG - NULL prüfen oder in SQL behandeln
Set rs = Client.ExecuteSql("SELECT ISNULL(Menge,0) * ISNULL(Preis,0) AS Summe FROM ...")
Weiterführende Informationen #
- Microsoft ADO Recordset Referenz
- ellib Replace-Funktionen - Template-Engine für Textvorlagen
- Textvorlagen | Handbuch - Platzhalter-Syntax