asphelper.de - ASPKurs - Array, Dictionary & Recordset

Link: Wichtiger Hinweis in eigener Sache!


VBScript-GrundlagenVariablen & KonstantenArray, Dictionary & RecordsetIf oder Wenn?
IterationDie Prozeduren Function und SubKlassen und ObjekteFehlerbehandlung
DatumsfunktionenDateizugriff per FileSystemObjectZeichenketten - FunktionenZahlen - Rechnen & Formatieren




Ein Array (englisch) = Feldvariable ist eine Sammlung von Variablen, die durch ein Indexfeld organisiert wird. Möchte man z.B. rund 500 Artikel in Variablen zur Bearbeitung zwischenspeichern, wird dies durch Normale Variablen sehr schwierig. Denn nicht immer kennt man die Anzahl der Datensätze. Bei 5 Datensätze kein Problem, was aber, wenn es 500 Datensätze sein könnten, oder gar 5000? Genau hier ist ein Array angebracht. Die Nutzung eines Arrays ist recht simpel:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<% @ Language="VBScript" %>
<% Option Explicit %>
<%
'Array initialisieren
Dim MeinArray(3)

'Array mit Werten füllen
MeinArray(0) = "Hallo "
MeinArray(1) = "ASP"
MeinArray(2) = "-"
MeinArray(3) = "Welt"

'Ausgabe der Array-Werte
Response.Write(MeinArray(0) & MeinArray(1) & MeinArray(2) & MeinArray(3))

'Speicher freigeben
Erase MeinArray
%>


Obwohl der Text über 2 Zeilen und 2 Response.Write-Anweisungen geschrieben wird, wird der Text beim Client in einer Zeile geschrieben. Wenn Sie hier einen Zeilenumbruch haben möchte, müssen Sie dies durch die HTML-Anweisung <br> durchführen. Die Theorie sagt aus, daß die VBScript-Engine automatisch den Speicherplatz von Objekten und Arrays freigibt. Allerdings hat sich in der Praxis gezeigt, daß dies nicht immer zuverlässig funktioniert. Deshalb sollte bei der Verwendung von Arrays der Speicherplatz freigegeben werden. Durch das Setzen der Anweisung Erase MeinArray wird der Speicherplatz freigegeben. In der Zeile Dim MeinArray(3) wird dem Array mit der Initialisierung auch die Anzahl der Elemente zugeordnet. Dabei wird eine Zahl angegeben, beginnend von Null an. Wird der Wert 10 angegeben, wird dem Array 11 Elemente zugeordnet. Was aber, wenn man nicht von Anfang an weiss, wieviele Elemente benötigt werden? Dazu gibt es die Anweisung ReDim, mit der die Anzahl der Elemente neu zugeordnet werden kann. Allerdings muss hierbei "Preserve" mit angegeben werden, da sonst die Inhalte der anderen Arrayelemente verloren gehen.
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<% @ Language="VBScript" %>
<% Option Explicit %>
<%
'Array initialisieren
Dim MeinArray(1)

'Array mit Werten füllen
MeinArray(0) = "Guten "
MeinArray(1) = "Tag"

'Elemente dem Array hinzufügen
ReDim Preserve MeinArray(3)
MeinArray(2) = "Jules "
MeinArray(3) = "Verne"

'Ausgabe der Array-Werte
Response.Write(MeinArray(0) & MeinArray(1))
Response.Write(MeinArray(2) & MeinArray(3))

'Speicher freigeben
Erase MeinArray
%>

Wenn Sie dieses Programm laufen lassen, erhalten Sie einen Fehler mit der Hexadezimalen Nummer 800a000a. Dieser Fehler bedeutet, daß dem Array keine neuen Elemente hinzugefügt werden kann. Der Grund hierfür ist eine Statische Zuweisung der Elementenanzahl beim Array. Wird ein Array mit der Anweisung <% Dim MeinArray(10) %> erstellt, ist die Zuweisung der Elementenanzahl statisch, also nicht veränderbar. Somit muss eine Dynamische Zuordnung der Elementenanzahl durchgeführt werden, eine korrekte Zuweisung und Nutzung sieht so aus:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<% @ Language="VBScript" %>
<% Option Explicit %>
<%
'Array initialisieren
Dim MeinArray()
ReDim Preserve MeinArray(1)

