{"id":55000510,"date":"2007-10-01T00:00:00","date_gmt":"2021-02-11T21:18:28","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=510"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Onlineumfragen_mit_Access_HTML_und_PHP","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/","title":{"rendered":"Onlineumfragen mit Access, HTML und PHP"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>&#8222;Onlineumfragen Mit Access Access ist doch eine Desktopdatenbankanwendung!&#8220; &#8211; Ja, Sie haben Recht. Access ist ja auch nur ein Teil der in diesem Beitrag beschriebenen L&ouml;sung, daf&uuml;r aber auch der wichtigste. Die hier vorgestellte L&ouml;sung speichert die Fragen, erstellt die HTML-Seiten zum Abfragen und wertet die Antworten aus &#8211; wenn das kein Multitasking ist. Aber schauen Sie doch einfach selbst &#8230;<\/b><\/p>\n<p>An einer Onlineumfrage hat sicher jeder von Ihnen schon einmal mitgewirkt, und wenn er auch nur angeklickt hat, dass Deutschland seiner Meinung nach 2008 Europameister im Fu&szlig;ball wird. Diese L&ouml;sung hier besch&auml;ftigt sich allerdings mit etwas aufwendigeren Exemplaren der Gattung Onlineumfrage.<\/p>\n<p>Bevor es an die technischen Details geht, hier erst einmal ein &uuml;berblick dar&uuml;ber, was Sie auf den n&auml;chsten Seiten erwartet: Eine Umfrage besteht aus mehreren Fragen, die der Teilnehmer beantworten muss. Diese sind mehr oder weniger komplex: Manche erwarten die Eingabe eines Texts, manche die Auswahl einer oder mehreren Optionen aus einer bestimmten Menge von M&ouml;glichkeiten, und es gibt auch Fragen, die einfach nur mit Ja oder Nein zu beantworten sind.<\/p>\n<p>Die erste Aufgabe der L&ouml;sung dieses Beitrags ist die Abbildung der Fragen, ihres Typs sowie der m&ouml;glichen Antworten in einer passenden Tabellenstruktur. Die zweite Aufgabe h&auml;ngt mit der Pr&auml;sentation der Umfrage im Internet zusammen: Dazu ist HTML-Code notwendig, der von der Datenbankanwendung automatisch auf Basis der enthaltenen Fragen und Antworten erstellt werden soll.<\/p>\n<p>Der dritte und letzte Teil betrifft schlie&szlig;lich die Aufbereitung der gesammelten Daten f&uuml;r die Auswertung: Dabei sollen die vom Teilnehmer beantworteten Fragen vom Webserver per Mail an den Auftraggeber gesendet und zur Auswertung in passende Tabellen geschrieben werden.<\/p>\n<p>Das Versenden per E-Mail vom Webserver aus setzt das Vorhandensein von Webspace mit der M&ouml;glichkeit, PHP-Dateien auszuf&uuml;hren, voraus. Das ist aber mittlerweile bei den meisten Anbietern der Fall.<\/p>\n<p><b>Umfrage-Datenmodell<\/b><\/p>\n<p>Die wichtigste Aufgabe ist wie &uuml;blich das Aust&uuml;fteln eines tragf&auml;higen Datenmodells, was sich in diesem Falle als nicht unbedingt einfach erweist.<\/p>\n<p>Schauen wir einmal, was alles in das Datenmodell einflie&szlig;en soll: Zuoberst steht die Umfrage, von der es mehr als eine geben soll. Damit steht schon einmal au&szlig;er Frage, dass es eine passende Tabelle namens <b>tblUmfragen <\/b>gibt &#8211; in diesem Fall auf das Notwendigste reduziert und somit lediglich aus zwei Feldern namens <b>ID <\/b>und <b>Bezeichnung <\/b>bestehend.<\/p>\n<p>Hier k&ouml;nnen Sie sich sp&auml;ter austoben und weitere Daten wie den Zeitraum der Umfrage, den tieferen Sinn und vieles mehr unterbringen.<\/p>\n<p>Jede Umfrage besteht aus einer oder mehreren Fragen. Das Anlegen einer passenden Tabelle scheint nahe zu liegen, das Fremdschl&uuml;sselfeld zur Herstellung einer Beziehung zur Tabelle <b>tblUmfragen<\/b> ist ebenfalls absehbar. Des Weiteren wird diese Tabelle den Text der Frage enthalten und &#8211; was f&uuml;r das sp&auml;tere Handling nicht unwichtig ist &#8211; ein Zahlenfeld zum Festlegen der Reihenfolge der Fragen.<\/p>\n<p>Dann geht es schon ans Eingemachte: Wie sehen denn die Antworten auf die Fragen aus Schauen wir mal:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Am einfachsten sind Fragen, die nur eine Antwort und keine Auswahlm&ouml;glichkeiten anbieten &#8211; die Antwort besteht also aus einem reinen Text, das verantwortliche Steuerelement wird ein Textfeld sein.<\/li>\n<li class=\"aufz-hlung\">Alle weiteren Fragen sind Fragen mit Auswahlm&ouml;glichkeiten, wobei diese hier wohl eine Ausnahme ist: die klassische Ja\/Nein-Frage. Es gibt zwei feste Antworten, die sich als Kontrollk&auml;stchen darstellen lassen.<\/li>\n<li class=\"aufz-hlung\">Alle &uuml;brigen Auswahlfragen (oder auch Multiple-Choice-Fragen) haben zwei oder mehr m&ouml;gliche Antworten, die je nach Frage variieren k&ouml;nnen. Auch diese unterteilt man: in eine Sorte, die nur eine Antwort zul&auml;sst &#8230;<\/li>\n<li class=\"aufz-hlung\">&#8230; und eine weitere, die mehrere Antworten erlaubt, wobei auch &#8222;keine Antwort&#8220; eine Alternative ist.<\/li>\n<\/ul>\n<p>Das scheint f&uuml;r den menschlichen Verstand nicht besonders kompliziert zu sein, aber wenn man ein Datenmodell auf diesen Varianten aufbauen m&ouml;chte, muss man zumindest kurz nachdenken. Um eines klarzustellen: Hier geht es zun&auml;chst einmal nur um die Abbildung der Fragen und der m&ouml;glichen Antworten, um die Speicherung der tats&auml;chlichen Antworten k&uuml;mmern wir uns sp&auml;ter.<\/p>\n<p>Auf den ersten Blick braucht man f&uuml;r Fragen, die einen Freitext als Antwort erwarten, gar nichts weiter zu tun, f&uuml;r Fragen mit Ja\/Nein-Antworten prinzipiell auch nicht; nur die M&ouml;glichkeiten f&uuml;r die Fragen mit beliebig vielen Antworten m&uuml;ssen gespeichert werden &#8211; und zwar in einer verkn&uuml;pften Tabelle, die etwa den Namen <b>tblAntworten<\/b> tr&auml;gt. Diese besitzt neben dem Prim&auml;rschl&uuml;sselfeld <b>ID <\/b>noch ein Fremdschl&uuml;sselfeld namens <b>FrageID <\/b>sowie das Textfeld <b>Antwort <\/b>und &#8211; genau wie die Tabelle mit den Fragen &#8211; ein Feld zum Speichern der Reihenfolge bei der Anzeige der Antworten.<\/p>\n<p>So weit, so gut: In der Tabelle <b>tblFragen<\/b> m&uuml;ssen Sie aber nun noch irgendwie kenntlich machen, welchem der vier Fragentypen die Frage denn nun geh&ouml;rt. Also f&uuml;gen Sie noch ein Feld namens <b>FragentypID <\/b>hinzu und legen gleich noch die notwendige Tabelle <b>tblFragentypen <\/b>mit den beiden Feldern <b>ID <\/b>und <b>Fragentyp <\/b>an. Gef&uuml;llt mit den soeben ermittelten Fragentypen sieht die Tabelle dann wie in Bild 1 aus.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic001_opt.jpeg\" alt=\"pic001.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Tabelle tblFragentypen<\/span><\/b><\/p>\n<\/div>\n<p><b>&#8230; und die Antworten<\/b><\/p>\n<p>Das Wichtigste beim Herleiten eines Datenmodells ist, dass man es m&ouml;glichst erst komplett fertig stellt und sich erst dann an darauf aufbauende Elemente begibt. Sonst stellt man n&auml;mlich sp&auml;ter fest, dass man das Datenmodell und alle darauf aufbauenden Elemente nochmals anpassen muss, nur weil man zu Beginn schludrig gearbeitet hat.<\/p>\n<p>In diesem Fall fehlt beispielsweise noch etwas ganz Wichtiges, was sich gegebenenfalls auf die &uuml;brigen Tabellen auswirken k&ouml;nnte: n&auml;mlich die Antworten der Teilnehmer an der Umfrage.<\/p>\n<p>Au&szlig;erdem sollte man mit Umfragen vergleichbare Tests wie etwa Multiple-Choice-Tests oder &auml;hnliche denken.<\/p>\n<p>Wie also bringen wir die Antworten der Teilnehmer einer Umfrage in der Datenbank unter Oder, um ein wenig tiefer anzusetzen, wo finden die Teilnehmer selbst eigentlich Platz Eine gute Idee ist es immer, reale Objekte wie Artikel, Kunden und so weiter in je einer eigenen Tabelle unterzubringen. Also verwenden Sie f&uuml;r die Teilnehmer eine weitere Tabelle namens <b>tblTeilnehmer<\/b>, die in diesem Fall zun&auml;chst die Felder <b>ID<\/b>, <b>Vorname<\/b>, <b>Nachname <\/b>und <b>Teilnahmedatum <\/b>aufnehmen soll.<\/p>\n<p>Und nun zu den Antworten der hier gespeicherten Teilnehmer: Klar ist, dass es &uuml;blicherweise mindestens eine Antwort jedes Teilnehmers zu jeder Frage geben muss, gegebenenfalls sogar einmal keine. Da es aber auch mehrere sein k&ouml;nnen, bietet sich eine Tabelle an, die Teilnehmer und Fragen miteinander verkn&uuml;pft und zus&auml;tzlich die Antworten speichert.<\/p>\n<p>Aber wie soll man mit den Antworten umgehen, wenn diese mal als reine Texte daherkommen, mal als Antwort auf eine Ja\/Nein-Frage und mal als eine der in der Tabelle <b>tblAntworten <\/b>vorgegebenen Antworten<\/p>\n<p>Man k&ouml;nnte es sich einfach machen und eine unsaubere L&ouml;sung w&auml;hlen, indem man in der Tabelle (nennen wir sie <b>tblTeilnehmerFragenAntworten<\/b>) sowohl vorsieht, Kombinationen aus Fremdschl&uuml;sselfeldern mit Bezug auf die Tabellen mit den Teilnehmern, Fragen und Antworten zu speichern, als auch die M&ouml;glichkeit bietet, reine Textantworten in einem separaten Feld zu speichern. Das z&ouml;ge nach sich, dass bei einem Teil der Fragen, n&auml;mlich bei denen mit Textantworten, kein Verweis auf einen Datensatz der Tabelle <b>tblAntworten<\/b> erfolgen w&uuml;rde. Anderenfalls w&uuml;rde bei allen Fragen, die keine Textantwort erwarten, das Textfeld mit der Antwort leer bleiben.<\/p>\n<p>Besonders ung&uuml;nstig ist dies, da man in der Tabelle <b>tblTeilnehmerFragenAntworten <\/b>&uuml;blicherweise einen eindeutigen Index &uuml;ber die drei Felder <b>TeilnehmerID<\/b>, <b>FrageID <\/b>und <b>AntwortID <\/b>legen w&uuml;rde, um zu verhindern, dass eine der Kombinationen mehrfach gespeichert wird. Dies lie&szlig;e sich aber aushebeln, wenn eines der Felder einfach leer bleibt &#8211; die Kombination <b>TeilnehmerID = 1 <\/b>und <b>FrageID = 1 <\/b>k&ouml;nnte also mehrfach auftreten, wenn nur das Feld <b>AntwortID <\/b>keinen Wert aufweist.<\/p>\n<p>Damit der zusammengesetzte Index trotzdem zieht, k&ouml;nnte man die Textantworten anderweitig speichern: Und zwar als neue Antwort in der Tabelle <b>tblAntworten<\/b>, die man dann ordnungsgem&auml;&szlig; mit der Tabelle <b>tblTeilnehmerFragenAntworten <\/b>verkn&uuml;pft. Man m&uuml;sste nur einen Weg finden, dass die so im Laufe der Umfrage zu dieser Tabelle hinzugef&uuml;gten Antworten nicht mit den eigentlich vorgesehenen Antworten vermischt werden und eine Frage mit einer reinen Textantwort pl&ouml;tzlich mehrere Antworten bereitstellt.<\/p>\n<p>Aber auch dies ist relativ einfach zu bewerkstelligen: Man l&auml;sst im Gegensatz zu den Auswahlantworten einfach das Feld <b>Reihenfolge <\/b>in der Tabelle <b>tblAntworten <\/b>leer.<\/p>\n<p>Bild 2 zeigt somit das vollst&auml;ndige Datenmodell, das allen g&auml;ngigen Regeln entspricht, aber bei der anschlie&szlig;enden Programmierung der Benutzeroberfl&auml;che einige Aufmerksamkeit erfordert.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic003_opt.jpeg\" alt=\"pic003.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 2: Das Datenmodell der Onlineumfrage-Datenbank<\/span><\/b><\/p>\n<\/div>\n<p><b>Umfragen anlegen<\/b><\/p>\n<p>Die Umfragen mit ihren Fragen und Antworten sollen m&ouml;glichst &uuml;bersichtlich dargestellt werden. Im Gegensatz zu manch anderem Anwendungszweck, bei dem Detaildaten wie die eines zu einem Projekt zugeordneten Kunden gerne in Popupformularen erscheinen, soll hier ein Formular die Umfrage, die Fragen sowie die Antworten zur jeweils markierten Frage auf einen Blick anzeigen. Beim Wechseln der Frage sollen auch die angezeigten Antworten aktualisiert werden.<\/p>\n<p>Dies funktioniert mit einem Hauptformular, das an die Haupttabelle, hier <b>tblUmfragen<\/b>, gebunden ist und in zwei Unterformularen die Fragen und die Antworten anzeigt.<\/p>\n<p>Die Synchronisierung der beiden Unterformulare erfolgt hierbei &uuml;ber ein Textfeld im Hauptformular, das die <b>ID <\/b>der aktuell im ersten Unterformular aktivierten Frage enth&auml;lt. Das zweite Unterformular mit den Antworten wird schlie&szlig;lich mit dem Inhalt dieses Textfelds synchronisiert.<\/p>\n<p>Im ersten Entwurf sieht das Formular zum Eingeben der Umfragen, Fragen und Antworten zun&auml;chst einmal wie in Bild 3 aus. Die beiden Unterformulare <b>frmFragen <\/b>und <b>frmAntworten<\/b> sind an die Tabellen <b>tblFragen <\/b>und <b>tblAntworten <\/b>gebunden. Das Unterformular <b>frmFragen <\/b>ist &uuml;ber das Feld <b>UmfrageID <\/b>an das Feld <b>ID <\/b>des Hauptformulars gebunden.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic004_opt.jpeg\" alt=\"pic004.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 3: Entwurfsansicht des Formulars zum Eingeben von Umfragen, Fragen und Antworten<\/span><\/b><\/p>\n<\/div>\n<p>Im Unterformular <b>frmFragen <\/b>gibt es eine Routine, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird &#8211; also beim ersten Anzeigen, beim Wechseln und auch beim L&ouml;schen eines Datensatzes. Diese sorgt daf&uuml;r, dass das Textfeld <b>txtFrageID <\/b>des Hauptformulars immer die <b>ID <\/b>der im Formular <b>frmFragen <\/b>aktiven Frage enth&auml;lt:<\/p>\n<pre>Private Sub Form_Current()\r\n Me.Parent.txtFrageID = Me.ID\r\nEnd Sub<\/pre>\n<p>Dieses Textfeld k&ouml;nnen Sie nat&uuml;rlich ausblenden, es soll f&uuml;r den Benutzer nicht zu sehen sein. Damit das Unterformular <b>frmAntworten <\/b>auch nur die Antworten zur aktuell im Formular <b>frmFragen <\/b>anzeigt, stellen Sie nun dessen Eigenschaft <b>Verkn&uuml;pfen von <\/b>auf das Feld <b>FrageID <\/b>und <b>Verkn&uuml;pfen nach <\/b>auf <b>txtFrageID <\/b>ein.<\/p>\n<p><b>Umfragen anlegen<\/b><\/p>\n<p>In Aktion sieht das Formular <b>frmUmfragen <\/b>wie in Bild 4 aus. Das linke Unterformular enth&auml;lt bereits eine Reihe von Fragen, das rechte zeigt die f&uuml;r die aktuell ausgew&auml;hlte Frage angelegten Antworten an. Mit dem Feld <b>FragetypID <\/b>l&auml;sst sich festlegen, ob die Frage eine Text-, Ja\/Nein-, Einfach- oder Mehrfachauswahlfrage ist. Die Eingabem&ouml;glichkeit f&uuml;r die m&ouml;glichen Antworten beeinflusst dies nicht, allerdings werden diese nur bei Fragen des Typs Einfach- oder Mehrfachauswahl ber&uuml;cksichtigt.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic005_opt.jpeg\" alt=\"pic005.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 4: Das Umfrage-Eingabeformular in Aktion &#8211; hier bei der Eingabe einer Frage mit Mehrfachauswahl<\/span><\/b><\/p>\n<\/div>\n<p><b>Von Access ins Web<\/b><\/p>\n<p>Ein Werkzeug zum Anlegen der Umfragen mit Fragen und Antworten haben Sie nun. Aber auf welchem Wege bringt man die Fragen nun zum Benutzer Sicher ist: Sie k&ouml;nnten leicht einen Bericht erstellen, der die hier angegebenen Fragen zu Papier bringt, aber die Erfassung der zur&uuml;cklaufenden Daten ist auf diesem Wege doch recht m&uuml;&szlig;ig.<\/p>\n<p>Wie in der &uuml;berschrift dieses Beitrags angedeutet, sind HTML und PHP mit im Spiel und damit ist die Richtung klar: Die Ver&ouml;ffentlichung der Umfrage erfolgt online, und zwar im Internet in Form eines geeigneten Formulars.<\/p>\n<p>Um dieses zusammenzustellen, m&uuml;ssen Sie kein Zauberer sein &#8211; die Syntax ist recht einfach. Betrachten wir das Formular aus Bild 5, das die Fragen und Antworten aus Bild 4 repr&auml;sentiert. F&uuml;r jede der vier Fragetypen gibt es ein bestimmtes HTML-Ger&uuml;st, dessen Gesamtheit von einigen weiteren Elementen eingefasst wird, die wie folgt aussehen:<\/p>\n<pre>&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\"&gt;\r\n&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" &gt;\r\n&lt;head&gt;\r\n  &lt;title&gt;Umfrage: Umfrage 2&lt;\/title&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n   &lt;form action=\"umfrageGesendet.php\"<br \/> method=\"post\"&gt;\r\n     &lt;table&gt;\r\n       ... eigentliche Umfrage-Elemente ...\r\n     &lt;\/table&gt;\r\n     &lt;input type=\"submit\" value=\"Absenden\"\/&gt;\r\n   &lt;\/form&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic006_opt.jpeg\" alt=\"pic006.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 5: Die HTML-Umfrage mit den Fragen und Antworten der in Bild 4 erstellten Umfrage <\/span><\/b><\/p>\n<\/div>\n<p>Dieses Gebilde enth&auml;lt die &uuml;blichen f&uuml;r eine <br \/>HTML-Seite notwendigen Informationen sowie einen Teil des Codes f&uuml;r die Anzeige des Formulars: n&auml;mlich das &ouml;ffnende und schlie&szlig;ende <b>form<\/b>-Tag sowie den &auml;u&szlig;eren Rahmen f&uuml;r die enthaltene Tabelle (<b>table<\/b>).<\/p>\n<p>Diese dient hier als einfaches Mittel, die einzelnen Elemente sauber anzuordnen. Das <b>form<\/b>-Tag definiert ein Formular, das eines oder mehrere Steuerelemente enth&auml;lt, deren Inhalt nach dem Absenden des Formulars vom Empf&auml;nger ausgewertet werden kann.<\/p>\n<p>In diesem Fall ist der Empf&auml;nger eine PHP-Seite und der Inhalt wird mit der <b>post<\/b>-Methode weitergeleitet:<\/p>\n<pre>&lt;form action=\"umfrageGesendet.php\" method=\"post\"&gt;<\/pre>\n<p>Das bedeutet schlicht und einfach, dass die Formularfelder und deren Inhalte mit der durch das Absenden des Formulars erzeugten Anfrage versendet werden (die Alternative w&auml;re die <b>get<\/b>-Methode &#8211; hier werden die Informationen als Teil des URL versendet).<\/p>\n<p>Nun brauchen Sie nur noch f&uuml;r jeden der vier Fragetypen die passende HTML-Definition. Schauen Sie sich einfach die HTML-Datei aus Bild 5 an. Die Syntax f&uuml;r das dort abgebildete einfache Textfeld sieht beispielsweise so aus:<\/p>\n<pre>&lt;tr&gt;\r\n &lt;td&gt;Vorname:&lt;\/td&gt;<br \/> &lt;td&gt;&lt;input type=\"text\" name=\"2_1_6_0\" \/&gt;&lt;\/td&gt;\r\n&lt;tr&gt;<\/pre>\n<p><b>&lt;tr&gt; <\/b>und <b>&lt;\/tr&gt; <\/b>definieren eine Zeile, <b>&lt;td&gt; <\/b>und <b>&lt;\/td&gt; <\/b>die einzelnen Spalten. Obige Definition liefert also eine Tabellenzeile mit zwei Feldern, von denen das linke die Frage und das rechte das f&uuml;r die Eingabe der Antwort notwendige Steuerelement enth&auml;lt &#8211; in diesem Fall ein <b>input<\/b>-Element des Typs <b>text <\/b>mit dem Namen <b>2_1_6_0<\/b>. Die Frage stammt direkt aus der Tabelle <b>tblFragen<\/b>, der Name <b>2_1_6_0<\/b> steht f&uuml;r Umfrage-ID <b>2<\/b>, den Fragentyp <b>1<\/b>, die Frage-ID <b>6<\/b> sowie die Zahl <b>0 <\/b>f&uuml;r die ausgew&auml;hlte Antwort, die ja hier nicht vorhanden ist &#8211; auf diese Weise k&ouml;nnen Sie die Antworten des Benutzers sp&auml;ter zuordnen.<\/p>\n<p><!--30percent--><\/p>\n<p>Ja\/Nein-Fragen soll der Benutzer durch das Aktivieren oder Deaktivieren eines Kontrollk&auml;stchens beantworten. Die Ja\/Nein-Frage aus dem Beispiel wird in HTML so dargestellt:<\/p>\n<pre>&lt;tr&gt;\r\n &lt;td&gt;Ich nehme gern an Umfragen teil!&lt;\/td&gt;<br \/> &lt;td&gt;&lt;input type=\"CheckBox\" name=\"2_2_10_0\"\/&gt;<br \/> &lt;\/td&gt;\r\n&lt;\/tr&gt;<\/pre>\n<p>Interessanter sind schon die Fragen mit mehreren Antworten. Solche, bei denen der Benutzer nur eine Antwort w&auml;hlen darf, bringen Sie in einem Kombinationsfeld unter. Dieses wird in HTML durch ein <b>select<\/b>-Element markiert, die einzelnen Eintr&auml;ge durch <b>option<\/b>-Elemente:<\/p>\n<pre>&lt;tr&gt;\r\n &lt;td&gt;Geschlecht:&lt;\/td&gt;\r\n &lt;td&gt;\r\n &lt;select name=\"2_3_9_0\"&gt;\r\n &lt;option value=\"0\"&gt;&amp;lt;Ausw&amp;aumlhlen&amp;gt;<br \/> &lt;\/option&gt;\r\n &lt;option value=\"1\"&gt;m&auml;nnlich&lt;\/option&gt;\r\n &lt;option value=\"2\"&gt;weiblich&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/td&gt;\r\n&lt;\/tr&gt;<\/pre>\n<p>Fehlen noch solche Elemente, die mehrere Antworten bieten, von denen der Benutzer mehr als eine ausw&auml;hlen kann. Unter Access k&ouml;nnte man hier ein Listenfeld mit Mehrfachauswahl einsetzen, unter HTML bieten sich einzelne Eintr&auml;ge mit je einem Kontrollk&auml;stchen an. Hier erh&auml;lt jede einzelne Antwort einen eigenen Namen wie etwa <b>2_4_11_20<\/b>, wobei der erste Wert die Umfrage-ID, der zweite den Fragentyp, der dritte die Frage und der vierte die Antwort repr&auml;sentiert:<\/p>\n<pre>&lt;tr&gt;\r\n &lt;td valign=\"Top\"&gt;Zu welchem Thema m&ouml;chten Sie<br \/> gern befragt werden&lt;\/td&gt;\r\n &lt;td&gt;\r\n &lt;input type=\"checkbox\" name=\"2_4_11_20\"&gt;<br \/> Datenbankprogrammierung&lt;\/option&gt;&lt;br&gt;\r\n &lt;input type=\"checkbox\" name=\"2_4_11_21\"&gt;<br \/> Excel-Tapeten-Erstellung&lt;\/option&gt;&lt;br&gt;\r\n &lt;input type=\"checkbox\" name=\"2_4_11_22\"&gt;<br \/> Word-Anf&auml;ngerprobleme&lt;\/option&gt;&lt;br&gt;\r\n &lt;\/td&gt;\r\n&lt;\/tr&gt;<\/pre>\n<p class=\"zwischen-berschriftnachquellcode\">Handarbeit Weit gefehlt!<\/p>\n<p>Keine Angst: Wer nun denkt, er m&uuml;sse nicht nur die Fragen und Antworten, sondern auch noch die passenden HTML-Formulare entwerfen, liegt falsch: Nat&uuml;rlich liefern wir eine Funktion mit, die ein HTML-Formular auf Basis der eingegebenen Fragen und Antworten liefert. Die passende Routine finden Sie in Listing 1, sie wird durch einen Klick auf die Schaltfl&auml;che <b>cmdHTMLSeiteErstellen <\/b>ausgel&ouml;st.<\/p>\n<div class=\"abbildung\">\n<p class=\"kastentabelleheader\">Listing 1: Erzeugen von HTML-Formularen auf Basis von Tabelleneintr&auml;gen<\/p>\n<pre>Private Sub cmdHTMLSeiteErstellen_Click()<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim db As DAO.Database<\/p>\n<pre>   Dim rstF As DAO.Recordset<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim rstA As DAO.Recordset<\/p>\n<pre>   Set db = CurrentDb<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Set rstF = db.OpenRecordset(&#8222;SELECT * FROM tblFragen WHERE UmfrageID = &#8220; &amp; Me.ID _<br \/> &amp; &#8220; AND Reihenfolge &gt; 0 ORDER BY Reihenfolge&#8220;, dbOpenDynaset)<\/p>\n<pre>   Open CurrentProject.Path &amp; \"\\Umfrage.html\" For Output As #1<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Print #1, &#8222;&lt;!DOCTYPE html PUBLIC &#8222;&#8220;-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN&#8220;&#8220; &#8220; _<br \/> &amp; &#8222;&#8220;&#8220;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd&#8220;&#8220;&gt;&#8220;<\/p>\n<pre>   Print #1, \"&lt;html xmlns=\"\"http:\/\/www.w3.org\/1999\/xhtml\"\" &gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Print #1, &#8222;&lt;head&gt;&#8220;<\/p>\n<pre>   Print #1, \"&lt;title&gt;Umfrage: \" &amp; Me!Bezeichnung &amp; \"&lt;\/title&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Print #1, &#8222;&lt;\/head&gt;&#8220;<\/p>\n<pre>   Print #1, \"&lt;body&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Print #1, &#8220; &lt;form action=&#8220;&#8220;umfrageGesendet.php&#8220;&#8220; method=&#8220;&#8220;post&#8220;&#8220;&gt;&#8220;<\/p>\n<pre>   Print #1, \" &lt;table&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Do While Not rstF.EOF<\/p>\n<pre>     Set rstA = db.OpenRecordset(\"SELECT * FROM tblAntworten WHERE FrageID = \" &amp; rstF!ID _<br \/> &amp; \" AND Reihenfolge &gt; 0 ORDER BY Reihenfolge\", dbOpenDynaset)<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     Select Case rstF!FragetypID<\/p>\n<pre>       Case 1<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;tr&gt;&#8220;<\/p>\n<pre>         Print #1, \" &lt;td&gt;\" &amp; rstF!Frage &amp; \"&lt;\/td&gt;&lt;td&gt;&lt;input type=\"\"text\"\" name=\"\"\" &amp; Me!ID &amp; \"_1_\" _<br \/> &amp; rstF!ID &amp; \"_0\"\" \/&gt;&lt;\/td&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;\/tr&gt;&#8220;<\/p>\n<pre>       Case 2<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;tr&gt;&#8220;<\/p>\n<pre>         Print #1, \" &lt;td&gt;\" &amp; rstF!Frage &amp; \"&lt;\/td&gt;&lt;td&gt;&lt;input type=\"\"CheckBox\"\" name=\"\"\" &amp; Me!ID _<br \/> &amp; \"_2_\" &amp; rstF!ID &amp; \"_0\"\"\/&gt;&lt;\/td&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;\/tr&gt;&#8220;<\/p>\n<pre>       Case 3<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;tr&gt;&#8220;<\/p>\n<pre>         Print #1, \" &lt;td&gt;\" &amp; rstF!Frage &amp; \"&lt;\/td&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;td&gt;&#8220;<\/p>\n<pre>         Print #1, \" &lt;select name=\"\"\" &amp; Me!ID &amp; \"_3_\" &amp; rstF!ID &amp; \"_0\"\"&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;option value=&#8220;&#8220;0&#8243;&#8220;&gt;&amp;lt;Ausw&amp;aumlhlen&amp;gt;&lt;\/option&gt;&#8220;<\/p>\n<pre>         Do While Not rstA.EOF<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>           Print #1, &#8220; &lt;option value=&#8220;&#8220;&#8220; &amp; rstA!ID &amp; &#8222;&#8220;&#8220;&gt;&#8220; &amp; rstA!Antwort &amp; &#8222;&lt;\/option&gt;&#8220;<\/p>\n<pre>           rstA.MoveNext<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Loop<\/p>\n<pre>         Print #1, \" &lt;\/select&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;\/td&gt;&#8220; &amp; vbcrlf &amp; &#8220; &lt;\/tr&gt;&#8220;<\/p>\n<pre>       Case 4<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;tr&gt;&#8220;<\/p>\n<pre>         Print #1, \" &lt;td valign=\"\"Top\"\"&gt;\" &amp; rstF!Frage &amp; \"&lt;\/td&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Print #1, &#8220; &lt;td&gt;&#8220;<\/p>\n<pre>         Do While Not rstA.EOF<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>           Print #1, &#8220; &lt;input type=&#8220;&#8220;checkbox&#8220;&#8220; name=&#8220;&#8220;&#8220; &amp; Me!ID &amp; &#8222;_4_&#8220; &amp; rstA!FrageID &amp; &#8222;_&#8220; _<br \/> &amp; rstA!ID &amp; &#8222;&#8220;&#8220;&gt;&#8220; &amp; rstA!Antwort &amp; &#8222;&lt;\/option&gt;&lt;br&gt;&#8220;<\/p>\n<pre>           rstA.MoveNext<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Loop<\/p>\n<pre>         Print #1, \" &lt;\/td&gt;\" &amp; vbcrlf &amp; \" &lt;\/tr&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     End Select<\/p>\n<pre>     rstF.MoveNext<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Loop<\/p>\n<pre>   Print #1, \" &lt;\/table&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Print #1, &#8220; &lt;input type=&#8220;&#8220;submit&#8220;&#8220; value=&#8220;&#8220;Absenden&#8220;&#8220;\/&gt;&#8220;<\/p>\n<pre>   Print #1, \" &lt;\/form&gt;\" &amp; vbcrlf &amp; \"&lt;\/body&gt;\" &amp; vbcrlf &amp; \"&lt;\/html&gt;\"<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Close #1<\/p>\n<pre>   rstA.Close<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   rstF.Close<\/p>\n<pre>   Set rstA = Nothing<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Set rstF = Nothing<\/p>\n<pre>   Set db = Nothing<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>End Sub<\/p>\n<\/div>\n<p>Die Prozedur bezieht sich jeweils auf die aktuell im Formular <b>frmUmfragen <\/b>angezeigte Umfrage und durchl&auml;uft die in den Unterformularen <b>frmFragen <\/b>und <b>frmAntworten <\/b>enthaltenen Fragen.<\/p>\n<p>Die Herleitung einer solchen Routine ist reine Flei&szlig;arbeit: Wenn Sie wissen, wie das HTML-Formular aussehen muss, um alle in den Tabellen gespeicherten Informationen anzeigen zu k&ouml;nnen, brauchen Sie nur noch die Tabelleninhalte mit den passenden HTML-Tags zu versehen und in geeignete Schleifen zu packen.<\/p>\n<p>Die Routine schreibt die fertige HTML-Datei &uuml;brigens unter dem Namen <b>Umfrage.html <\/b>in das Verzeichnis der Datenbankanwendung.<\/p>\n<p><b>PHP als Mailversender<\/b><\/p>\n<p>Wenn der Benutzer die Daten in das HTML-Formular eingetragen hat, fehlt nur noch der Transfer der Daten zum Rechner des Auftraggebers der Umfrage. Dies erledigt die in der HTML-Datei als Ziel des Formularinhalts angegebene PHP-Datei <b>umfrageGesendet.php<\/b> (s. Listing 2).<\/p>\n<div class=\"abbildung\">\n<p class=\"kastentabelleheader\">Listing 2: Die PHP-Datei umfrageGesendet.php nimmt die Formulardaten entgegen und verschickt diese per E-Mail zum Auftraggeber.<\/p>\n<pre>&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN\" <\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;> &#8222;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd&#8220;&gt;<\/p>\n<pre>&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" &gt;<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>&lt;head&gt;<\/p>\n<pre> &lt;title&gt;Umfrage gesendet&lt;\/title&gt;<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>&lt;\/head&gt;<\/p>\n<pre>&lt;body&gt;<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>&lt;php <\/p>\n<pre> while (list($key, $val) = each($HTTP_POST_VARS)) {<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;> $body .= &#8222;$key: $val\\n&#8220;;<\/p>\n<pre> }<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;> $header = &#8222;From: &#8222;Andre Minhorst&#8216; &lt;andre@minhorst.com&gt;\\n&#8220;;<\/p>\n<pre> $header .= \"X-Mailer: PHP-Version \" . PHP_VERSION . \"\\n\";<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;> mail(&#8222;andre@minhorst.com&#8220;, &#8222;Umfrageergebnis&#8220;, $body, $header);<\/p>\n<pre>&gt;<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>&lt;p&gt;Vielen Dank! Ihre Stimme wurde gez&auml;hlt.&lt;\/p&gt;<\/p>\n<pre>&lt;\/body&gt;<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>&lt;\/html&gt;<\/p>\n<\/div>\n<p>Die PHP-Datei enth&auml;lt einigen Zeilen HTML-Code zur Anzeige der Meldung, dass die Angaben erfolgreich erfasst werden konnten, sowie ein paar Skript-Zeilen im PHP-Format, die nur eines tun: Sie schreiben die in der Variablen <b>$HTTP_POST_VARS<\/b> entgegengenommenen Antworten in eine Mail, versehen diese mit einem Adressaten und schicken sie los.<\/p>\n<p><b>Auf den Server<\/b><\/p>\n<p>Die HTML- und die PHP-Datei legen Sie in das gew&uuml;nschte Verzeichnis auf einem Webserver, der neben der bereits eingangs erw&auml;hnten F&auml;higkeit zum Verarbeiten von PHP-Skripten auch Mails verschicken k&ouml;nnen sollte. Besitzer eines entsprechenden Servers oder auch nur von Webspace sollten wissen, wo sie die Dateien speichern k&ouml;nnen; anderenfalls fragen Sie einfach beim jeweiligen Provider an.<\/p>\n<p><b>Von der Mail in die Datenbank<\/b><\/p>\n<p>Nun fehlt noch ein Schritt: Die per Mail verschickten Antworten m&uuml;ssen an geeigneter Stelle in der Datenbank gespeichert werden.<\/p>\n<p>F&uuml;r die folgenden Schritte ist der Einsatz von Microsoft Outlook Voraussetzung; sollten Sie einen anderen Mail-Client verwenden, w&auml;ren dessen Automatisierungsm&ouml;glichkeiten zu pr&uuml;fen.<\/p>\n<p>Alternativ k&ouml;nnen Sie den Inhalt der betroffenen Mails m&ouml;glicherweise auch direkt aus dem Postfach auf dem Server in die Datenbank einlesen. Dies vertiefen wir an dieser Stelle jedoch nicht, sondern verweisen auf den Beitrag <b>E-Mails abrufen mit Access und POP3 <\/b>(Shortlink 239).<\/p>\n<p>&uuml;blicherweise landet eine Mail im Posteingang; zumindest gehen die folgenden Schritte davon aus.<\/p>\n<p>Sollten Sie die Umfrageantworten in einen anderen Ordner umleiten, m&uuml;ssen Sie dies entsprechend ber&uuml;cksichtigen.<\/p>\n<p>Ist die E-Mail angekommen, sieht diese in Outlook etwa so aus wie in Bild 6. Der Weg von der Mail in die Datenbank ist einfacher, als man vielleicht annimmt. Die Routinen aus Listing 3 erledigen dies: Die ersten drei sind lediglich Hilfsroutinen, die Verweise auf eine Outlook-Instanz, den MAPI-Namespace und schlie&szlig;lich den Mailordner liefern.<\/p>\n<div class=\"abbildung\">\n<p class=\"kastentabelleheader\">Listing 3: Der Inhalt einer Mail mit dem Umfrageergebnis l&auml;sst sich mit wenigen Zeilen VBA-Code in der Datenbank speichern.<\/p>\n<pre>Public Property Get GetOutlook() As Outlook.Application<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   If mOutlook Is Nothing Then<\/p>\n<pre>     Set mOutlook = CreateObject(\"Outlook.application\")<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   End If<\/p>\n<pre>   Set GetOutlook = mOutlook<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>End Property<\/p>\n<pre>Public Property Get GetMAPINamespace() As Outlook.NameSpace<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   If mMAPINamespace Is Nothing Then<\/p>\n<pre>     Set mMAPINamespace = GetOutlook.GetNamespace(\"MAPI\")<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   End If<\/p>\n<pre>   Set GetMAPINamespace = mMAPINamespace<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>End Property<\/p>\n<pre>Public Property Get GetMailFolder() As Outlook.Folder<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   If mMailfolder Is Nothing Then<\/p>\n<pre>     Set mMailfolder = GetMAPINamespace.GetDefaultFolder(olFolderInbox)<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   End If<\/p>\n<pre>   Set GetMailFolder = mMailfolder<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>End Property<\/p>\n<pre>Public Sub MailsEinlesen()<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim objMail As Outlook.MailItem<\/p>\n<pre>   Dim db As DAO.Database<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Set db = CurrentDb<\/p>\n<pre>   Set objMail = GetMailFolder.Items.Find(\"[Subject] = 'Umfrageergebnis'\")<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Do While Not objMail Is Nothing<\/p>\n<pre>     db.Execute \"INSERT INTO tblTeilnehmer(Teilnahmedatum, Ergebnis) \" _<br \/> &amp; \"VALUES(\" &amp; SQLDatum(objMail.SentOn) &amp; \"' '\" _<br \/> &amp; Trim(objMail.Body) &amp; \"')\", dbFailOnError<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     If db.RecordsAffected = 1 Then<\/p>\n<pre>       objMail.Delete<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     End If<\/p>\n<pre>     Set objMail = _<br \/> GetMailFolder.Items.Find(\"[Subject] = 'Umfrageergebnis''\")<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Loop<\/p>\n<pre>End Sub<\/pre>\n<p>\/div><\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic007_opt.jpeg\" alt=\"pic007.tif\" \/>\n<\/div>\n<div class=\"abbildung\">\n<p><b><span style=\"color:darkgrey\">Bild 6: Ein per E-Mail eingetroffenes Umfrageergebnis &#8211; hier in Outlook 2007<\/span><\/b><\/p>\n<\/div>\n<p>Die eigentliche Routine namens <b>MailsEinlesen<\/b> verwendet die <b>Find<\/b>-Methode der <b>Items<\/b>-Auflistung des Mailordners, um die erste Mail mit dem Betreff <b>Umfrageergebnis <\/b>zu finden. Ist sie erfolgreich, schreibt die Routine den Inhalt der Mail samt Teilnahmedatum in einen neuen Datensatz der Tabelle <b>tblTeilnehmer<\/b>.<\/p>\n<p>Ist dies erfolgreich, was durch das Ermitteln der von dieser Aktion betroffenen Anzahl Datens&auml;tze gepr&uuml;ft wird, l&ouml;scht die Routine die Mail und sucht die n&auml;chste Mail mit dem passenden Betreff. Diesen sollen Sie &uuml;brigens so w&auml;hlen, dass er nicht mit dem anderer E-Mails verwechselt werden kann, was aber nicht schwierig sein d&uuml;rfte.<\/p>\n<p><b>Antwort-Parser<\/b><\/p>\n<p>Nun folgt der H&auml;rtetest f&uuml;r das Datenmodell: Die empfangenen Umfrageergebnisse sollen aus den reinen Text-Nachrichten in verwertbarer Form in die Tabellen geschrieben werden. Sehr wichtig daf&uuml;r sind die Namen der Steuerelemente, die &uuml;blicherweise nach dem Muster <b>UmfrageID_FragentypID_FrageID_AntwortID <\/b>aufgebaut sind, wobei der letzte Teil nur bei Fragen mit der M&ouml;glichkeit, mehrere Antworten auszuw&auml;hlen, zum Einsatz kommt und sonst mit dem Wert <b>0 <\/b>belegt ist.<\/p>\n<p>Die Routine aus Listing 4 &uuml;bernimmt das Auslesen der Antworten und das Eintragen in die Tabelle <b>tblTeilnehmerFragenAntworten<\/b>.<\/p>\n<div class=\"abbildung\">\n<p class=\"kastentabelleheader\">Listing 4: Parsen der in Access gespeicherten Antworten<\/p>\n<pre>Public Sub ErgebnisParsen()<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim db As DAO.Database<\/p>\n<pre>   Dim rst As DAO.Recordset<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim strErgebnisse() As String<\/p>\n<pre>   Dim strInfos As String<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim strAntwort As String<\/p>\n<pre>   Dim intFragentyp As Integer<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim lngUmfrageID As Long<\/p>\n<pre>   Dim lngFrageID As Long<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim lngAntwortID As Long<\/p>\n<pre>   Dim lngTeilnehmerID As Long<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Dim i As Integer<\/p>\n<pre>   Set db = CurrentDb<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Set rst = db.OpenRecordset(&#8222;SELECT * FROM tblTeilnehmer WHERE Erfasst = False&#8220;, dbOpenDynaset)<\/p>\n<pre>   Do While Not rst.EOF<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     lngTeilnehmerID = rst!ID<\/p>\n<pre>     strErgebnisse = Split(rst!Ergebnis, vbCrLf)<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     For i = LBound(strErgebnisse) To UBound(strErgebnisse)<\/p>\n<pre>       If Len(strErgebnisse(i)) &gt; 0 Then<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         strInfos = Trim(Left(strErgebnisse(i), InStr(1, strErgebnisse(i), &#8222;:&#8220;) &#8211; 1))<\/p>\n<pre>         strAntwort = Trim(Mid(strErgebnisse(i), InStr(1, strErgebnisse(i), \":\") + 1))<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         lngUmfrageID = Split(strInfos, &#8222;_&#8220;)(0)<\/p>\n<pre>         intFragentyp = Split(strInfos, \"_\")(1)<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         lngFrageID = Split(strInfos, &#8222;_&#8220;)(2)<\/p>\n<pre>         lngAntwortID = Split(strInfos, \"_\")(3)<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>         Select Case intFragentyp<\/p>\n<pre>           Case 1, 2<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>             db.Execute &#8222;INSERT INTO tblAntworten(FrageID, Antwort, Reihenfolge) VALUES(&#8220; &amp; lngFrageID _<br \/> &amp; &#8222;&#8218; &#8218;&#8220; &amp; strAntwort &amp; &#8222;&#8218;, 0)&#8220;<\/p>\n<pre>             lngAntwortID = DLookup(\"ID\", \"tblAntworten\", \"FrageID = \" &amp; lngFrageID _<br \/> &amp; \" AND Antwort = '\" &amp; strAntwort &amp; \"'\")<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>             db.Execute &#8222;INSERT INTO tblTeilnehmerFragenAntworten(TeilnehmerID, FrageID, AntwortID)&#8220; _<br \/> &amp; &#8220; VALUES(&#8220; &amp; lngTeilnehmerID &amp; &#8222;, &#8220; &amp; lngFrageID &amp; &#8222;, &#8220; &amp; lngAntwortID &amp; &#8222;)&#8220;<\/p>\n<pre>           Case 3<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>             db.Execute &#8222;INSERT INTO tblTeilnehmerFragenAntworten(TeilnehmerID, FrageID, AntwortID)&#8220; _<br \/> &amp; &#8220; VALUES(&#8220; &amp; lngTeilnehmerID &amp; &#8222;, &#8220; &amp; lngFrageID &amp; &#8222;, &#8220; &amp; strAntwort &amp; &#8222;)&#8220;<\/p>\n<pre>           Case 4<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>             db.Execute &#8222;INSERT INTO tblTeilnehmerFragenAntworten(TeilnehmerID, FrageID, AntwortID)&#8220; _<br \/> &amp; &#8220; VALUES(&#8220; &amp; lngTeilnehmerID &amp; &#8222;, &#8220; &amp; lngFrageID &amp; &#8222;, &#8220; &amp; lngAntwortID &amp; &#8222;)&#8220;<\/p>\n<pre>         End Select<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>       End If<\/p>\n<pre>     Next i<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     rst.Edit<\/p>\n<pre>     rst!Erfasst = True<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>     rst.Update<\/p>\n<pre>     rst.MoveNext<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Loop<\/p>\n<pre>   rst.Close<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>   Set rst = Nothing<\/p>\n<pre>   Set db = Nothing<\/pre>\n<p>p class=&#8220;quellcode-funktionssammlung&#8220;>End Sub<\/p>\n<\/div>\n<p>Dabei &ouml;ffnet sie zun&auml;chst eine Datensatzgruppe, die alle Datens&auml;tze der Tabelle <b>tblTeilnehmer <\/b>enth&auml;lt, deren Feld <b>Erfasst <\/b>den Wert <b>False <\/b>aufweist. Der Wert dieses Feldes wird nach dem Erfassen auf <b>True <\/b>eingestellt, damit der gleiche Datensatz nicht zweimal erfasst wird.<\/p>\n<p>Nach dem Speichern der Teilnehmernummer in der Variablen <b>lngTeilnehmerID <\/b>sorgt die folgende Zeile daf&uuml;r, dass die einzelnen Zeilen des Ergebnisses in ein String-Array namens <b>strErgebnisse <\/b>geschrieben werden. Dabei hilft die <b>Split<\/b>-Funktion, welche die im ersten Parameter enthaltene Zeichenkette nach dem im zweiten Parameter als Trennzeichen angegebenen Zeichen durchsucht und aufteilt:<\/p>\n<pre>strErgebnisse = Split(rst!Ergebnis, vbCrLf)<\/pre>\n<p>Die folgende <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft die einzelnen Bestandteile dieses Arrays und zerlegt diese weiter. Wegen der gleichartigen Struktur der einzelnen Zeilen ist dies nicht allzu kompliziert. Bevor es richtig losgeht, filtert die folgende Zeile noch alle Elemente des Arrays aus, die leer sind:<\/p>\n<pre>If Len(strErgebnisse(i)) &gt; 0 Then<\/pre>\n<p>Dies ist notwendig, weil der in der Mail enthaltene Text jeweils eine f&uuml;hrende leere Zeile mitliefert.<\/p>\n<p>Anschlie&szlig;end teilt die Routine den Inhalt einer jeden Zeile zun&auml;chst in zwei Elemente auf: den ersten Teil, der nach dem Schema <b>x_x_x_x <\/b>aufgebaut ist (<b>strInfo<\/b>), und den zweiten Teil, der die eigentliche Antwort enth&auml;lt (<b>strAntwort<\/b>). Als Trennzeichen dient hierbei der Doppelpunkt.<\/p>\n<p>Der erste Teil besteht wiederum aus vier Elementen, die mit Hilfe der <b>Split<\/b>-Funktion in die vier Variablen <b>lngUmfrageID<\/b>, <b>intFragentyp<\/b>, <b>lngFrageID <\/b>und <b>lngAntwortID <\/b>geschrieben werden. Dabei wird das Ergebnis der <b>Split<\/b>-Funktion nicht erst in ein Array geschrieben, sondern die einzelnen Elemente werden &uuml;ber ihre Position wie in <b>Split(strInfos, &#8222;_&#8220;)(0) <\/b>direkt ausgelesen.<\/p>\n<p>Die folgende <b>Select Case<\/b>-Konstruktion behandelt die Elemente entsprechend dem in <b>intFragentyp <\/b>gespeicherten Fragentyp. Bei den beiden Fragetypen 3 und 4 hat der Benutzer entweder eine oder mehrere der zur Verf&uuml;gung stehenden Antworten ausgew&auml;hlt, was sich in der Tabelle <b>tblTeilnehmerFragenAntworten <\/b>durch einfaches &uuml;bernehmen der in den Variablen <b>lngTeilnehmerID<\/b>, <b>lngFrageID<\/b> und <b>strAntwort <\/b>beziehungsweise <b>lngAntwortID <\/b>ergibt.<\/p>\n<p>Die Antwort aus Bild 7 auf eine Frage des Typs 3 (Auswahl einer von mehreren m&ouml;glichen Antworten) schl&auml;gt sich beispielsweise in der folgenden Antwortzeile nieder:<\/p>\n<div class=\"abbildungrahmen\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic008_opt.jpeg\" alt=\"pic008.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 7: Frage mit der Auswahl einer von mehreren m&ouml;glichen Antworten<\/span><\/b><\/p>\n<\/div>\n<pre>2_3_9_0: 18<\/pre>\n<p>Das bedeutet, dass die Frage <b>9 <\/b>der Umfrage <b>2 <\/b>mit dem Fragentyp <b>3 <\/b>die Antwort mit der ID <b>18 <\/b>als Antwort liefert, was in entsprechender Form in die Tabelle <b>tblTeilnehmerFragenAntworten <\/b>eingetragen wird &#8211; wobei das letzte Element, also <b>18<\/b>, als Antwort-ID gespeichert wird.<\/p>\n<p>Fragen mit mehr als einer m&ouml;glichen Antwort sehen wie in Bild 8 aus.<\/p>\n<div class=\"abbildungrahmen\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic009_opt.jpeg\" alt=\"pic009.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 8: Frage mit der Auswahl einer oder mehrerer der verf&uuml;gbaren Antworten<\/span><\/b><\/p>\n<\/div>\n<p>Im Text der Antwortmail finden Sie dementsprechend direkt zwei Zeilen:<\/p>\n<pre>2_4_11_20: on\r\n2_4_11_22: on<\/pre>\n<p>Dies bedeutet, dass die Frage <b>11 <\/b>des Typs <b>4 <\/b>der Umfrage <b>2 <\/b>die Antworten <b>20 <\/b>und <b>22 <\/b>erhielt, was ebenfalls leicht in entsprechender Form in die Tabelle <b>tblTeilnehmerFragenAntworten <\/b>aufgenommen werden kann &#8211; hier z&auml;hlt der als vierter Parameter gelieferte Wert als Antwort, die eigentliche Antwort (<b>on<\/b>) kann vernachl&auml;ssigt werden.<\/p>\n<p>Etwas schwieriger gestaltet sich das Speichern der Antworten auf Fragen der &uuml;brigen Fragentypen. Ja\/Nein-Fragen wie in Bild 9 liefern zum Beispiel die folgende Zeile als Antwort:<\/p>\n<div class=\"abbildungrahmen\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic010_opt.jpeg\" alt=\"pic010.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 9: Frage, die nur mit Ja oder Nein beantwortet werden kann<\/span><\/b><\/p>\n<\/div>\n<pre>2_2_10_0: Nein<\/pre>\n<p>Das Problem hierbei ist, dass es in der Tabelle <b>tblAntworten<\/b> keinen passenden Eintrag gibt. Doch das ist nicht schlimm: Die Parser-Routine aus Listing 4 legt einfach einen passenden Datensatz in der Tabelle <b>tblAntworten <\/b>an:<\/p>\n<pre>db.Execute \"INSERT INTO tblAntworten<br \/>(FrageID, Antwort, Reihenfolge) <br \/>VALUES<br \/>(\" &amp; lngFrageID &amp; \"' '\" &amp; strAntwort &amp; \"', 0)\"<\/pre>\n<p>Die ID dieser Frage ermittelt dann die folgende Anweisung und weist sie der Variablen <b>lngAntwortID <\/b>zu:<\/p>\n<pre>lngAntwortID = DLookup(\"ID\", \"tblAntworten\", \"FrageID = \" &amp; lngFrageID <br \/>&amp; \" AND Antwort = '\" &amp; strAntwort &amp; \"'\")<\/pre>\n<p>Diese wird schlie&szlig;lich wie bei den Fragetypen 3 und 4 einfach mit den &uuml;brigen Daten in die Tabelle <b>tblTeilnehmerFragenAntworten <\/b>eingetragen:<\/p>\n<pre>db.Execute \"INSERT INTO <br \/>tblTeilnehmerFragenAntworten(TeilnehmerID, <br \/>FrageID, AntwortID)\" &amp; \" <br \/>VALUES(\" &amp; lngTeilnehmerID &amp; \", \" <br \/>&amp; lngFrageID &amp; \", \" &amp; lngAntwortID &amp; \")\"<\/pre>\n<p>Genauso sieht das auch bei Fragen aus, die eine reine Textantwort erwarten (siehe Bild 10). Es wird einfach f&uuml;r jede Antwort ein neuer Datensatz in der Tabelle <b>tblAntworten <\/b>angelegt, auf die dann das Feld <b>AntwortID <\/b>der Tabelle <b>tblTeilnehmerFragenAntworten <\/b>verweist.<\/p>\n<div class=\"abbildungrahmen\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic011_opt.jpeg\" alt=\"pic011.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 10: Frage mit einfacher Textantwort<\/span><\/b><\/p>\n<\/div>\n<p><b>Auswerten von Umfragen<\/b><\/p>\n<p>F&uuml;r die Auswertung einer Umfragen gibt es verschiedene M&ouml;glichkeiten, von denen einige einfache hier vorgestellt werden sollen.<\/p>\n<p>Die erste Darstellung soll zun&auml;chst einmal die Ergebnisse der einzelnen Teilnehmer widerspiegeln &#8211; immerhin sind diese derzeit &uuml;ber mehrere Tabellen verteilt und nicht nur f&uuml;r Otto Normalverbraucher &auml;u&szlig;erst schlecht lesbar. Sch&ouml;n w&auml;re also ein Bericht, der einfach die Fragen und die Antworten der einzelnen Teilnehmer aufzeigt &#8211; etwa so wie in Bild 11.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic013_opt.jpeg\" alt=\"pic013.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 12: Diese Abfrage liefert die f&uuml;r den Bericht aus Bild 11 ben&ouml;tigten Daten.<\/span><\/b><\/p>\n<\/div>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic012_opt.jpeg\" alt=\"pic012.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 11: Ausgabe der Antworten der einzelnen Teilnehmer in &uuml;bersichtlicher Berichtsform<\/span><\/b><\/p>\n<\/div>\n<p>Der Bericht ist schnell erstellt: Zun&auml;chst brauchen Sie eine Abfrage als Datenherkunft, die alle enthaltenen Felder liefert &#8211; auf Sortierungen brauchen Sie hier noch nicht zu achten, da diese ohnehin erst im Bericht eingestellt werden. Die Abfrage (siehe Bild 12) enth&auml;lt alle Tabellen der Datenbank mit Ausnahme der Tabelle <b>tblFragentypen<\/b>. Einige der Felder werden im Bericht nicht direkt zu sehen sein, liefern aber die Grundlage f&uuml;r die verschiedenen Gruppierungs- und Sortierungsebenen. Diese sorgen daf&uuml;r, dass zun&auml;chst nach der Umfrage und dann nach dem Teilnehmer sowie der Frage gruppiert wird &#8211; dazwischen befinden sich noch Sortierungen nach der Reihenfolge der Fragen sowie der Antworten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Gruppierung nach <b>tblUmfragen.UmfrageID <\/b>mit Kopfbereich<\/li>\n<li class=\"aufz-hlung\">Sortierung nach <b>tblTeilnehmer.Teilnahmedatum<\/b>, ohne Kopf- oder Fu&szlig;bereich<\/li>\n<li class=\"aufz-hlung\">Gruppierung nach <b>tblTeilnehmer.Teilnehmer <\/b>mit Kopfbereich zur Anzeige des Teilnahmedatums und zur optischen Unterteilung der einzelnen Umfrageergebnisse<\/li>\n<li class=\"aufz-hlung\">Gruppierung nach <b>tblFragen.FrageID <\/b>mit Fu&szlig;bereich zur Anzeige einer Trennlinie<\/li>\n<li class=\"aufz-hlung\">Sortierung nach <b>tblFragen.Reihenfolge <\/b>ohne Kopf- oder Fu&szlig;bereich<\/li>\n<li class=\"aufz-hlung\">Sortierung nach <b>tblAntworten.Reihenfolge <\/b>ohne Kopf- oder Fu&szlig;bereich<\/li>\n<\/ul>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic014_opt.jpeg\" alt=\"pic014.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 13: Entwurfsansicht des Berichts zur Anzeige der einzelnen Ergebnisse der Umfrage<\/span><\/b><\/p>\n<\/div>\n<p>Wenn Sie die Steuerelemente so wie in Bild 13 angeordnet haben, fehlt nur noch die Einstellung zweier Eigenschaften, um die Anzeige zu perfektionieren:<\/p>\n<p>Die Eigenschaft <b>Vergr&ouml;&szlig;erbar <\/b>der Felder <b>Frage <\/b>und <b>Antwort <\/b>im Detailbereich erh&auml;lt jeweils den Wert <b>Ja<\/b>, damit Fragen und Antworten, die mehr als eine Zeile zur Anzeige ben&ouml;tigen, umbrochen und in der Folgezeile fortgesetzt werden.<\/p>\n<p>Au&szlig;erdem sollten Sie die Eigenschaft <b>Duplikate ausblenden <\/b>des Feldes <b>Antwort <\/b>auf <b>Ja <\/b>einstellen.<\/p>\n<p>Dies wirkt sich auf die Darstellung von Fragen aus, f&uuml;r die der Benutzer mehrere Antworten angeben kann: Der Bericht gibt die Frage dann nur einmal aus und schreibt nur noch die weiteren Antworten in die folgenden Zeilen. Das ist beispielsweise in Bild 11 in der untersten Zeile gut zu erkennen.<\/p>\n<p><b>Quantitative Auswertung<\/b><\/p>\n<p>Wer eine Umfrage durchf&uuml;hrt, m&ouml;chte nat&uuml;rlich auch herausfinden, wie viele Teilnehmer sich f&uuml;r bestimmte Antworten entschieden haben. Auch hierzu k&ouml;nnen Sie einen einfachen Access-Bericht verwenden. Die Variante aus Bild 14 zeigt die vorhandenen Antworten zu jeder einzelnen Frage mit der passenden Anzahl an, was bei den unteren drei Fragen durchaus verwertbare Antworten liefert.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic015_opt.jpeg\" alt=\"pic015.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 14: <br \/>Entwurfsansicht des Berichts zur Anzeige der einzelnen <br \/>Ergebnisse der Umfrage<\/span><\/b><\/p>\n<\/div>\n<p>Die Abfrage, die als Grundlage f&uuml;r diesen Bericht dient, sieht wie in Bild 15 aus. Wichtig ist hier, dass Sie hier eine Gruppierung festlegen und die Anzahl der gleichen Antworten je Frage ermitteln, was in der Abfrage im letzten Feld erfolgt.<\/p>\n<div class=\"image\">\n<img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/OnlineumfragenMitAccess-web-images\/pic016_opt.jpeg\" alt=\"pic016.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 15: <br \/>Diese Abfrage liefert die Daten f&uuml;r den Bericht aus Bild 14. Wichtig ist hier die Festlegung einer Gruppierung &uuml;ber alle Felder mit Ausnahme des Feldes, das die Anzahl der gleichen Antworten je Frage liefert.<\/span><\/b><\/p>\n<\/div>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die hier vorgestellte L&ouml;sung zeigt, wie Sie f&uuml;r Umfragen mit bestimmten Fragetypen automatisch den HTML-Code f&uuml;r ein passendes Formular erzeugen und eine PHP-Seite einsetzen, um die im Formular ermittelten Antworten per E-Mail an eine bestimmte E-Mail-Adresse schicken zu lassen.<\/p>\n<p>Die Antworten werden nach einem einfachen Schema in einer weiteren Tabelle der Datenbank gespeichert und k&ouml;nnen von dort aus ausgewertet werden &#8211; etwa in der Einzelansicht, welche die Antworten der einzelnen Teilnehmer darstellt, oder in einer Ansicht, die das Ergebnis nach den Fragen gruppiert und die Anzahl der verschiedenen Antworten ausgibt.<\/p>\n<p>Die Anwendung l&auml;sst sich noch erheblich erweitern: Es lassen sich beispielsweise Berichte erzeugen, die das Ergebnis einzelner Fragen grafisch aufbereiten &#8211; etwa in Form eines Tortendiagramms.<\/p>\n<p>Mit wenigen Handgriffen l&auml;sst sich die Anwendung sogar in ein Tool umwandeln, mit dem Sie Tests online stellen k&ouml;nnen, die das Wissen der Teilnehmer in verschiedenen Bereichen abfragen:<\/p>\n<p>Sie m&uuml;ssen dazu lediglich die Tabellen so erweitern, dass die richtigen Ergebnisse gespeichert und mit den Antworten der Teilnehmer verglichen werden k&ouml;nnen.<\/p>\n<p>Die Anwendung l&auml;sst sich auch noch f&uuml;r andere Zwecke &#8222;aufbohren&#8220;: So k&ouml;nnten Sie eine Eingabemaske erstellen, um die Ergebnisse von Umfragen einzugeben, die auf anderen Medien wie etwa Papier gesammelt wurden. <\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Onlineumfrage.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/72FF0A82-8360-4264-9BDF-F086099B806B\/aiu_510.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8222;Onlineumfragen Mit Access Access ist doch eine Desktopdatenbankanwendung!&#8220; &#8211; Ja, Sie haben Recht. Access ist ja auch nur ein Teil der in diesem Beitrag beschriebenen L&ouml;sung, daf&uuml;r aber auch der wichtigste. Die hier vorgestellte L&ouml;sung speichert die Fragen, erstellt die HTML-Seiten zum Abfragen und wertet die Antworten aus &#8211; wenn das kein Multitasking ist. Aber schauen Sie doch einfach selbst &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662007,66052007,44000026,44000030,44000027,44000033],"tags":[],"class_list":["post-55000510","post","type-post","status-publish","format-standard","hentry","category-662007","category-66052007","category-Interaktiv","category-Internet","category-Loesungen","category-Outlook"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Onlineumfragen mit Access, HTML und PHP - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Onlineumfragen mit Access, HTML und PHP\" \/>\n<meta property=\"og:description\" content=\"&quot;Onlineumfragen Mit Access Access ist doch eine Desktopdatenbankanwendung!&quot; - Ja, Sie haben Recht. Access ist ja auch nur ein Teil der in diesem Beitrag beschriebenen L&ouml;sung, daf&uuml;r aber auch der wichtigste. Die hier vorgestellte L&ouml;sung speichert die Fragen, erstellt die HTML-Seiten zum Abfragen und wertet die Antworten aus - wenn das kein Multitasking ist. Aber schauen Sie doch einfach selbst ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:18:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"31\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Onlineumfragen mit Access, HTML und PHP\",\"datePublished\":\"2021-02-11T21:18:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/\"},\"wordCount\":5427,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/772a8b05e06b4334a9c0a532e5a05743\",\"articleSection\":[\"2007\",\"5\\\/2007\",\"Interaktiv\",\"Internet\",\"L\u00f6sungen\",\"Outlook\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/\",\"name\":\"Onlineumfragen mit Access, HTML und PHP - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/772a8b05e06b4334a9c0a532e5a05743\",\"datePublished\":\"2021-02-11T21:18:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/772a8b05e06b4334a9c0a532e5a05743\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/772a8b05e06b4334a9c0a532e5a05743\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlineumfragen_mit_Access_HTML_und_PHP\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Onlineumfragen mit Access, HTML und PHP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Onlineumfragen mit Access, HTML und PHP - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/","og_locale":"de_DE","og_type":"article","og_title":"Onlineumfragen mit Access, HTML und PHP","og_description":"\"Onlineumfragen Mit Access Access ist doch eine Desktopdatenbankanwendung!\" - Ja, Sie haben Recht. Access ist ja auch nur ein Teil der in diesem Beitrag beschriebenen L&ouml;sung, daf&uuml;r aber auch der wichtigste. Die hier vorgestellte L&ouml;sung speichert die Fragen, erstellt die HTML-Seiten zum Abfragen und wertet die Antworten aus - wenn das kein Multitasking ist. Aber schauen Sie doch einfach selbst ...","og_url":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:18:28+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"31\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Onlineumfragen mit Access, HTML und PHP","datePublished":"2021-02-11T21:18:28+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/"},"wordCount":5427,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743","articleSection":["2007","5\/2007","Interaktiv","Internet","L\u00f6sungen","Outlook"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/","url":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/","name":"Onlineumfragen mit Access, HTML und PHP - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743","datePublished":"2021-02-11T21:18:28+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/772a8b05e06b4334a9c0a532e5a05743"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Onlineumfragen_mit_Access_HTML_und_PHP\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Onlineumfragen mit Access, HTML und PHP"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000510"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000510\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}