Geschrieben von: Marc Teufel
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Mit Klassenauflistungen hat jeder ernsthafte Visual Basic-Programmierer irgendwann einmal zu tun. Ob freiwillig oder unfreiwillig sei mal dahingestellt, klar ist aber, wer sie einmal kennen- und liebengelernt hat will nicht mehr ohne sie auskommen. Um so schlimmer also, daß gerade diese beliebte Technologie nicht in VBScript und ASP zur Verfügung steht. Was also tun? Dieser Artikel zeigt einen kleinen Trick mit dem Klassenauflistungen sehr einfach aufgebaut und verwendet werden können.
Klassenauflistungen in Visual Basic sind relativ einfach zu handhaben, da ja dort ein Klassengenerator zur Verfügung steht der die meiste Programmierarbeit abnimmt. Diesem Artikel liegt zu Demonstrationszwecken ein kleines VB-Beispiel bei, in dem eine Klassenauflistung zum Einsatz kommt.
Hier ist der VB-Klassengenerator zu sehen, in dem ich eine kleine Klassenauflistung (colAdressen) zur Speicherung von Adressen (clsAdresse) angelegt habe. clsAdresse stellt hierbei den Container dar der immer wieder neu instanziert und mit Daten gefüllt in die Klassenauflistung colAdressen gespeichert wird.
Hat man die Klasse im VB-Klassengenerator definiert und man schließt denselbigen, wird die erstellte Klassenauflistung in das Projekt übernommen:
In diesem Beispiel hat der Klassengenerator die in der Abbildung (siehe oben) aufgeführten Klassen erstellt. Im Normalfall muß an den Klassen clsAdresse und colAdresse jetzt nichts mehr geändert werden, der Klassengenerator hat den Code selbständig angelegt, sodaß sich der Programmierer um wichtigere Aufgaben kümmern kann.
Der automatisch erzeugte Code für die Klasse clsAdresse sieht wie folgt aus:
Private mvarNachname As String Private mvarVorname As String Public Property Let Vorname(ByVal vData As String) mvarVorname = vData End Property Public Property Get Vorname() As String Vorname = mvarVorname End Property Public Property Let Nachname(ByVal vData As String) mvarNachname = vData End Property Public Property Get Nachname() As String Nachname = mvarNachname End Property
Die Klasse clsAdresse ist dazu gedacht um immer wieder neu instanziert und mit Daten gefüllt in eine Collection gepackt zu werden, die wiederrum von der Klasse colAdressen verwaltet wird. Der automatisch generierte Code von colAdressen enthält Routinen zum Anlegen, Entfernen und Zugreifen auf Elemente der Auflistung.
Wie man in VB mit den Klassen umgeht zeigt folgendes kleines Snippet:
Dim lCounter As Long Dim EinzelneAdresse As clsAdresse ' Daten in die Klassenauflistung aufnehmen ' ohne Schlüssel Adressen.Add "Stoiber", "Edmund" Adressen.Add "Merkel", "Angela" ' mit Schlüssel Adressen.Add "Schröder", "Gerhard", "Bundeskanzler" MsgBox "Im folgenden wird der Inhalt der kompletten Klassenauflistung ausgegeben:" For lCounter = 1 To Adressen.Count Set EinzelneAdresse = Adressen.Item(lCounter) MsgBox "Vorname: " & EinzelneAdresse.Vorname & vbCrLf & _ "Nachname: " & EinzelneAdresse.Nachname Next lCounter MsgBox "Im folgenden wird über einen Key nur der Bundeskanzler ausgelesen und ausgegeben:" Set EinzelneAdresse = Adressen.Item("Bundeskanzler") MsgBox "Vorname: " & EinzelneAdresse.Vorname & vbCrLf & _ "Nachname: " & EinzelneAdresse.Nachname
Dieses VB-Beispiel ist natürlich auch in den Sourcen enthalten, die zu diesem Artikel heruntergeladen werden können.
VBScript kennt keine Collections und auch das Klassenkonzept so wie man es von VB her gewöhnt ist, gibt es in VBScript in dieser Form nicht. Ab Version 5.0 bietet VBScript Klassen an (die wir im Verlaufe dieses Artikels noch noch benutzen), diese werden im Gegensatz zu Visual Basic jedoch nicht in eigenen Klassenmodulen (.cls) definiert sondern mit den Schlüsselwörten Class und End Class direkt in den Quelltext geschrieben (siehe dazu auch den Artikel Klassen mit VBScript).
Wie also Klassenauflistungen in ASP nachbilden? Nun, da gibt es mehrere Möglichkeiten auf die ich an dieser Stelle etwas näher eingehen möchte:
Mehrdimensionale Arrays haben den Nachteil, daß der Zugriff auf einzelne Elemente über Indizes erfolgt, was mitunter sehr kryptisch werden kann, wenn man z.B. eine komplette Kundenadresse abbildet (an welcher Stelle war nochmal die PLZ gespeichert?). Ferner hat man bei einem Array immer das Problem, daß einzelne Elemente nicht, wie beim Dictionary-Objekt, über einen Key adressierbar sind.
Verbindungslose ADO-Recordsets sind eine weitere elegante Methode um Daten im Speicher zu halten, da dieses jederzeit per AddNew erweitert werden kann. Auch das Durchlaufen eines verbindungslosen ADO-Recordsets ist ohne Probleme möglich. Einen Nachteil sehe ich hier allerdings beim Speicherverbrauch. Das Recordset muß ja schließlich auch verwaltet werden und das ist speicherlastig.
Bleiben nur noch VBScript-Klassen und das Dictionary-Objekt. Und tatsächlich, wenn man diese beiden Techniken miteinander verknüpft kann man Klassenauflistungen annähernd wie in VB nachbilden. Das Dictionary-Objekt ist in diesem Zusammenhang zwar auch speicherlastig, aber nicht so sehr wie ein ADO-Recordset.
Hinweis: Da VBScript Objekte sowieso nicht in Application- oder Session State gespeichert werden können, entfällt auch die Problematik des Dictionary Objekts, siehe dazu den Artikel Das Dictionary Objekt - Dein Feind und Helfer.
Den Grundstein für eine Klassenauflistung in VBScript legt man indem man eine Klasse definiert in der alle Felder die später gespeichert werden sollen enthalten sind. Setzt man das VB-Beispiel von oben in VBScript und ASP um, sähe der Sourcecode der Klasse so aus:
<% Class Adresse dim sVorname dim sNachname Public Property Get Vorname Vorname = sVorname End Property Public Property Let Vorname(newVorname) sVorname = newVorname End Property Public Property Let Nachname(newNachname) sNachname = newNachname End Property Public Property Get Nachname Nachname = sNachname End Property End Class %>
Die Programmierung der Properties erfolgt hier ähnlich wie in VB, nur daß man sie hier selbst codieren muß (diese Arbeit kann man in VB vom Klassengenerator erledigen lassen). Der einzige Unterschied zu VB-Klassen besteht darin, daß in VB eine Klasse immer eine Datei mit der Dateinamenserweiterung .cls ist und in VBScript eine Klasse mit den Schlüsselwort Class eingeleitet und End Class abgeschloßen wird.
Jetzt kommt der eigentliche Trick mit dem die Klassenauflistung gefüllt wird: Man nimmt sich zunächst ein Dictionary, danach erstellt man eine Instanz einer Klasse (z.B. die oben abgebildete Klasse Adresse), füllt sie mit Daten und packt dieses Objekt in das Dictionary. Eigentlich gar nicht so schwer, aber sehr effizient da in einem Dictionary zu jedem Element ein eindeutiger Key mitgegeben werden muß, mit dem man sofortigen Zugriff auf alle Elemente des Dictionarys bekommt. Das Dictionary muß also nicht sequentiell bis zu dem Element durchlaufen werden, das gesucht wird.
Folgender Code speichert zwei Adressen in die Klassenauflistung:
<% dim dicKlassenauflistung dim cAdresse ' Dictionary definieren set dicKlassenauflistung = CreateObject("Scripting.Dictionary") ' 1. Adresse in die Klassenauflistung speichern set cAdresse = new Adresse with cAdresse .Vorname = "Edmund" .Nachname = "Stoiber" end with dicKlassenauflistung.Add "CSU-Vorsitzender", cAdresse ' 2. Adresse in die Klassenauflistung speichern set cAdresse = new Adresse with cAdresse .Vorname = "Gerhard" .Nachname = "Schröder" end with dicKlassenauflistung.Add "Bundeskanzler", cAdresse %>
Irgendwann will man die Daten auch wieder aus der Klassenauflistung auslesen, auch das schafft man mit einfachen Mitteln:
<% Dim cEinzelneAdresse Set cEinzelneAdresse = dicKlassenauflistung.Item("Bundeskanzler") Response.write " Vorname: " & cEinzelneAdresse.Vorname Response.write " Nachname: " & cEinzelneAdresse.Nachname %>
Mit dem oben beschriebenen Trick kann man also sehr effizient Klassenauflistungen bauen und damit auch kompliziertere Datenstrukturen in ASP verarbeiten. Einziges Manko an dieser Technik ist, daß diese Klassenauflistungen nicht über Session- oder Applicationvariablen weitergegeben werden können. Dieser Artikel wird übrigens fortgesetzt - in der Fortsetzung wird ein Klassengenerator vorgestellt, der selbst in ASP geschrieben, ähnlich funktioniert wie der VB-Klassengenerator und automatisch VBScript-Klassen erstellen kann.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020408.zip
Das Dictionary Objekt - Dein Feind und Helfer
http:/www.aspheute.com/artikel/19990806.htm
Der Object Construct String
http:/www.aspheute.com/artikel/20020205.htm
Große Datenmengen in Formularfeldern erfolgreich auslesen
http:/www.aspheute.com/artikel/20020430.htm
In VB Komponenten auf ASP Objekte zugreifen (Variante 1)
http:/www.aspheute.com/artikel/20010320.htm
In VB Komponenten auf ASP Objekte zugreifen (Variante 2)
http:/www.aspheute.com/artikel/20010322.htm
Klassen in VBScript
http:/www.aspheute.com/artikel/20000526.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.