'Array mit Werten füllen
MeinArray(0) = "Guten "
MeinArray(1) = "Tag"

'Elemente dem Array hinzufügen
ReDim Preserve MeinArray(3)
MeinArray(2) = " Jules "
MeinArray(3) = " Verne"

'Ausgabe der Array-Werte
Response.Write(MeinArray(0) & MeinArray(1))
Response.Write(MeinArray(2) & MeinArray(3))

'Speicher freigeben
Erase MeinArray
%>


Wenn Sie in einem Array Artikelnummer, Artikelname, Beschreibung und den Preis für mehrere Artikel speichern möchten, ist dies mit einem eindimensionalen Array nicht möglich, dazu bedarf es einem mehrdimensionalen Array. Für das Speichern der Artikeldaten genügt ein Zweidimensionales Array. Durch den ersten Index wird identifiziert, welche Daten gespeichert werden. Durch den zweiten Index wird der jeweilige Artikel identifiziert. Beispiel:

1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<% @ Language="VBScript" %>
<% Option Explicit %>
<%
'2-Dimensionales Array initialisieren
Dim MeinArray()
ReDim Preserve MeinArray(3,1)

'Erster Artikel in Array eintragen
MeinArray(0,0) = "316936"
MeinArray(1,0) = "Workshop ASP"
MeinArray(2,0) = "Das ASPBuch für den ambitionierten Programmierer."
MeinArray(3,0) = "35,00"

'Zweiter Artikel in Array eintragen
MeinArray(0,1) = "316554"
MeinArray(1,1) = "ASP Programmierung mit ADO"
MeinArray(2,1) = "Mit ADO professionelle Websites erstellen."
MeinArray(3,1) = "60,00"

'Ausgabe des ersten Artikels
Response.Write("<br>Erster Artikel:")
Response.Write("<br>ArtikelNr: " & MeinArray(0,0))
Response.Write("<br>Artikelname: " & MeinArray(1,0))
Response.Write("<br>Beschreibung: " & MeinArray(2,0))
Response.Write("<br>Preis: " & MeinArray(3,0))

'Ausgabe des zweiten Artikels
Response.Write("<br><br><br>")
Response.Write("Zweiter Artikel:")
Response.Write("<br>ArtikelNr: " & MeinArray(0,1))
Response.Write("<br>Artikelname: " & MeinArray(1,1))
Response.Write("<br>Beschreibung: " & MeinArray(2,1))
Response.Write("<br>Preis: " & MeinArray(3,1))

'Speicher freigeben
Erase MeinArray
%>

Natürlich wäre hier eine Schleife angebracht, aber ich möchte nicht vorgreifen. Im Kapitel Schleifen werde ich ein derartiges Beispiel mit einem Array aufzeigen. Ein Array kann bis zu 60 Dimensionen verwalten. Allerdings sollten Sie bei der Anzahl der Dimensionen vorsichig sein. Zum einen wird der Überblick für den Programmierer schwerer. Zum anderen kann der Arbeitsspeicherbedarf ins fast unendliche steigen. Werden nur 2 Bytes je Dimension benötigt, so sind das 260 Bytes, oder 1048576 Terabyte, also gerade mal ein paar Megabyte mehr als die meisten Leute in Ihrem Rechner haben. Die Anzahl der Elemente eines Arrays z.B. Anzahl der eingetragenen Artikel, hängt im wesentlichen vom Rechner ab. Die Faktoren hierfür ist der Arbeitsspeicher des Servers, das Betriebssytem, Inhalt und Speicherbedarf eines einzelnen Arrays und noch weitere Faktoren. Leider konnte ich keine maximale Zahl finden, meiner Vermutung aber dürfte diese wohl bei 2 Milliarden Elemente liegen. Aber hier gilt natürlich daß hierzu ein paar Megabytes notwendig sind, welche in den meisten Rechner fehlen dürften. Realistisch dürfte von daher von mehreren Tausend bis merhreren Hunderttausend Elementen sein.

