Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Optimiertes Erstellen von DropDowns

Geschrieben von: Stephan Troxler
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Das Problem tritt überall dort auf, wo überlange Dropdownmenüs mit Dutzenden, ja vielleicht sogar Hunderten von Einträgen aus einer Datenbank gelesen und aufbereitet werden. Durch die enorme Datenmenge, welche normalerweise über ein Recordset abgearbeitet und HTML-konform aufbereitet werden muss, verzögert sich der Seitenaufbau schnell einmal um einige Sekunden. Das muss nicht sein! Dieser Artikel zeigt einen cleveren Weg auf, wie mittels weniger Tricks der grösste Teil der Arbeit der Datenbank überlassen wird.

Es war einmal

Nehmen wir als Beispiel ein Dropdown welches alle Ländernamen der Welt auflistet, wie man es häufig im Web antrifft. Die Daten sind in einer Datenbanktabelle "countries" abgelegt, die Spalte mit dem Ländernamen heisst "name" und diejenige mit dem dazugehörigen Länderkürzel "code". Das Ganze sieht in etwa wie folgt aus:

countries
name code
Sweden se
Switzerland ch
Taiwan tw
... ...

Um dem Benutzer das Ausfüllen der Seite abzunehmen, wollen wir anhand seiner Spracheinstellungen aus dem Browser zusätzlich noch dynamisch den Eintrag seines Landes vorselektieren. Den ermittelten Ländercode haben wir dazu in einer lokalen Variablen "selectedcountry" abgelegt.

Das Unheil nimmt seinen Lauf

Im Normalfall würden wir das Länder-Dropdownmenu nun in etwa so generieren:

HTML-Code...
<select name="mydropdown">
<%
Datenbankverbindung öffnen, Recorset (RS) erstellen
...
While not RS.EOF
if RS("code") = selectedcountry then
	myselect = "selected"
else
	myselectd = ""
end if 
%>
<option value="<% =RS("code") %>" <% =myselect %>><% =RS("name")%></option>
<%
wend
%>
</select>
HTML-Code...

Aufwendig ist an dieser Methode einerseits die Vermischung zwischen ASP- und HTML-Code und andererseits die Schleife, welche jedes Element des Recordsets behandelt und mit dem vorgegebenen Ländercode vergleicht. Dieses Vorgehen lässt sich zugegebenermassen noch geringfügig optimieren, in dem der ganze HTML-Code zunächst serverseitig generiert, und dann an einem Stück ausgegeben wird. Unter dem Strich bleibt aber die Schleife über alle Elemente des Recordsets, welche bei grösseren Aufzählungen enorm an der Performance der Seite nagt. Folglich muss genau hier angesetzt werden.

Alle auf einen Streich

Was als ersten Schritt liegt näher, als uns den ganzen späteren HTML-Code bereits in der Abfrage generieren zu lassen? Die nachfolgende SELECT Abfrage zeigt, wie man geschickt den HTML-Code, samt Selektierung des richtigen Landes ins Recordset einfliessen lassen kann.

Beispiel für Access:

SELECT '<option value=""' + Cstr(code) + '""' + 
	iif(Cstr(code)=Cstr(" & myselect & "),' selected ','') + 
	'>' + name + '</option>' FROM countries ORDER BY name

Beispiel für MS SQL Server:

SELECT '<option value=""' + code + '""' + CASE ID WHEN '" & myselect & "' THEN 
	' selected' ELSE '' END + '>' + name + '</option>' 
	FROM countries ORDER BY name

Drei Sachen machen die obenstehenden SQL-Statements speziell:

Dropdown aus dem Sack

Nach dem Absetzen des SQL-Befehls bekommen wir nun also ein Recordset mit nur einer Spalte zurück, in welcher der fertige HTML-Code des Dropdownmenus abgebildet ist. Doch wie lesen wir dieses nun geschickt aus?

Das Zauberwort ist GetString, eine Methode des Recordset-Objekts welches uns den ganzen Inhalt als String zurückliefert, wie wir ihn für die Ausgabe im HTML-Code brauchen. Das überarbeitete Beispiel sieht dann in etwa wie folgt aus:

HTML-Code...
<select name="mydropdown">
<%
Datenbankverbindung öffnen, Recorset (RS) erstellen
..
Response.Write(RS.GetString)
%>
</select>
HTML-Code...

Schlußbemerkung

Der Artikel zeit, wie man mit der richtigen Kombination aus Datenbeschaffung und der optimalen Nutzung von VB-Script auch aus klassischem ASP immer wieder einiges herausholen kann. Wenn man den ganzen Zugriff in eine Funktion packt, sind bestehende ASP-Seiten schnell überarbeitet und der einen oder anderen Applikation kann so nochmals etwas Vorschub gegeben werden.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20040901.zip

Verwandte Artikel

Auto-Generierung von performantem Abfragecode
http:/www.aspheute.com/artikel/20010329.htm
Datensätze zufällig sortieren
http:/www.aspheute.com/artikel/20010130.htm
Die SQL ORDER BY Clause
http:/www.aspheute.com/artikel/20001201.htm
Highspeed-Abfragen einer SQL Server Datenbank
http:/www.aspheute.com/artikel/20001013.htm
Records zählen mit Stored Procedures
http:/www.aspheute.com/artikel/20010326.htm
Sprache des Benutzers erkennen
http:/www.aspheute.com/artikel/20001004.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.