Geschrieben von: Alexander Zeitler
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Umfragen sind ein einfaches aber hilfreiches Tool, wenn es darum geht, etwas über die Wünsche und Verhaltensweisen von Besuchern auf einer Webseite zu erfahren. Die möglichen Einsatzgebiete sind vielfältig. Wir wollen uns heute mit der Programmierung einer Umfrage beschäftigen, die uns die fünf am häufigsten besuchten Webseiten liefert.
Außerdem erstellen wir uns eine Administrationsseite, auf der wir mühelos alle Parameter und Einträge steuern können.
Betrachten wir zunächst ein mögliches Ergebnis, wie unsere Umfrage zu Beginn aussehen könnte:
Der Aufbau der Umfrage ist relativ einfach gestaltet. Außer einer frei definierbaren Frage werden die in der Datenbank befindlichen Webseiten sowie der Betreiber gelistet. Weiterhin sieht man ein Diagramm, das die bisherige Stimmenvergabe prozentual darstellt, gefolgt von der absoluten Stimmenzahl je Webseite und deren Prozentsatz. Was natürlich auch nicht fehlen darf ist das Radio-Feld, das uns die Stimmabgabe überhaupt erst ermöglicht.
Unterhalb dieser Werte ist die Anzahl der bisher insgesamt abgegeben Stimmen (optional) sowie das End-Datum der Umfrage angegeben.
Die oben gewählte Darstellungsweise ist zwar sehr auskunftsfreudig, hat allerdings zwei Nachteile. Zum einen wird für diese Darstellung relativ viel Platz benötigt, zum anderen ist es für die Besucher wegen der dargestellten Zwischenergebnisse möglich, das Endergebnis zu beeinflussen. Deshalb sollte es also möglich sein, die Umfrage den individuellen Sicherheits- und Platzanforderungen anzupassen - und dies in allen drei Phasen (Umfrage vor der Wahl, Benutzer hat gewählt, Ende der Umfrage) der Umfrage.
In der obigen Grafik nicht zu sehen, aber dennoch variabel konfigurierbar soll auch die Anzahl der dargestellten Webseiten sein, die ab dem Ende der Umfrage angezeigt werden. In unserem Fall wären das also 5.
Aus unseren soeben gewonnenen Anforderungen ergibt sich somit, daß wir zwei Tabellen in der Datenbank benötigen: vote und vote_parameter. Beide Tabellen sind in der MS Access Datenbank vote.mdb gespeichert, die auch dem heutigen Download beiliegt.
Die Struktur der Tabelle vote
Die Struktur der Tabelle vote_parameter
Kommen wir nun zur Umsetzung unserer Vorstellungen. Zunächst müssen wir überprüfen, ob sich in der Tabelle vote_parameter überhaupt Werte befinden. Ist diese Tabelle leer, würden wir die Umfrage anstelle einer Frage mit einer für den Benutzer undefinierbaren Fehlermeldung beginnen. Wir benötigen diese Prüfung - wie fast den gesamten Code - für jeweils alle drei Zustände der Umfrage, die ich hier noch einmal genau definieren möchte:
Aus dieser Tatsache heraus ergibt es sich, daß wir sinnvoller Weise einen Großteil des Codes in Prozeduren und Funktionen auslagern und diese dann mit dem jeweiligen Zustand (Status) aufrufen.
Wenden wir uns nun der Überprüfung, ob überhaupt Parameter vorhanden sind, zu. Um das Ergebnis der Überprüfung abfragen zu können, erstellen wir diese als Funktion mit dem Namen Check_Parameter:
Function Check_Parameter strSQL = "SELECT * FROM Vote_Parameter" Set rs = Conn.Execute(strSQL) If rs.Eof Then Check_Parameter = False Else Check_Parameter = True End If rs.Close Set rs = Nothing End Function
Die Funktionsweise ist schnell erklärt. Wir erstellen ein RecordSet und überprüfen, ob dieses leer ist - ist dies der Fall, liefert die Funktion das Ergebnis False zurück, sonst logischerweise True. Aufgerufen wird diese Funktion mit einer If-Abfrage, worauf wir aber später noch gezielt eingehen werden.
Es folgt nun eine weitere Überprüfung der Parameter: ist die Umfrage beendet? Hierzu verwenden wir wiederum eine Funktion: Check_Ende, welche zu gegebener Zeit auch durch eine If-Abfrage aktiviert wird.
Function Check_Ende strSQL = "SELECT Ende FROM Vote_Parameter" Set rs = Conn.Execute(strSQL) If rs.Fields("Ende").Value <= ServerNow() Then Check_Ende = True Else Check_Ende = False End If rs.Close Set rs = Nothing End Function
Nach einer Prüfung des Enddatums in der Tabelle vote_parameter gegen das Datum aus der Funktion ServerNow werden der Funktion entsprechend die Werte True (Umfrage ist beendet) oder False (Umfrage läuft noch) zugewiesen.
Die Funktion ServerNow dient dazu, um eventuell vorhandene Zeitunterschiede bei amerikanischen (oder allg. ausländischen) Servern auszugleichen. Hierzu ist anstelle der 0 der entsprechende Zeitunterschied in Stunden einzutragen.
Function ServerNow() ServerNow = DateAdd("h", 0, Now()) End Function
Kommen wir jetzt zur Darstellung der Kopfzeile. Auch diese variiert in Abhängigkeit vom Status, weswegen wir sie als Prozedur Zeige_Header implementieren. Beim Aufruf dieser Prozedur wird der aktuelle Status übergeben, welcher sich in der Variable strStatus befindet.
Sub Zeige_Header(strStatus) rsHeader = strStatus & "_Header" strSQL = "SELECT " strSQL = strSQL & rsHeader strSQL = strSQL & " FROM Vote_Parameter" Set rs = Conn.Execute(strSQL) Response.Write "<td>" Response.Write rs(0) Response.Write "</td>" & vbCrLf rs.close Set rs = Nothing End Sub
In das Recordset greife ich mit dem Index des Feldes, das ich auslesen will. Da nur eine Spalte durch die SELECT Abfrage retourniert wird, ist das der Index 0. Der Vorteil ist, daß Zugriffe mittels Index schneller sind als mit Name.
Die in strStatus befindlichen Werte bzw. Strings sind bei näherer Betrachtung identisch mit den Präfixen (standard etc.) der Parameter in der Tabelle Vote_Parameter - der Grund hierfür wird gleich ersichtlich, wenn wir uns die Prozedur Erzeuge_Eintraege ansehen:
Sub Erzeuge_Eintraege (strStatus) rsDiagramm = strStatus & "_Diagramm" rsAnzahl = strStatus & "_Anzahl" rsProzent = strStatus & "_Prozent" rsVote = strStatus & "_Vote" strSQL = "SELECT " & rsDiagramm & "," & rsAnzahl & "," & rsProzent & "," strSQL = strSQL & rsVote & " FROM Vote_Parameter" Set rs = Conn.Execute(strSQL) brsDiagramm = rs(0) brsAnzahl = rs(1) brsProzent = rs(2) brsVote = rs(3) rs.Close Set rs = Nothing Zeige_Eintraege brsDiagramm, brsAnzahl, brsProzent, brsVote, strStatus End Sub
Der an die Prozedur übergebene String strStatus wird vor der Erzeugung eines Recordsets mit den jeweiligen Suffixen ("_Diagramm" etc.) der Spaltennamen verknüpft. Hieraus wird der den SQL-String erzeugt und ausgeführt. Die Ergebnisse dieser Abfrage werden dann lokalen Variablen zugeordnet, sodaß wir das Recordset bereits vor Aufruf der Prozedur Zeige_Eintraege schließen können. Danach wird die Prozedur Zeige_Eintraege mit den jetzt lokalen True- und False-Werten (aus der Tabelle Vote_Parameter) und dem aktuellen Status (strStatus) aufgerufen:
Sub Zeige_Eintraege(bDiagramm, bAnzahl, bProzent, bVote,strStatus) Response.Write "<table border=""0"" width=""100%"" cellpadding=""0"" cellspacing=""0"">" & vbCrLf Response.Write "<form action=""vote.asp"" method=""post"">" & vbCrLf Response.Write "<tr>" & vbCrLf Response.Write "<td bgcolor=""#808080"">Homepage</td>" & vbCrLf Response.Write "<td bgcolor=""#808080""> Betreiber</td>" & vbCrLf If bDiagramm=True Then Response.Write "<td bgcolor=""#808080""> Diagramm</td>" & vbCrLf End If If bAnzahl = True Then Response.Write "<td bgcolor=""#808080""> Anzahl</td>" & vbCrLf End If If bProzent=True Then Response.Write "<td bgcolor=""#808080""> Prozent</td>" & vbCrLf End If If bVote=True Then Response.Write "<td bgcolor=""#808080""> Ihre Stimme</td>" & vbCrLf End If If strStatus <> "ende" Then strSQL = "SELECT * FROM Vote ORDER BY Homepage" Else strSQLEnde = "SELECT * FROM Vote_Parameter" Set rsende = Conn.Execute(strSQLEnde) strSQL = "SELECT TOP " strSQL = strSQL & rsende("Ende_Eintraege") strSQL = strSQL & " * FROM Vote ORDER BY Anzahl DESC" End If Set rs = Conn.Execute(strSQL) Do While Not rs.Eof Response.Write "<tr>" & vbCrLf Response.Write "<td>" & rs("Homepage") & "</td>" & vbCrLf Response.Write "<td> " & rs("Betreiber") & "</td>" & vbCrLf If bDiagramm=True Then Response.Write "<td> " intProzente=Zeige_Prozent(rs("Anzahl")) Zeige_Diagramm(intProzente) Response.Write "</td>" & vbCrLf End If If bAnzahl=True Then Response.Write "<td align=""right""> " & rs("Anzahl") & "</td>" & vbCrLf End If If bProzent=True Then Response.Write "<td align=""right""> " & Zeige_Prozent(rs("Anzahl")) Response.Write "%</td>" & vbCrLf End If If bVote=True Then Response.Write "<td align=""center"">" Response.Write "<input type=""radio"" name=""id"" value=""" & rs("Id") Response.Write """></td>" & vbCrLf End If Response.Write "</tr>" & vbCrLf rs.MoveNext Loop Response.Write "</table>" & vbCrLf rs.Close Set rs = Nothing End Sub
Zunächst wird die Kopfzeile der Tabelle generiert. Für die Felder Homepage und Betreiber gibt es keine Einschränkungen, sehr wohl aber für die restlichen Felder. Hier kommen die übergebenen Booleschen Werte bDiagramm, bAnzahl, bProzent, bVote zum tragen. Durch Auswertungen mit If-Abfragen wird festgelegt, ob die Spalten angezeigt werden sollen oder nicht.
Direkt im Anschluß wird der String strStatus ausgewertet - enthält dieser nicht den Eintrag ende, so wird der SQL-String zur Anzeige aller Einträge sortiert nach der Homepage generiert. Ist der Eintrag jedoch ende, so wird zunächst aus der Tabelle Vote_Parameter die Anzahl der anzuzeigenden Datensätze (Ende_Eintraege) ermittelt. Danach wird eine TOP-Abfrage mit eben dieser Anzahl erstellt. In der Folge werden alle der Abfrage entsprechenden Datensätze angezeigt und natürlich werden auch hier nochmals die Booleschen Werte ausgewertet, um die anzuzeigenden Spalten festzulegen.
Bei den Abfragen für die Spalten Diagramm und Prozent werden wiederum Prozeduren bzw. Funktionen mit Parametern aufgerufen, die die entsprechenden Arbeiten erledigen.
Betrachten wir zuerst die Funktion Zeige_Prozent, da diese auch die Grundlage für die Prozedur Zeige_Diagramm bildet:
Function Zeige_Prozent(intAnzahl) strSQL = "SELECT Sum(Anzahl) AS SumOfAnzahl FROM vote" Set rs = Conn.Execute(strSQL) intGesamt = rs("SumOfAnzahl") intProzent = Round(intAnzahl/intGesamt*100,1) Zeige_Prozent = intProzent rs.close Set rs = Nothing End Function
Zunächst wird die Anzahl aller bisher abgegebenen Stimmen ermittelt. Diese wird dann mit der übergebenen Stimmenzahl (intAnzahl) zu einem Prozentsatz verrechnet, der als Ergebnis der Funktion zurückgegeben wird.
Wie bereits erwähnt, wird aus den nun ermittelten Prozentsätzen das Diagramm mit Hilfe der Funktion Zeige_Diagramm erzeugt:
Sub Zeige_Diagramm(intProzente) Balken = Prozentsatz Pixel breit sBalkenBreite = intProzente wBalkenBreite = (100 - sBalkenBreite) Response.Write "<img src=""diagramm_s.gif"" width=""" & sBalkenBreite & """ height=""6"" border=""0"" alt=""" & Round(intProzente,1) & "%"">" Response.Write "<img src=""diagramm_w.gif"" width=""" & wBalkenBreite & """ height=""6"" border=""0"" alt=""" & Round(intProzente,1) & "%"">" End Sub
In einer Schleife von 1 bis 100 (für 100%) wird überprüft, ob der übergebene Prozentsatz (intProzente) kleiner oder gleich dem aktuellen Zählerwert ist. Ist dies der Fall, so wird ein schwarzer Strich dargestellt. Alle Werte über dem Prozentsatz ergeben einen weißen Strich, was im Gesamtergebnis zu unserem Balkendiagramm führt.
Was uns jetzt noch fehlt, ist die zum Status passende Fußzeile. Auch das überlassen wir einer Prozedur, der wir den Status übergeben:
Sub Zeige_Footer (strStatus) strSQL = "SELECT * FROM Vote_Parameter" Set rs = Conn.Execute(strSQL) Record_Gesamt = strStatus & "_Gesamt" If rs(Record_Gesamt) = True Then strSQL1 = "SELECT Sum(Anzahl) AS SumOfAnzahl FROM vote" Set rs1 = Conn.Execute(strSQL1) intGesamt = rs1("SumOfAnzahl") rs1.Close Set rs1 = Nothing If strStatus <> "ende" Then Response.Write "Bisher abgegebene Stimmen: " & intGesamt & "<br>" Response.Write "Die Umfrage endet am " & rs("ende") Else Response.Write "Insgesamt abgegebene Stimmen: " & intGesamt End If Else Response.Write "Die Umfrage endet am " & rs("Ende") End If rs.Close Set rs = Nothing End Sub
Nachdem wir aus dem String strStatus und dem Suffix _Gesamt die korrekte Bezeichnung des Recordsets erhalten haben, prüfen wir diesen, ob die Gesamtzahl aller Stimmen angezeigt werden soll oder nicht. Ist die Prüfung positiv, so ermitteln wir wie schon bei den Prozentsätzen die Gesamtzahl der abgegebenen Stimmen aus der Tabelle vote. Danach wird geprüft, ob die Umfrage beendet ist. Ist dies der Fall, so wird der Text "Insgesamt abgegebene Stimmen" ausgegeben, sonst erhalten wir "Bisher abegebene Stimmen" und den Hinweis auf das Enddatum der Umfrage. War die erste Prüfung negativ, so lassen wir nur das Enddatum der Umfrage ausgeben.
Was uns jetzt noch fehlt, ist der Programmteil, der die ganzen Funktionen und Prozeduren aufruft (default.asp):
<!--#include file="strconn.asp"--> <% If Check_Parameter = False Then Response.Write "<tr>" & vbCrLf Response.Write "<td>" Response.Write "Keine Parameter vorhanden - überprüfen Sie Ihre Datenbank" Response.Write "</td>" & vbCrLf Response.Write "</tr>" & vbCrLf Else If Check_Ende = True Then Session("status") = "ende" strStatus = Session("status") If strStatus = "" Then strStatus="standard" Response.Write "<tr>" Zeige_Header strStatus Response.Write "</tr>" & vbCrLf Response.Write "<tr>" & vbCrLf Response.Write "<td>" Erzeuge_Eintraege strStatus Response.Write "</td>" & vbCrLf Response.Write "</tr>" & vbCrLf Response.Write "<tr>" & vbCrLf Response.Write "<td align=""right"">" If strStatus = "standard" Then Response.Write "<input type=""submit"" value=""wählen!"">" Else Response.Write " " End If Response.Write "</td>" & vbCrLf Response.Write "</form></tr>" & vbCrLf Response.Write "<tr>" & vbCrLf Response.Write "<td>" Zeige_Footer strStatus Response.Write "</td>" & vbCrLf Response.Write "</tr>" & vbCrLf End If Conn.Close Set Conn = Nothing %>
Das Caching wird für diese - wie auch alle anderen Dateien - deaktiviert, um immer aktuelle Werte zu erhalten:
Response.Expires=0 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control", "no-store"
Die Verbindung zur Datenbank benötigen wir in mehreren Dateien, weswegen sie in eigene Datei (strconn.asp) ausgelagert wird. Das hat den Vorteil, daß eventuelle Änderungen nur einmal für alle ASP-Dateien ausgeführt werden muß. Der Inhalt der Datei strconn.asp:
Set Conn = Server.CreateObject("ADODB.Connection") strConn = "Driver={Microsoft Access Driver (*.mdb)};DriverID=25;DBQ=" strConn = strConn & Server.MapPath("vote.mdb") strConn = strConn & ";FIL=MS Access;MaxBufferSize=512;PageTimeout=5;" Conn.Open strConn
Kommen wir zurück zur Anzeige unserer Umfrage.
Zunächst prüfen wir durch den Aufruf der Funktion Check_Parameter, ob Parameter für die Umfrage in der Datenbank vorhanden sind - ist dies nicht der Fall, brechen wir die Ausgabe mit einer Fehlermeldung ab. Andernfalls fahren wir mit der Prüfung Check_Ende fort und erzeugen entsprechend dem Ergebnis die Sessionvariable status. Deren Inhalt wird dann zum korrekten Status strStatus weiterverarbeitet. Mit eben diesem lassen wir dann die Einträge der Umfrage anzeigen (Erzeuge_Eintraege). Außerdem stellen wir anhand des Status' fest, ob der "wählen"-Button angezeigt werden darf oder nicht. Zu guter letzt lassen wir noch die Fußzeile generieren.
Somit sind wir mit dem Anzeigen der Umfrage fertig und können uns dem zuwenden, was nach einem Klick auf die Radio-Felder und den "wählen"-Button passiert: dem Schreiben der Einträge...
Die vom Benutzer getroffene Auswahl wird an die Seite vote.asp übergeben. Die Auswertung dieser Auswahl geschieht im folgenden:
<% Response.Expires=0 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control", "no-store" Response.Buffer = True Id = Request.Form("id") If id = "" Then Response.Redirect("default.asp") Response.End End If Session("status")="gewaehlt" %> <!-- Datenbank-Verbindung herstellen --> <!--#include file="strconn.asp"--> <% SQL = "UPDATE vote SET anzahl = anzahl + 1 WHERE id = " & id & "" Conn.Execute(SQL) Response.Redirect("default.asp")
Zunächst wird geprüft, ob überhaupt eine Webseite angeklickt wurde. Falls nicht (Id ist leer) wird der Benutzer umgehend auf die Umfrage-Seite zurückgeleitet. Enthält "Id" jedoch einen Wert, so wird nach dem Abschalten des Cachings die Verbindung zur Datenbank hergestellt und anschließend der Wert in der Spalte "Anzahl" der Tabelle Vote_Parameter um den Wert 1 erhöht. Außerdem wird die Sessionvariable status auf den Inhalt "gewaehlt" gestellt, was nach der Umleitung auf die Datei default.asp zu den entsprechenden Aktionen führt.
Somit ist auch dieser Teil der Umfrage erklärt und die Umfrage bereits voll einsatzfähig. Allerdings ist es sehr mühselig und auch fehlerträchtig, die Parameter und Einträge in der Datenbank händisch zu erstellen. Was liegt also näher, als eine Administrationsoberfläche zu programmieren, die diese Arbeiten erheblich erleicht?
Da wir bereits im zweiten Teil des Artikels Erstellung eines Newstickers in ASP eine komfortable Administrationssseite erstellt haben, greifen wir auf diese zurück und modifizieren sie entsprechend unseren neuen Anforderungen. Hier zunächst der obere Abschnitt der Administration mit den Einträgen:
Im Vergleich zu der bestehenden Administration wurde der Anzeigeteil leicht modifiziert, so daß nur noch die Datenfelder "Homepage" und "Betreiber" angezeigt werden. Der Code hierzu befindet sich in den Zeilen 116 - 144 der Datei admin.asp. Die genaue Beschreibung zur Technik finden Sie in dem besagten Artikel. Der Test, ob ein Eintrag in der Liste gewählt wurde - mittels JavaScript - bleibt bestehen.
Zunächst wieder das Ergebnis der Anzeige:
Die Administration der Umfrage-Parameter weicht (zumindest optisch) erheblich von der Administration der Newsticker-Parameter ab. So wird jetzt eine Funktion zum Einstellen des Enddatums verwendet. Diese ist uns allerdings bereits bekannt - sie befand sich bisher in der Datei logik.asp in den Zeilen 353 - 395 - einzig der Code zur Anzeige der Stunden und Minuten wurde entfernt. Eine Überprüfung des Datums durch ein JavaScript ist nicht notwendig, da die Verwendung der Dropdown-Felder immer ein Datum produziert.
Die Anzahl der am Ende angezeigten Einträge ist technisch zu behandeln wie die Parameter des Newstickers. Auch die Überprüfung mittels JavaScript gestaltet sich identisch.
Absolut neu hingegen sind die Checkboxen. Diese sind jedoch leicht aus der Datenbank mittels If-Abfragen zu generieren. Ein Beispiel, welches für alle anderen Checkboxen in allen Zuständen gilt, finden Sie in Zeile 229 der Datei admin.asp. Ist der Boolesche Wert in der Datenbank True, wird die Checkbox mit dem Schlüsselwort CHECKED versehen. Falls nicht, bleibt die Checkbox unmarkiert. Eine JavaScript-Prüfung entfällt, da die Entscheidungsfreiheit über markiert oder nicht markiert bei Ihnen liegt.
Ebenfalls neu sind die mehrzeiligen Eingabefelder (Textareas) zur Eingabe der Kopfzeilen. Doch auch deren Umsetzung bereitet uns keine Kopfschmerzen. Wie einfach sich die technische Umsetzung gestaltet, sehen Sie zum Beispiel in der Zeile 250. Auch die JavaScript-Prüfung in den Zeilen 62 - 65 ist kein Hexenwerk mehr.
Somit ist die Anzeige der Einträge sowie Parameter der Umfrage in der Administration bereits abgeschlossen und wir können uns dem Erstellen, Ändern und Löschen der Einträge sowie der Parameter-Änderung widmen.
Das Formular für die Erfassung neuer Homepages für die Umfrage ist auf zwei Felder geschrumpft:
Entsprechend einfach ist der Code geworden, der zur Speicherung der neuen Einträge notwendig ist (Zeilen 99 - 182 in logik.asp) und bei fehlerfreier Eingabe zu folgendem Ergebnis führt:
Ebenso wurden die Befehle für das Ändern und Löschen von Einträgen angepasst. Sie befinden sich in den Zeilen 183 - 324 (ändern und Änderungen speichern) und in den Zeilen 326 - 346 (Löschen von Einträgen).
Der Code (Zeilen 369 - 769) für das Speichern der geänderten Parameter wurde durch die größere Anzahl an Formularfelder etwas umfangreicher - keinesfalls aber schwieriger. Nach dem Einlesen aller Parameter in den Zeilen 6 - 28, werden in den Zeilen 374 - 388 die Checkboxen ausgewertet. Danach werden sämtliche Parameter in der Datenbank upgedatet. Der übrige Code ist nur noch für die Ausgabe der Bestätigung, daß die Daten korrekt gespeichert wurden, zuständig.
Somit sind wir am Ende des Artikels angekommen. Natürlich ist die hier vorgestellte Umfrage beliebig erweiterbar. So könnten Sie daraus zum Beispiel leicht ein Bewertungssystem für Ihre Homepage programmieren. Eine weitere Möglichkeit wäre auch, daß Sie die Umfrage dahingehend erweitern, daß nur eine Wahl je Benutzer getroffen werden kann, sei es durch eine Benutzerverwaltung oder den Einsatz von Cookies.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010417.zip
Caching bei Browser und Proxy - Woher Seiten wirklich kommen
http:/www.aspheute.com/artikel/19990808.htm
Erstellung eines Newstickers in ASP
http:/www.aspheute.com/artikel/20001205.htm
Erstellung eines Newstickers in ASP - Teil 2
http:/www.aspheute.com/artikel/20010209.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.