Natürlich habe ich das Array Dynamisch zugeordnet. Bei einem mehrdimensionalem Array gibt es jedoch eine Besonderheit: Bei der ersten Zuordnung der Elementen können alle Dimensionen bestimmt und die Anzahl der Elemente angegeben werden. Bei der nächsten Zuordnung von Elementen kann nur der letzte Index geändert werden. Wenn Sie die Anweisung <% ReDim Preserve MeinArray(3,1) %> ein zweites mal aufrufen, kann deshalb der erste Index (also die 3) nicht geändert werden, es kann nur der zweite Index (die eins) geändert werden.

Angenommen, man möchte Artikel in einem Array speichern. Während des Programmsablaufs benötigen Sie einen Artikel mit der ArtikelNr 316554. Wie diesen Artikel finden? Die Identifikation eines Arrays erfolgt durch den jeweiligen Index. Allerdings können Sie eine Sechstellige Zahl wohl kaum als Index für das Array verwenden. Es bleibt Ihnen somit nur die Möglichkeit, alle Artikel zu durchsuchen, bis Sie den gewünschten Artikel haben. Wenn Sie sehr viele Artikel haben, ist dies ein sehr uneffizienter Weg. Ideal wäre hier, wenn der jeweilige Artikel durch die Artikelnummer identifiziert wird, und nicht durch eine fortlaufende Nummer die bei 0 beginnt. Leider bietet hier ein Array keine entsprechende Möglichkeit.

VBScript bietet hier eine Möglichkeit an, und zwar das Dictionary-Objekt. ADO (ActiveX Data Object) bietet hier ebenfalls eine Alternative an, und zwar das Recordset, wobei das Recodset mehr Möglichkeiten als das Dictionary-Objekt bietet, dazu ist den meisten das Dictionary-Objekt nicht bekannt, sehr wohl aber ist das Recordset ein fast täglich benutztes Objekt. Natürlich möchte ich hier erwähnen, daß ein Array bezüglich der Geschwindigkeit absolut unschlagbar ist.

Das Dictionary-Objekt
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<% @ Language="VBScript" %>
<% Option Explicit %>
<%
'Dictionary initialisieren und Objekt erstellen
Dim DicArtikelname, DicBeschreibung, DicPreis, ArtikelNr

set DicArtikelname = Server.CreateObject("Scripting.Dictionary")
set DicBeschreibung = Server.CreateObject("Scripting.Dictionary")
set DicPreis = Server.CreateObject("Scripting.Dictionary")

'Erster Artikel eintragen
ArtikelNr="316936"
DicArtikelname.Add ArtikelNr,"Workshop ASP"
DicBeschreibung.Add ArtikelNr,"Das ASPBuch für den ambitionierten Programmierer."
DicPreis.Add ArtikelNr,"35,00"

'Zweiter Artikel eintragen
ArtikelNr="316554"
DicArtikelname.Add ArtikelNr,"ASP Programmierung mit ADO"
DicBeschreibung.Add ArtikelNr,"Mit ADO professionelle Websites erstellen."
DicPreis.Add ArtikelNr,"60,00"

'Erster Artikel ausgeben
ArtikelNr="316936"
Response.Write("Erster Artikel:")
Response.Write("<br>ArtikelNr: " & ArtikelNr)
Response.Write("<br>ArtikelName:" & DicArtikelname.Item(ArtikelNr))
Response.Write("<br>Beschreibung:" & DicBeschreibung.item(ArtikelNr))
Response.Write("<br>Preis:" & DicPreis.item(ArtikelNr))

'Zweiter Artikel ausgeben
ArtikelNr="316554"
Response.Write("<br><br>Zweiter Artikel:")
Response.Write("<br>ArtikelNr: " & ArtikelNr)
Response.Write("<br>ArtikelName:" & DicArtikelname.item(ArtikelNr))
Response.Write("<br>Beschreibung:" & DicBeschreibung.item(ArtikelNr))
Response.Write("<br>Preis:" & DicPreis.item(ArtikelNr))

'Objekte zerstören
set DicArtikelname = nothing
set DicBeschreibung = nothing
set DicPreis = nothing
%>


In den Zeilen 7 bis 9 wird aufgezeigt, wie in ASP ein Objekt erstellt wird. Hierzu wird vom ASP-Server-Objekt die Methode "CreateObject" verwendet. Aufgerufen werden damit z.B. Windows Scripting- und ADO-Funktionen, oder COM-Komponenten. COM-Komponenten können von jedem z.B. als ActiveX-DLL oder ActiveX-exe in Visual Basic erstellt werden. Durch das vorangestellte "Set" wird der VBScript-Engine mitgeteilt, daß nun ein Objekt erstellt werden soll. Den erstellten Dictonary-Objekten wird dann mit der Methode "Add" ein Wert zugeordnet. Die Funktion Add für das Dictionary-Objekt hat folgende Syntax:
DicArtikelname.Add Index,DerZuSpeicherndeInhalt

Als erstes folgt der Name des Dictionary-Objekts, in diesem Fall "DicArtikelname", anschliessend die Methode "Add". Die Zuweisung der Indizes zeigt wohl den grössten Unterschied zwischen eines Dictionary-Objekt und eines Arrays auf. Bei einem Array muss der Index bei 0 beginnen, und erhöht sich jeweils um den Faktor 1. Bei Dictionary ist der Index ein Alphanumerischer Index, natürlich muss jeder Index einmalig sein. Natürlich könnte somit im obigen Beispiel auch nur ein Dictionary-Objekt verwendet werden. Und zwar wenn dem Index noch die Art des zu speichernden Strings mitgeteilt wird, ein Beispiel hierfür:
<% DicArtikelname.Add "Artikelnummer_" & ArtikelNr,"Workshop ASP" %>

Der Index in diesem Fall sieht, bezogen auf das Buch "Workshop ASP" dann so aus: "Artikelnummer_316936".
Die Dictionary-Methode Item wird verwendet, um den Inhalt des entsprechenden Index-Feldes zu erhalten, aufgezeigt z.B. in der Zeile 27.

Das Recordset
Der wohl grösste Unterschied zwischen einem Recordset und Dictionary sind die Anzahl der Methoden. Hier ist das Recordset dem Dictonary deutlich überlegen. Deshalb ist für mich das Recordset die meistgenutzte Alternative für das Array. Allerdings werde ich das Recordset hier nicht vollständig vorstellen, dazu ist es zu umfangreich. Das Recodset wird zumeist für Datenbanken verwendet. Ich werde ein gesondertes Kapitel für Datenbank erstellen, indem das Recordset vorgestellt wird.
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<% @ Language="VBScript" %>
<% Option Explicit %>
<%
'Recordset initialisieren und Objekt erstellen
Dim rs, ArtikelNr
Const adVarChar = 200
Const adFldMayBeNull = &H00000040
set rs = Server.CreateObject("ADODB.Recordset")

'Recordset-Felder erstellen
rs.fields.Append "ArtikelNr", adVarChar, 6, adFldMayBeNull
rs.fields.Append "ArtikelName", adVarChar, 100, adFldMayBeNull
rs.fields.Append "Beschreibung", adVarChar, 500, adFldMayBeNull
rs.fields.Append "Preis", adVarChar, 5, adFldMayBeNull
rs.Open

'Erster Artikel eintragen
ArtikelNr="316936"
rs.AddNew
rs.fields("ArtikelNr").value = ArtikelNr
rs.fields("ArtikelName").value = "Workshop ASP"
rs.fields("Beschreibung").value = "Das ASPBuch für den ambitionierten Programmierer."
rs.fields("Preis").value = "35,00"
rs.UpdateBatch

'Zweiter Artikel eintragen
ArtikelNr="316554"
rs.AddNew
rs.fields("ArtikelNr").value = ArtikelNr
rs.fields("ArtikelName").value = "ASP Programmierung mit ADO"
rs.fields("Beschreibung").value = "Mit ADO professionelle Websites erstellen."
rs.fields("Preis").value = "60,00"
rs.UpdateBatch

'Erster Artikel suchen und ausgeben
ArtikelNr="316936"
rs.filter = "ArtikelNr = " & ArtikelNr
Response.Write("Erster Artikel:")
Response.Write("<br>ArtikelNr: " & rs.fields("ArtikelNr").value)
Response.Write("<br>ArtikelName:" & rs.fields("ArtikelName").value)
Response.Write("<br>Beschreibung:" & rs.fields("Beschreibung").value)
Response.Write("<br>Preis:" & rs.fields("Preis").value)

'Zweiter Artikel ausgeben
ArtikelNr="316554"
Response.Write("<br><br>Zweiter Artikel:")
Response.Write("<br>ArtikelNr: " & rs.fields("ArtikelNr").value)
Response.Write("<br>ArtikelName:" & rs.fields("ArtikelName").value)
Response.Write("<br>Beschreibung:" & rs.fields("Beschreibung").value)
Response.Write("<br>Preis:" & rs.fields("Preis").value)

'Recordset schliessen und zerstören
rs.Close
set rs = nothing
%>

In den Zeilen 6 + 7 werden 2 ADO-Konstanten verwendet. Diese Konstanten beinhalten einen Dezimalen bzw. Hexadezimalen Wert. Für viele Parameter wird ein dezimaler/hexadezimaler Wert verwendet. Da sich der Mensch Worte besser als numerische Werte merken kann, werden statt numerische Werte enstprechende Worte verwendet. Die gesamten ADO-Konstanten stehen in der Datei "ADOVBS.inc", diese Datei finden Sie im Ordner "Programme/Gemeinsame Dateien/System/ADO. Wie Sie diese Datei in Ihre ASP-Seiten inkludieren können, und wann, möchte ich Ihnen später erklären. In der Zeile 8 wird das Recordset erstellt. Bitte beachten Sie hierbei, eine möglichst aktuelle ADO-Version auf Ihrem Rechner zu haben. ADO ist in der Datei mdac enthalten, diese können Sie sich von Microsoft herunterladen, Links hierzu finden Sie auf meiner Seite "Links und Verweise".

In den Zeilen 11-15 werden die Recorset-Felder erstellt. Also jene Felder, welche die Artikeldaten speichern werden. Durch die Anweisung "open", wie in der Zeile 15, wird das Recorset geöffnet, womit Daten in das Recordset geschrieben werden können. In den Zeilen 19 - 33 werden Daten in das Recordset geschrieben. Zuerst muss dem Recordset mitgeteilt werden, daß nun ein neuer Datensatz in das Recordset geschrieben werden soll. In den nachfolgen 4 Zeilen werden die Daten in das jeweilige Recordset-Feld geschrieben. Anschliessend muss dem Recordset mitgeteilt werden, daß der Datensatz im Recordset gespeichert werden kann, dies erfolgt durch die Anweisung UpdateBatch.

Nun folgt die Ausgabe der Daten. Aber welcher Artikel zuerst? Das Recodset bietet hier mehrere Möglichkeiten, eine hiervon ist die Filter-Funktion. Dabei kann nach einer bestimmten Alphanumersichen Zeichenfolge in jedem Recordset-Feld gesucht werden. Somit kann als Suchindex jedes Recordsetfeld verwendet werden. Eine weitere Möglichkeit ist eine Sortierfunktion, dabei kann die Ausgabe der Inhalte nach einem vorbestimmten Feld auf- oder absteigend erfolgen. Beispiel hierfür: <% rs.sort = "ArtikelNr ASC" %> ASC steht für ascending, aufsteigend. Der Parameter DESC=descending, absteigend kann ebenfalls verwendet weden.

Natürlich: Hier bietet sich eine Schleife an, z.B. eine DoWhile-Schleife, aber das kommt erst später! Als letztes muss das Recordset geschlossen und vernichtet werden. Lt. Microsoft wird dies automatisch durch die VBScript-Engine durchgeführt, aber die Praxis sagt da manchmal etwas anderes aus.


Zurück  |  Vor

top top
© Copyright By Klaus Keller, 2001-2008 - Alle Rechte vorbehalten.