{"id":55000791,"date":"2011-08-01T00:00:00","date_gmt":"2020-05-22T21:57:22","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=791"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tomatengetriebene_Programmierung","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/","title":{"rendered":"Tomatengetriebene Programmierung"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Haben Sie sich schon einmal von einer Tomate beim Programmieren antreiben lassen Falls nicht, haben wir vielleicht eine interessante Methode des Zeitmanagements f&uuml;r Sie. Nat&uuml;rlich nicht, ohne gleichzeitig eine entsprechende Datenbank zur Verwaltung der Ergebnisse zu pr&auml;sentieren. Wenn es Ihnen gef&auml;llt, arbeiten Sie vielleicht demn&auml;chst im 25-Minuten-Rythmus, und wenn nicht, k&ouml;nnen Sie vielleicht Ihre anderen T&auml;tigkeiten mit der hier vorgestellten Datenbank auswerten.<\/b><\/p>\n<p>Der Italiener Francesco Cirillo stellt auf seiner Webseite <b>www.pomodorotechnique.com<\/b> eine nicht ganz neue, aber sehr interessante Technik zum Zeitmanagement vor: die Pomorodo-Technik. F&uuml;r die Durchf&uuml;hrung dieser Technik brauchen Sie nicht viel:<\/p>\n<ul>\n<li class=\"aufz-hlung\">einen K&uuml;chenwecker, beispielsweise in Tomatenform,<\/li>\n<li class=\"aufz-hlung\">einen Bleistift,<\/li>\n<li class=\"aufz-hlung\">eine Liste aller zu erledigenden T&auml;tigkeiten,<\/li>\n<li class=\"aufz-hlung\">eine Liste der heute zu erledigenden T&auml;tigkeiten und<\/li>\n<li class=\"aufz-hlung\">eine M&ouml;glichkeit, die damit erfassten Daten sp&auml;ter auszuwerten.<\/li>\n<\/ul>\n<p>Der Anlass zur Verwendung dieser Technik ist, dass viele Menschen sich kaum noch &uuml;ber einen l&auml;ngeren Zeitraum ohne Ablenkung auf eine Aufgabe konzentrieren k&ouml;nnen. Das hat nicht nur mit mangelnder Konzentration, sondern auch mit internen und externen St&ouml;rungen zu tun: Sie m&ouml;chten etwas trinken, essen oder andere Dringlichkeiten erledigen, rufen E-Mails ab, werden angerufen oder durch Kollegen oder Familienmitglieder unterbrochen.<\/p>\n<p>Der Autor dieser Zeilen schaffte es bis vor kurzem bisweilen, mehrere Male pro Stunde E-Mails zu checken, zu surfen, Kaffee zu holen oder etwas zu naschen. Warum Weil gerade nicht genug Konzentration f&uuml;r die aktuelle Aufgabe vorhanden war und er sich ablenken wollte. Die Pomodoro-Technik brachte hier ein wenig Ordnung hinein.<\/p>\n<p><b>25 Minuten Konzentration<\/b><\/p>\n<p>Wie also funktioniert diese Technik Zun&auml;chst f&uuml;llen Sie eine Liste mit allen aktuell und in n&auml;chster Zeit abzuarbeitenden Aufgaben. Eine Vorlage zum Ausdrucken finden Sie genau wie die t&auml;gliche ToDo-Liste unter <b>www.pomodorotechnique.com\/products.html<\/b>. Dort gibt es auch eine ausf&uuml;hrliche englische Anleitung der Technik im PDF-Format zum kostenlosen Download.<\/p>\n<p>Jeden Morgen legen Sie dann eine neue ToDo-Liste mit den geplanten Aufgaben f&uuml;r diesen Tag an. Diese Liste wird von oben abgearbeitet, aber auf spezielle Weise: Zu Beginn der ersten Aufgabe stellen Sie den K&uuml;chenwecker n&auml;mlich auf 25 Minuten ein (eine 25-Minuten-Einheit hei&szlig;t ab jetzt <b>Pomodoro<\/b>) und arbeiten genau so lange, bis der Wecker klingelt.<\/p>\n<p>Tun Sie nichts, was nicht der Erledigung der aktuellen Aufgabe dient! Rufen Sie keine E-Mails ab, denken Sie nicht &uuml;ber die Gestaltung des Feierabends nach, rufen Sie nicht den Pizza-Bringdienst an!<\/p>\n<p>Danach machen Sie ein X hinter die aktuell bearbeitete Aufgabe, damit Sie sp&auml;ter nachvollziehen k&ouml;nnen, wie lange Sie f&uuml;r die Aufgabe ben&ouml;tigt haben. Anschlie&szlig;end machen Sie drei bis f&uuml;nf Minuten Pause und besch&auml;ftigen sich mit etwas anderem &#8211; umhergehen, etwas trinken, zur Toilette gehen et cetera. Aber erledigen Sie keine Aufgaben, die mit Ihrer Arbeit zu tun haben.<\/p>\n<p>Danach stellen Sie den Wecker erneut und arbeiten weitere 25 Minuten und so weiter. Nach vier Einheiten machen Sie eine l&auml;ngere Pause von 15 bis 30 Minuten.<\/p>\n<p>Ein Pomodoro ist eine untrennbare Einheit. Sie d&uuml;rfen weder k&uuml;rzer noch l&auml;nger als 25 Minuten an der ausgew&auml;hlten T&auml;tigkeit arbeiten. Wenn die T&auml;tigkeit genau 25 Minuten dauert &#8211; perfekt! Wenn Sie l&auml;nger f&uuml;r ihre Erledigung brauchen, teilen Sie diese auf mehrere Pomodoros auf (Aufgaben, die mehr als 5 bis 7 Pomodoros ben&ouml;tigen, sollten Sie in mehrere Aufgaben aufsplitten). Wenn Sie weniger als 25 Minuten f&uuml;r eine Aufgabe brauchen, sammeln Sie mehrere T&auml;tigkeiten, die zusammen etwa 25 Minuten dauern (ich bin auf diese Weise das regelm&auml;&szlig;ige E-Mail-Checken losgeworden &#8211; es findet nun ca. einmal t&auml;glich zusammen mit einigen anderen organisatorischen T&auml;tigkeiten innerhalb von 25 Minuten statt).<\/p>\n<p>Wenn Sie eine T&auml;tigkeit erledigt haben, streichen Sie diese sowohl aus der t&auml;glichen ToDo-Liste als auch aus der &Uuml;bersichtsliste heraus.<\/p>\n<p><b>Unterbrechungen<\/b><\/p>\n<p>Es ist eine gro&szlig;e Herausforderung, sich weder von internen (selbst initiierten) noch von externen Ablenkungen bei der Abarbeitung der 25-Minuten-Bl&ouml;cke st&ouml;ren zu lassen. Was immer sich Ihr Kopf ausdenkt, um Sie von der Arbeit abzulenken, und wer auch immer Sie telefonisch, per SMS oder pers&ouml;nlich zu st&ouml;ren versucht: Es gibt kaum etwas, was nicht 25 Minuten oder gegebenenfalls zwei Stunden warten kann. Sollte eine Ablenkung ein Eingreifen nach dem aktuellen Pomodoro oder einem Vierer-Set erfordern, tragen Sie diese unten in die t&auml;gliche ToDo-Liste ein, markieren diese mit einem <b>U <\/b>f&uuml;r <b>Ungeplant<\/b> und k&uuml;mmern sich zu gegebener Zeit darum.<\/p>\n<p>Wenn Sie sich selbst abgelenkt und dies bemerkt haben, f&uuml;gen Sie zur Liste der Kreuzchen (X) der aktuellen Aufgabe einen Strich (&#8220;) hinzu. Wenn eine externe St&ouml;rung geschieht, die Sie durch Hinzuf&uuml;gen einer ungeplanten Aufgabe entsch&auml;rfen konnten, tragen Sie ein Minus-Zeichen (-) in die Liste ein.<\/p>\n<p>Dies soll als &Uuml;berblick gen&uuml;gen. Vielleicht arbeiten Sie bereits sehr diszipliniert, falls nicht, probieren Sie diese Technik einmal aus! Vielleicht werden Sie mit der Pomodoro-Technik sehr schnell erkennen, wie viele Aufgaben sich in wenig Zeit konzentrierten Arbeitens erledigen lassen.<\/p>\n<p><b>Alles erfassen!<\/b><\/p>\n<p>Eine weitere wichtige Regel lautet: Erledigen Sie nichts, wenn es nicht als Aufgabe f&uuml;r diesen Tag definiert wurde oder als ungeplante Aufgabe hinzugekommen ist. Wenn Sie einmal beginnen, zwischen zwei Pomodori weitere Aufgaben wie das Abrufen von E-Mails et cetera durchzuf&uuml;hren, funktioniert die Technik nicht.<\/p>\n<p><b>Aufwandsch&auml;tzung<\/b><\/p>\n<p>Wenn Sie die Technik einmal adaptiert haben, k&ouml;nnen Sie weiteren Nutzen daraus ziehen. So lie&szlig;e sich beispielsweise pro Aufgabe festlegen, wie lange Sie brauchen, um diese zu erledigen. In diesem Fall tragen Sie in die &Uuml;bersichtsliste eine Zahl ein, die der erwarteten Dauer in Pomodori entspricht. In der Tages-ToDo-Liste k&ouml;nnen Sie dann f&uuml;r die geplanten Pomodori K&auml;stchen vorsehen. Sie sehen dann schnell, ob Sie mehr oder weniger Aufwand als erwartet in die Aufgabe gesteckt haben oder ob Ihre Annahme richtig war.<\/p>\n<p>Wenn Sie Ihre Aufgaben mit dem gesch&auml;tzten Aufwand versehen haben, k&ouml;nnen Sie auch gleich realistisch an die Planung eines Tages herangehen: Tragen Sie nur so viele Aufgaben in die ToDo-Liste ein, bis die Summe der Pomodori der f&uuml;r einen Tag vorgesehenen Anzahl Pomodori erreicht hat. Normalerweise d&uuml;rften dies um die 16 sein.<\/p>\n<p>Theoretisch ginge auch noch mehr, aber wenn man tats&auml;chlich 16 mal 25 Minuten konzentriert gearbeitet hat, geht m&ouml;glicherweise auch irgendwann die Leistungsf&auml;higkeit zur Neige.<\/p>\n<p><b>Auswertung<\/b><\/p>\n<p>Nat&uuml;rlich stellen wir Ihnen eine solche Technik nicht ohne Hintergedanken vor: Die Auswertung der durchgef&uuml;hrten T&auml;tigkeiten und der ben&ouml;tigten Zeit f&uuml;hren Sie nat&uuml;rlich mit einer Access-Datenbank durch (es geht zwar auch mit Papier oder einem Excel-Sheet, aber Sie sind ja vom Fach &#8230;).<\/p>\n<p>Wonach soll die Auswertung erfolgen Es gibt verschiedene denkbare Kriterien. Zun&auml;chst denkt man wohl an die Zuordnung der verbrauchten Pomodori zu den einzelnen Projekten. Sie k&ouml;nnen aber beliebige Kategorien definieren: Welche Art von T&auml;tigkeit haben Sie durchgef&uuml;hrt (zum Beispiel Programmierung, Dokumentation, Projektmanagement) Handelte es sich um eine Projektt&auml;tigkeit oder eine allgemeine, organisatorische T&auml;tigkeit Wie viele der T&auml;tigkeiten waren geplant und wie viele sind w&auml;hrend des Tages ungeplant hinzugekommen Wie viele interne und externe Unterbrechungen gab es w&auml;hrend der Durchf&uuml;hrung der Pomodori<\/p>\n<p><b>Aufgaben der Pomodore-Datenbank<\/b><\/p>\n<p>Unsere Datenbank soll die folgenden Aufgaben erledigen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Liste der zu erledigenden Aufgaben verwalten<\/li>\n<li class=\"aufz-hlung\">ToDo-Liste f&uuml;r einen Tag zusammenstellen und ausdrucken<\/li>\n<li class=\"aufz-hlung\">Eintragen der Pomodori am Ende des Tages<\/li>\n<li class=\"aufz-hlung\">Anzeige verschiedener Auswertungen<\/li>\n<\/ul>\n<p><b>Datenmodell der Pomodore-Datenbank<\/b><\/p>\n<p>Die Datenbank zur Verwaltung von Aufgaben verwendet die Tabellen aus Bild 1.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Datenmodell der PomodoreDB<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblAufgaben<\/b> speichert die eigentlichen Aufgaben und besitzt die folgenden Felder:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>AufgabeID<\/b>: Prim&auml;rschl&uuml;sselfeld der Tabelle<\/li>\n<li class=\"aufz-hlung\"><b>Bezeichnung<\/b>: Bezeichnung der Aufgabe<\/li>\n<li class=\"aufz-hlung\"><b>GeschaetzteDauer<\/b>: Ungef&auml;hre Dauer in Pomodori (sprich: in 25-Minuten-Einheiten)<\/li>\n<li class=\"aufz-hlung\"><b>ProjektID<\/b>: Projekt, zu dem die Aufgabe geh&ouml;rt<\/li>\n<li class=\"aufz-hlung\"><b>TaetigkeitsartID<\/b>: T&auml;tigkeitsart der Aufgabe<\/li>\n<li class=\"aufz-hlung\"><b>Deadline<\/b>: Datum, bis zu dem die Aufgabe durchgef&uuml;hrt werden muss<\/li>\n<li class=\"aufz-hlung\"><b>Erledigt<\/b>: Ja\/Nein-Feld, das speichert, ob die Aufgabe bereits vollst&auml;ndig erledigt wurde<\/li>\n<li class=\"aufz-hlung\"><b>Ungeplant<\/b>: Ja\/Nein-Feld, das angibt, ob es sich um eine ungeplante und w&auml;hrend einer anderen Aufgabe hinzugekommene Aufgabe handelt <\/li>\n<\/ul>\n<p>Die Tabelle besitzt einen zusammengesetzten, eindeutigen Schl&uuml;ssel auf Basis der drei Felder <b>Bezeichnung,<\/b> <b>Deadline<\/b> und <b>ProjektID<\/b>. Das bedeutet, dass eine Kombination dieser drei Felder nur einmal vorkommen kann.<\/p>\n<p>Die Tabellen <b>tblProjekte<\/b> und <b>tblTaetigkeitsarten <\/b>sind reine Lookup-Tabellen, deren Datens&auml;tze &uuml;ber die Fremdschl&uuml;sselfelder <b>ProjektID <\/b>und <b>TaetigkeitsartID <\/b>zu einer Aufgabe hinzugef&uuml;gt werden. Die Tabelle <b>tblDoDos <\/b>enth&auml;lt alle Aufgaben, die f&uuml;r ein bestimmtes Datum terminiert und somit einer ToDo-Liste eines bestimmten Tages hinzugef&uuml;gt wurden. Sie besitzt die folgenden Felder:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ToDoID<\/b>: Prim&auml;rschl&uuml;sselfeld der Tabelle<\/li>\n<li class=\"aufz-hlung\"><b>AufgabeID<\/b>: Fremdschl&uuml;sselfeld zur Tabelle <b>tblAufgaben<\/b>, mit dem festgelegt wird, zu welcher Aufgabe der Eintrag der ToDo-Liste geh&ouml;rt.<\/li>\n<li class=\"aufz-hlung\"><b>Pomodori<\/b>: Anzahl der Pomodori, die f&uuml;r diesen ToDo-Punkt aufgewendet wurden<\/li>\n<li class=\"aufz-hlung\"><b>ToDoDatum<\/b>: Datum, dem dieser ToDo-Punkt zugewiesen wurde<\/li>\n<li class=\"aufz-hlung\"><b>InterneUnterbrechungen<\/b>: Anzahl der internen Unterbrechungen w&auml;hrend der Abarbeitung eines Pomodoro<\/li>\n<li class=\"aufz-hlung\"><b>ExterneUnterbrechungen<\/b>: Anzahl der externen Unterbrechungen w&auml;hrend der Abarbeitung eines Pomodoro<\/li>\n<\/ul>\n<p>Diese Tabelle besitzt einen aus den beiden Feldern <b>AufgabeID <\/b>und <b>ToDoDatum <\/b>zusammengesetzten eindeutigen Schl&uuml;ssel. Dies verhindert, dass zwei oder mehr ToDo-Eintr&auml;ge f&uuml;r die gleiche Aufgabe an einem Tag angelegt werden k&ouml;nnen.<\/p>\n<p><b>Formular zur Verwaltung der Aufgaben und ToDo-Listen<\/b><\/p>\n<p>Das in Bild 2 abgebildete Formular <b>frmAufgaben <\/b>ist eines von zwei wichtigen Formularen der Anwendung. Es enth&auml;lt zwei wesentliche Elemente:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Formular zum Verwalten von Aufgaben und ToDo-Eintr&auml;gen einzelner Tage<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">ein Unterformular zur Anzeige aller Aufgaben und<\/li>\n<li class=\"aufz-hlung\">ein Unterformular mit den Aufgaben des aktuellen Tages, also der ToDo-Liste.<\/li>\n<\/ul>\n<p>Das Hauptformular selbst bietet einige Steuerelemente etwa zum Anlegen neuer Aufgaben, zum Bearbeiten oder L&ouml;schen bestehender Aufgaben, zum Erstellen eines ToDo-Punktes auf Basis einer Aufgabe und weitere Elemente. Damit k&ouml;nnen Sie beispielsweise den Tag ausw&auml;hlen, zu dem das rechte Unterformular die ToDo-Liste anzeigen soll, die ToDo-Liste ausdrucken oder eine Aufgabe aus der ToDo-Liste entfernen.<\/p>\n<p>Die Bestandteile dieses Formulars schauen wir uns in den folgenden Abschnitten an.<\/p>\n<p><b>Unterformular zur Anzeige von Aufgaben<\/b><\/p>\n<p>Das Unterformular <b>sfmAufgaben<\/b> zeigt eine Liste aller Aufgaben an. Dazu stellen Sie die Eigenschaft <b>Datenherkunft<\/b> auf die Abfrage aus Bild 3 ein.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Datenherkunft des Unterformulars sfmAufgaben<\/span><\/b><\/p>\n<p>Die Abfrage enth&auml;lt alle Felder der Tabelle <b>tblAufgaben<\/b>, wobei diese allerdings nach den Feldern <b>Deadline<\/b> und <b>Bezeichnung <\/b>aufsteigend sortiert sind.<\/p>\n<p>Dem Formularentwurf f&uuml;gen Sie lediglich die drei Felder <b>Deadline<\/b>, <b>Bezeichnung <\/b>und <b>GeschaetzteDauer<\/b> hinzu (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Entwurfsansicht des Unterformulars sfmAufgaben<\/span><\/b><\/p>\n<p>Der Benutzer soll keine Daten direkt im Unterformular bearbeiten k&ouml;nnen. Daher stellen Sie die Eigenschaften <b>Anf&uuml;gen zulassen<\/b>, <b>L&ouml;schen zulassen <\/b>und <b>Bearbeitungen zulassen <\/b>auf den Wert <b>Nein <\/b>ein. Au&szlig;erdem soll das Unterformular die Daten in der Datenblattansicht anzeigen, was Sie durch Einstellen der Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>erreichen.<\/p>\n<p><b>Unterformular zur Anzeige der ToDo-Liste<\/b><\/p>\n<p>Das rechte Unterformular hei&szlig;t <b>sfmToDoListe <\/b>und verwendet eine Abfrage auf Basis der Tabelle <b>tblToDoListe <\/b>als Datenherkunft. Die Sortierung erfolgt nach dem Prim&auml;rschl&uuml;sselfeld, also in der Reihenfolge des Anlegens der enthaltenen Datens&auml;tze. Das Formular sieht im Entwurf wie in Bild 5 aus und enth&auml;lt die vier Felder <b>AufgabeID<\/b>, <b>Pomodori<\/b>, <b>InterneUnterbrechungen <\/b>und <b>ExterneUnterbrechungen<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Entwurfsansicht des Unterformulars sfmToDoListe<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Davon abgesehen erh&auml;lt das Unterformular die gleichen Eigenschaften wie das Unterformular <b>sfmAufgaben <\/b>&#8211; es soll also keine Bearbeitung durch den Benutzer erlauben und die Datens&auml;tze in der Datenblattansicht anzeigen.<\/p>\n<p><b>Hauptformular zur Verwaltung von Aufgaben und ToDo-Listen<\/b><\/p>\n<p>Das Hauptformular zeigt beide Unterformulare in entsprechenden Unterformular-Steuerelementen an. Das Unterformular <b>sfmAufgaben <\/b>soll standardm&auml;&szlig;ig nur die Aufgaben anzeigen, die noch nicht erledigt sind, deren Feld <b>Erledigt <\/b>also den Wert <b>False <\/b>enth&auml;lt. Damit der Benutzer entweder alle oder nur die nicht erledigten Aufgaben einblenden kann, enth&auml;lt das Formular das Kontrollk&auml;stchen <b>chkAktiveAufgaben<\/b>. Es l&ouml;st nach der Aktualisierung die folgende Ereignisprozedur aus:<\/p>\n<pre>Private Sub chkAktiveAufgaben_AfterUpdate()\r\n    Call AufgabenFiltern\r\nEnd Sub<\/pre>\n<p>Die darin aufgerufene Prozedur setzt entweder einen Filter auf das Unterformular oder entfernt diesen. Dies sieht so aus:<\/p>\n<pre>Private Sub AufgabenFiltern()\r\n    If Me!chkAktiveAufgaben Then\r\n        Me!sfmAufgaben.Form.Filter = &quot;Erledigt = False&quot;\r\n        Me!sfmAufgaben.Form.FilterOn = True\r\n    Else\r\n        Me!sfmAufgaben.Form.Filter = &quot;&quot;\r\n        Me!sfmAufgaben.Form.FilterOn = False\r\n    End If\r\nEnd Sub<\/pre>\n<p>Das Kontrollk&auml;stchen <b>chkAktiveAufgaben <\/b>hat standardm&auml;&szlig;ig den Wert <b>True<\/b>. Damit sich dies direkt beim &Ouml;ffnen des Formulars niederschl&auml;gt, wird die Prozedur <b>AufgabenFiltern <\/b>auch gleich in der Ereignisprozedur aufgerufen, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird.<\/p>\n<p><b>Aufgaben anlegen, bearbeiten und l&ouml;schen<\/b><\/p>\n<p>Die drei Schaltfl&auml;chen &uuml;ber dem Unterformular <b>sfmAufgaben <\/b>l&ouml;sen <b>Beim Klicken <\/b>Ereignisprozeduren aus, die Folgendes bewirken:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>cmdNeueAufgabe<\/b>: &Ouml;ffnet das Formular <b>frmAufgabe<\/b> zum Erstellen einer neuen Aufgabe und aktualisiert das Unterformular <b>sfmAufgaben<\/b> anschlie&szlig;end.<\/li>\n<li class=\"aufz-hlung\"><b>cmdAufgabeBearbeiten<\/b>: &Ouml;ffnet das Formular <b>frmAufgabe<\/b> und zeigt dort die beim Klick auf die Schaltfl&auml;che markierte Aufgabe des Unterformulars an. Nach dem &auml;ndern wird das Unterformular ebenfalls aktualisiert.<\/li>\n<li class=\"aufz-hlung\"><b>cmdAufgabeLoeschen<\/b>: Diese Schaltfl&auml;che l&ouml;scht nach R&uuml;ckfrage den im Unterformular markierten Datensatz.<\/li>\n<\/ul>\n<p><span class=\"verweis-ohneumbruch\"><a href=\"#anker-46-anchor\">Listing 1<\/a><\/span> zeigt die drei Ereignisprozeduren.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Erstellen, bearbeiten und l&ouml;schen von Aufgaben<\/p>\n<pre>Private Sub cmdNeueAufgabe_Click()\r\n    DoCmd.OpenForm &quot;frmAufgabe&quot;, DataMode:=acFormAdd, WindowMode:=acDialog\r\n    Me!sfmAufgaben.Form.Requery\r\nEnd Sub\r\nPrivate Sub cmdAufgabeBearbeiten_Click()\r\n    DoCmd.OpenForm &quot;frmAufgabe&quot;, WhereCondition:=&quot;AufgabeID = &quot; &amp; Me!sfmAufgaben.Form!AufgabeID, _\r\n    WindowMode:=acDialog, DataMode:=acFormEdit\r\n    Me!sfmAufgaben.Form.Requery\r\nEnd Sub\r\nPrivate Sub cmdAufgabeLoeschen_Click()\r\n    Dim db As DAO.Database\r\n    If MsgBox(&quot;Aufgabe l&ouml;schen&quot;, vbYesNo + vbExclamation, &quot;L&ouml;schen&quot;) = vbYes Then\r\n        Set db = CurrentDb\r\n        db.Execute &quot;DELETE FROM tblAufgaben WHERE AufgabeID = &quot; &amp; Me!sfmAufgaben.Form!AufgabeID, dbFailOnError\r\n        Me!sfmAufgaben.Form.Requery\r\n        Set db = Nothing\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Anzeige der ToDo-Liste im Unterformular<\/b><\/p>\n<p>Das Formular <b>sfmToDoListe <\/b>soll alle ToDo-Positionen eines Tages anzeigen. Das Datum dieses Tages gibt der Benutzer im Textfeld <b>txtDatum <\/b>des Hauptformulars ein.<\/p>\n<p>Sowohl beim ersten Anzeigen als auch bei einer &auml;nderung des dort enthaltenen Datums soll der Inhalt des Unterformulars <b>sfmToDoListe <\/b>aktualisiert werden. Dazu bedarf es nicht einer einzigen Codezeile, sondern lediglich der Einstellung zweier Eigenschaften des Unterformular-Steuerelements.<\/p>\n<p>Bild 6 zeigt die rechte H&auml;lfte des Formulars <b>frmAufgaben <\/b>mit dem Unterformular <b>sfmToDoListe <\/b>und den Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements. Die Eigenschaft <b>Verkn&uuml;pfen von <\/b>stellen Sie auf das Feld <b>ToDoDatum <\/b>des Eintrags der Tabelle <b>tblToDos <\/b>ein, die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>verweist auf das Steuerelement <b>txtDatum <\/b>des Hauptformulars. Wenn der Benutzer dort nun ein anderes Datum eingibt, &auml;ndert sich gleichzeitig der Inhalt des Unterformulars.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Das Unterformular im Hauptformular<\/span><\/b><\/p>\n<p>Damit der Benutzer das Datum leicht &auml;ndern kann, haben wir gleich zwei Hilfen eingebaut. Die erste sind die beiden Schaltfl&auml;chen rechts neben dem Textfeld <b>txtDatum<\/b>. Sie hei&szlig;en <b>cmdVorher <\/b>und <b>cmdNachher <\/b>und stellen das im Textfeld angezeigte Datum jeweils auf den vorherigen beziehungsweise folgenden Tag ein.<\/p>\n<p>Au&szlig;erdem haben wir die im Beitrag <b>Flexible Datumstextfelder <\/b>(<b>www.access-im-unternehmen.de\/690<\/b>) vorgestellten Klassen <b>clsDateBox <\/b>und <b>clsDateboxes <\/b>in das VBA-Projekt integriert und diese verschiedenen Textfeldern zur Datumseingabe zugewiesen.<\/p>\n<p>Ist ein Datumstextfeld leer, gen&uuml;gt das Bet&auml;tigen der Leertaste, um das aktuelle Datum einzuf&uuml;gen. Das Bet&auml;tigen der <b>Nach oben<\/b>&#8211; und der <b>Nach unten<\/b>-Taste bewirkt das Einstellen des jeweils vorherigen oder folgenden Tages, Monats oder Jahres &#8211; je nachdem, an welcher Position sich die Einf&uuml;gemarke aktuell befindet.<\/p>\n<p>Diese Funktion aktivieren Sie, indem Sie der durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;sten Prozedur ein paar Anweisungen hinzuf&uuml;gen. Zun&auml;chst m&uuml;ssen Sie die Klasse <b>clsDateboxes <\/b>jedoch im Klassenmodul des jeweiligen Formulars deklarieren:<\/p>\n<pre>Dim objDateboxes As clsDateboxes<\/pre>\n<p>Dann instanzieren Sie das Objekt auf Basis der angegebenen Klasse und f&uuml;gen mit seiner Methode <b>AddDatebox <\/b>das Textfeld hinzu, das die Funktionen zur einfachen Datumseingabe anbieten soll:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objDateboxes = New clsDateboxes\r\n    With objDateboxes\r\n        .AddDatebox Me!txtDatum\r\n    End With\r\n    Me!txtDatum = Date\r\n    Call AufgabenFiltern\r\nEnd Sub<\/pre>\n<p>Damit das Unterformular gleich zu Beginn die Daten des aktuellen Tages anzeigt, stellt die Prozedur das Textfeld <b>txtDatum <\/b>au&szlig;erdem noch auf das aktuelle Datum ein.<\/p>\n<p><b>Aufgaben zur ToDo-Liste hinzuf&uuml;gen<\/b><\/p>\n<p>Die Schaltfl&auml;che zwischen den beiden Unterformularen soll einen ToDo-Eintrag auf Basis der ausgew&auml;hlten Aufgabe anlegen. Die Schaltfl&auml;che hei&szlig;t <b>cmdAufgabeInToDoListe<\/b> und l&ouml;st die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-48-anchor\">Listing 2<\/a><\/span> aus.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Erstellen eines ToDo-Punkts auf Basis einer Aufgabe<\/p>\n<pre>Private Sub cmdAufgabeInToDoListe_Click()\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    On Error Resume Next\r\n    db.Execute &quot;INSERT INTO tblToDos(AufgabeID, ToDoDatum) VALUES(&quot; _\r\n        &amp; Me!sfmAufgaben.Form!AufgabeID &amp; &quot;, &quot; &amp; SQLDatum(Me!txtDatum) &amp; &quot;)&quot;, dbFailOnError\r\n    If Err.Number = 3022 Then\r\n        MsgBox &quot;Die Aufgabe befindet sich bereits in der ToDo-Liste.&quot;\r\n        Exit Sub\r\n    End If\r\n    Me!sfmToDoListe.Form.Requery\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Die Hauptarbeit erledigt eine <b>INSERT INTO<\/b>-Aktionsabfrage, die als Parameter der <b>Execute<\/b>-Anweisung des aktuellen Datenbankobjekts angegeben wird. Diese SQL-Anweisung legt einen neuen Datensatz in der Tabelle <b>tblToDoListe <\/b>an und schreibt einige Daten in den neuen Datensatz: den Wert des Feldes <b>AufgabeID <\/b>des aktuell im Unterformular <b>sfmAufgaben <\/b>ausgew&auml;hlten Datensatzes der Tabelle <b>tblAufgaben <\/b>sowie das aktuell im Textfeld <b>txtDatum<\/b> des Hauptformulars enthaltene Datum.<\/p>\n<p>Da die Tabelle <b>tblToDos <\/b>einen zusammengesetzten Index auf den beiden Feldern <b>AufgabeID <\/b>und <b>ToDoDatum <\/b>besitzt, f&uuml;hrt das Anlegen eines zweiten ToDo-Punktes auf Basis der gleichen Aufgabe an einem Tag zu einem Fehler. Dieser wird in der Fehlerbehandlung behandelt, indem eine entsprechende Meldung ausgegeben und das Hinzuf&uuml;gen des ToDo-Punktes unterbrochen wird.<\/p>\n<p>Nach dem Hinzuf&uuml;gen des ToDo-Punktes wird das Unterformular <b>sfmToDoListe <\/b>aktualisiert, damit der neue Eintrag gleich nach dem Anlegen auch dort erscheint.<\/p>\n<p><b>Eintrag aus der ToDo-Liste entfernen<\/b><\/p>\n<p>Ganz &auml;hnlich l&auml;uft das L&ouml;schen von ToDo-Eintr&auml;gen. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-49-anchor\">Listing 3<\/a><\/span> zeigt die Ereignisprozedur, die beim Anklicken der Schaltfl&auml;che <b>cmdAusToDoEntfernen<\/b> ausgel&ouml;st wird. Nach dem Ermitteln des aktuell aktivierten Eintrags im Unterformular <b>sfmToDoListe <\/b>wird dieser Eintrag per <b>DELETE<\/b>-Aktionsabfrage aus der Tabelle <b>tblToDos <\/b>gel&ouml;scht.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Entfernen eines Eintrags aus der ToDo-Liste<\/p>\n<pre>Private Sub cmdAusToDoEntfernen_Click()\r\n    Dim db As DAO.Database\r\n    Dim lngToDoID As Long\r\n    Set db = CurrentDb\r\n    lngToDoID = Nz(Me!sfmToDoListe.Form!ToDoID, 0)\r\n    db.Execute &quot;DELETE FROM tblToDos WHERE ToDoID = &quot; &amp; lngToDoID, dbFailOnError\r\n    Me!sfmToDoListe.Form.Requery\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Anschlie&szlig;end aktualisiert die Prozedur das Unterformular <b>sfmToDoListe<\/b>, damit der Eintrag auch von dort verschwindet.<\/p>\n<p><b>Formular zur Eingabe von Aufgaben<\/b><\/p>\n<p>Schauen wir uns nun die Eingabe und Bearbeitung von Aufgaben an, die ja die Grundlage f&uuml;r ToDo-Eintr&auml;ge bilden. Das Formular <b>frmAufgabe <\/b>zeigt die Detaildaten eines Datensatzes der Tabelle <b>tblAufgaben <\/b>an und erlaubt sowohl das Anlegen neuer als auch das Bearbeiten vorhandener Datens&auml;tze.<\/p>\n<p>Eigentlich sollte dieses Formular einfach zu realisieren sein, aber wir wollen ja auch f&uuml;r einen gewissen Komfort sorgen. Und dazu soll der Benutzer beispielsweise gleich mehrere Aufgaben auf einen Schlag anlegen k&ouml;nnen. Wenn Sie zum Beispiel jeden Tag einen Pomodoro (also 25 Minuten) mit dem Lesen und Beantworten von E-Mails verbringen, dann sollten Sie auch f&uuml;r jeden Tag eine Aufgabe anlegen, die einen Pomodoro als gesch&auml;tzten Aufwand vorsieht. Nun ist das Anlegen von, sagen wir, 28 gleichen Datens&auml;tzen f&uuml;r die n&auml;chsten vier Wochen nicht gerade die Arbeit, die Jubelst&uuml;rme bei einem Access-Entwickler ausl&ouml;st. Dann opfert der geneigte Entwickler doch lieber ein paar Pomodori, um das Erstellen mehrerer Aufgaben auf Basis der gleichen Informationen, aber mit unterschiedlichen Datumsangaben zu automatisieren.<\/p>\n<p>Diese kleine Programmieraufgabe haben wir in einem eigenen kleinen Beitrag verpackt, den Sie unter <b>Terminserien <\/b>(<b>www.access-im-unternehmen.de\/789<\/b>) finden.<\/p>\n<p>Die dort beschriebene Funktion <b>Terminserie <\/b>liefert ein Array mit den gefundenen Terminen zur&uuml;ck, das im Formular <b>frmAufgabe <\/b>verarbeitet wird &#8211; mehr dazu weiter unten.<\/p>\n<p>Das Formular <b>frmAufgaben<\/b> verwendet die Tabelle <b>tblAufgaben <\/b>als Datenherkunft. Es zeigt im Wesentlichen die Felder dieser Tabelle an (s. Bild 7). Davon abgesehen liefert es drei Schaltfl&auml;chen:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Entwurfsansicht des Formulars frmAufgabe<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>cmdAufgabeErstellen<\/b>: Speichert den aktuell angezeigten Datensatz in der Tabelle <b>tblAufgaben <\/b>und schlie&szlig;t das Formular.<\/li>\n<li class=\"aufz-hlung\"><b>cmdAufgabenfolgeErstellen<\/b>: &Ouml;ffnet einen weiteren Dialog, um die Termine der Aufgabenfolge aufzunehmen, und erstellt die entsprechenden Aufgaben.<\/li>\n<li class=\"aufz-hlung\"><b>cmdAbbrechen<\/b>: Bricht die Erstellung\/Bearbeitung der aktuellen Aufgabe ab.<\/li>\n<\/ul>\n<p>Au&szlig;erdem gibt es noch eine Schaltfl&auml;che namens <b>cmdOK<\/b>, die je nach der aktuellen Funktion des Formulars statt der beiden Schaltfl&auml;chen <b>cmdAufgabeErstellen <\/b>und <b>cmdAufgabenfolgeErstellen <\/b>sichtbar gemacht wird. Dies geschieht, wenn eine Aufgabe bearbeitet wird.<\/p>\n<p>Beim &Ouml;ffnen des Formulars stellt dieses zun&auml;chst &uuml;ber eine Prozedur, die durch das Ereignis <b>Beim &Ouml;ffnen <\/b>ausgel&ouml;st wird, einige Standardwerte ein (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-51-anchor\">Listing 4<\/a><\/span>). Danach pr&uuml;ft das Formular im Ereignis <b>Beim Laden<\/b>, ob es zum Neuanlegen oder Bearbeiten eines Datensatzes ge&ouml;ffnet wurde.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Einstellen der Standardwerte einer Aufgabe<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Me!txtDeadline.DefaultValue = Chr(34) &amp; Date &amp; Chr(34)\r\n    Me!cboProjektID.DefaultValue = Nz(DLookup(&quot;ProjektID&quot;, &quot;tblProjekte&quot;, &quot;Projekt = ''Allgemein''&quot;))\r\n    Me!cboTaetigkeitsartID.DefaultValue = Nz(DLookup(&quot;TaetigkeitsartID&quot;, &quot;tblTaetigkeitsarten&quot;, _\r\n        &quot;Taetigkeitsart = ''Diverse''&quot;))\r\nEnd Sub<\/pre>\n<p>Diese Information liefert die verborgene Eigenschaft <b>DefaultEditing <\/b>des Formulars. Hat diese Eigenschaft den Wert <b>1<\/b>, wurde die <b>OpenForm<\/b>-Methode mit dem Wert <b>acFormAdd <\/b>f&uuml;r den Parameter <b>DataMode <\/b>aufgerufen, beim Wert <b>2 <\/b>wurde die Konstante <b>acFormEdit <\/b>verwendet. In Abh&auml;ngigkeit von diesem Wert werden die oben beschriebenen Schaltfl&auml;chen aktiviert beziehungsweise deaktiviert. Schlie&szlig;lich wird auch hier die Klasse <b>clsDateboxes <\/b>verwendet, um das Textfeld zur Eingabe der Deadline flexibler zu machen:<\/p>\n<pre>Private Sub Form_Load()\r\n    Select Case Me.DefaultEditing\r\n        Case 1 ''Neu\r\n            Me!cmdAufgabeErstellen.Visible = True\r\n            Me!cmdAufgabenfolgeErstellen.Visible = True\r\n            Me!cmdOK.Visible = False\r\n        Case 2 ''Bearbeiten\r\n            Me!cmdAufgabeErstellen.Visible = False\r\n            Me!cmdAufgabenfolgeErstellen.Visible = False\r\n            Me!cmdOK.Visible = True\r\n    End Select\r\n    Set objDateboxes = New clsDateboxes\r\n    With objDateboxes\r\n        .AddDatebox Me!txtDeadline\r\n    End With\r\nEnd Sub<\/pre>\n<p>Der Benutzer muss nun theoretisch nur noch die Bezeichnung der Aufgabe eintragen (s. Bild 8).<\/p>\n<p><img decoding=\"async\" class=\"abbildung\" src=\"TomatengetriebeneProgrammierung-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Anlegen eines Termins<\/span><\/b><\/p>\n<p><b>Speichern einer Aufgabe<\/b><\/p>\n<p>Wenn das Formular nur eine einzige Aufgabe erstellen soll, klickt der Benutzer auf die Schaltfl&auml;che <b>cmdAufgabeErstellen<\/b>. Dies l&ouml;st eine Prozedur aus, die zun&auml;chst eine einfache Validierungsfunktion aufruft (siehe Funktion <b>Validierung <\/b>im Modul <b>Form_frmAufgabe<\/b>).<\/p>\n<p>Liefert diese den Wert <b>True <\/b>zur&uuml;ck, wird zus&auml;tzlich der Inhalt des Steuerelements <b>txtDeadline <\/b>gepr&uuml;ft.<\/p>\n<p>Warum landet dies nicht in der Validierungsfunktion Ganz einfach: Weil diese Funktion auch noch aufgerufen wird, wenn eine Aufgabenfolge geschrieben werden soll und die Deadline dort f&uuml;r jede Aufgabe individuell ermittelt wird, muss dieses Feld nur beim Anlegen einzelner Aufgaben gef&uuml;llt sein.<\/p>\n<p>Nach der erfolgreichen Durchf&uuml;hrung dieser Validierung wird das Formular schlie&szlig;lich geschlossen und der neue Datensatz somit gespeichert:<\/p>\n<pre>Private Sub cmdAufgabeErstellen_Click()\r\n    If Validierung = False Then\r\n        Exit Sub\r\n    End If\r\n    If IsNull(Me!txtDeadline) Then\r\n        MsgBox &quot;Bitte geben Sie eine Deadline ein.&quot;\r\n        Me!txtDeadline.SetFocus\r\n        Exit Sub\r\n    End If\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p><b>Erstellen einer Aufgabenfolge<\/b><\/p>\n<p>Das Erstellen einer Aufgabenfolge ist etwas aufwendiger. Dabei liefert zun&auml;chst die Funktion <b>Terminserie <\/b>ein Array mit allen ermittelten Datumsangaben.<\/p>\n<p>Das Formular, das durch diese Funktion ge&ouml;ffnet wird, sieht etwa wie in Bild 9 aus. Nach einer Pr&uuml;fung, ob dieses Array mindestens einen Wert enth&auml;lt, startet eine Schleife &uuml;ber alle Elemente des Arrays, also alle darin gespeicherten Datumsangaben.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Terminserie erstellen<\/span><\/b><\/p>\n<p>Die Prozedur erstellt mit einer <b>INSERT INTO<\/b>-Aktionsabfrage f&uuml;r jeden Termin des Arrays einen neuen Datensatz, wobei alle &uuml;brigen Daten der Tabelle <b>tblAufgaben <\/b>den Feldern des Formulars <b>frmAufgaben <\/b>entnommen werden (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-52-anchor\">Listing 5<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 5: Erstellen einer Reihe von Aufgaben mit gleichartigen Daten<\/p>\n<pre>Private Sub cmdAufgabenfolgeErstellen_Click()\r\n    Dim intCount As Integer\r\n    Dim datTermine() As Date\r\n    Dim db As DAO.Database\r\n    Dim i As Integer\r\n    Set db = CurrentDb\r\n    datTermine = WiederkehrendeTermineErmitteln\r\n    intCount = ArrayCount(datTermine)\r\n    Select Case intCount\r\n        Case 0\r\n            MsgBox &quot;Es wurden keine Aufgaben erstellt.&quot;\r\n            Exit Sub\r\n        Case Is &gt; 0\r\n            MsgBox &quot;Es wurden &quot; &amp; intCount &amp; &quot; regelm&auml;&szlig;ige Aufgaben erstellt.&quot;\r\n    End Select\r\n    For i = LBound(datTermine) To UBound(datTermine)\r\n        db.Execute &quot;INSERT INTO tblAufgaben(Bezeichnung, GeschaetzteDauer, ProjektID, &quot; _\r\n            &amp; &quot;TaetigkeitsartID, Deadline) VALUES(''&quot; &amp; Me!txtBezeichnung &amp; &quot;'', &quot; _\r\n            &amp; Me!txtGeschaetzteDauer &amp; &quot;, &quot; &amp; Me!cboProjektID &amp; &quot;, &quot; &amp; Me!cboTaetigkeitsartID _\r\n            &amp; &quot;, &quot; &amp; SQLDatum(datTermine(i)) &amp; &quot;)&quot;, dbFailOnError\r\n    Next i\r\n    Me.Undo\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Danach wird das Formular <b>frmAufgabe <\/b>geschlossen. Wichtig ist, dass zuvor noch die <b>Undo<\/b>-Methode des Formulars ausgel&ouml;st wird. Anderenfalls w&uuml;rde die aktuell in dem gebundenen Formular angezeigte Aufgabe ebenfalls gespeichert werden, was aber nicht gew&uuml;nscht ist &#8211; es sollen nur die Aufgaben mit den wiederkehrenden Terminen gespeichert werden.<\/p>\n<p><b>Bericht zur Ausgabe einer ToDo-Liste<\/b><\/p>\n<p>Eine der spannendsten Aufgaben beim Erstellen dieser Beispiell&ouml;sung war das Programmieren eines Berichts wie in Bild 10. Der Bericht sollte m&ouml;glichst wie das Original von der Webseite des Erfinders der Pomodoro-Technik aussehen (wer schon einmal einen Bericht aus dem Stegreif entwerfen musste, wei&szlig;, wie wertvoll eine konkrete Vorlage sein kann).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Ausgabe der ToDo-Liste eines Tages<\/span><\/b><\/p>\n<p>Das Problem hierbei war im Wesentlichen die Erzeugung von 25 Zeilen f&uuml;r die Aufgaben, obwohl die Anzahl der Aufgaben der abzubildenden ToDo-Liste immer kleiner sein sollte. Aber die Anwendung soll zumindest w&auml;hrend der Durchf&uuml;hrung der Pomodoro-Technik die Einfachheit beibehalten &#8211; deshalb gibt es auch kein Formular, das f&uuml;r Sie die 25 Minuten stoppt und das gleich die verarbeiteten Pomodori in die Datenbank schreibt.<\/p>\n<p>Man sollte die Anwendung nutzen, um morgens die ToDo-Liste f&uuml;r den Tag zusammenzustellen, diese den Tag &uuml;ber abarbeiten und abends die Ergebnisse in die Datenbank eintragen.<\/p>\n<p>Somit k&ouml;nnen Sie dann sp&auml;ter mit entsprechenden Auswertungen ermitteln, wie die Pomodoro-Technik f&uuml;r Sie funktioniert.<\/p>\n<p><b>Datenherkunft f&uuml;r den Bericht<\/b><\/p>\n<p>Wir wollten das Problem der leeren Zeilen l&ouml;sen, indem wir eine entsprechende Abfrage verwenden, welche die vorhandenen ToDo-Punkte sowie einige bez&uuml;glich der anzuzeigenden Felder leere Datens&auml;tze enth&auml;lt.<\/p>\n<p>Dies gelang in drei Schritten: Im ersten ermittelt die Abfrage alle ToDo-Punkte aus der Tabelle <b>tblToDos <\/b>und f&uuml;hrt diese mit den fehlenden Informationen aus der Tabelle <b>tblAufgaben <\/b>zusammen. Das Kriterium <b>[Forms]![frmAufgaben]![txtDatum] <\/b>f&uuml;r das Feld <b>ToDoDatum <\/b>sorgt daf&uuml;r, dass nur die ToDos des gew&auml;hlten Datums erscheinen (s. Bild 11).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Die Basisabfrage des Berichts ermittelt alle ToDo-Punkte f&uuml;r den gew&auml;hlten Tag.<\/span><\/b><\/p>\n<p>Nicht sichtbar ist der Ausdruck f&uuml;r das Feld <b>AnzahlPomodori<\/b>. Dieser sieht so aus:<\/p>\n<pre>AnzahlPomodori: [GeschaetzteDauer]-Nz(DomSumme(&quot;Pomodori&quot;;&quot;tblToDos&quot;;&quot;AufgabeID = &quot; &amp; [tblAufgaben].[AufgabeID]);0)<\/pre>\n<p>Der Ausdruck ermittelt die Anzahl der geplanten Pomodori minus aller bislang f&uuml;r diese Aufgabe verbrauchten Pomodori.<\/p>\n<p>Das Ergebnis der Abfrage sieht beispielsweise wie in Bild 13).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Erstes Zwischenergebnis<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic013.png\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Datens&auml;tze zum Auff&uuml;llen<\/span><\/b><\/p>\n<p>Wie f&uuml;hren wir die Abfrage und die Tabelle zusammen Mit einer UNION-Abfrage. Diese verwendet folgenden SQL-Code:<\/p>\n<pre>SELECT ToDoID, Bemerkungen, Bezeichnung, AnzahlPomodori, ToDoDatum FROM tblZeilen\r\nUNION ALL\r\nSELECT ToDoID, Bemerkungen, Bezeichnung, AnzahlPomodori, ToDoDatum FROM qryRptToDoListeBAse\r\nORDER BY ToDoID;<\/pre>\n<p>Das Ergebnis ist fast perfekt: Es liefert alle Datens&auml;tze der Abfrage mit den ToDos und die Datens&auml;tze der Tabelle <b>tblZeilen<\/b>. Allerdings soll der Bericht nur 25 Datens&auml;tze anzeigen. Also f&uuml;gen wir eine dritte Abfrage zur Datenbank hinzu, die alle Felder der Abfrage <b>qryRptToDoListeBaseUNION <\/b>enth&auml;lt, aber deren Eigenschaft <b>Spitzenwerte <\/b>auf <b>25 <\/b>eingestellt wurde (s. Bild 14). <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic014.png\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Zurechtstutzen der Ergebnisliste auf 25 Datens&auml;tze<\/span><\/b><\/p>\n<p>Kommen wir zur Gestaltung des Berichts. Dieser sieht im Entwurf wie in Bild 15 aus. Damit allein erhalten Sie aber nur eine Liste der ToDo-Punkte, nicht das Tabellenraster und auch nicht die K&auml;stchen zum Markieren der durchgef&uuml;hrten Pomodori.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/TomatengetriebeneProgrammierung-web-images\/pic015.png\" alt=\"pic015.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 15: Entwurf des Berichts zur Ausgabe der ToDo-Liste<\/span><\/b><\/p>\n<p>Damit diese angezeigt werden, f&uuml;gen Sie dem Ereignis <b>Beim Drucken <\/b>des Detailbereichs des Berichts die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-59-anchor\">Listing 6<\/a><\/span> hinzu.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Hinzuf&uuml;gen von Linien und K&auml;stchen zur ToDo-Liste<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    Dim ctl As control\r\n    Dim lngColor As Long\r\n    Dim i As Integer\r\n    Me.ScaleMode = 1\r\n    For Each ctl In Me.Section(acDetail).Controls\r\n        If Not ctl.Name Like &quot;rct*&quot; And ctl.Visible = True Then\r\n            With ctl\r\n            Me.Line (.Left + .Width, 0)-(.Left + .Width, Me.Height), 0\r\n            End With\r\n        End If\r\n    Next ctl\r\n    With Me\r\n        .Line (0, 0)-(.Width, .Height), 0, B\r\n    End With\r\n    For i = 1 To 10\r\n        If i &lt;= Me.AnzahlPomodori Then\r\n            lngColor = 0\r\n            Me.DrawWidth = 5\r\n        Else\r\n            lngColor = &amp;HAAAAAA\r\n            Me.DrawWidth = 1\r\n        End If\r\n        Me.Line (Me.Bezeichnung.Left + Me.Bezeichnung.Width + 75 + (i - 1) * 300, 120)- _\r\n            (Me.Bezeichnung.Left + Me.Bezeichnung.Width + 75 + (i - 1) * 300 + 200, 320), lngColor, B\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Diese Prozedur wird f&uuml;r jeden Datensatz einmal aufgerufen. Dabei durchl&auml;uft sie zun&auml;chst jedes Mal alle Steuerelemente. Ziel der &Uuml;bung ist es, rechts von den Steuerelementen die vertikale Trennlinie zwischen den Spalten zu platzieren. Dies soll aber nur f&uuml;r die Steuerelemente <b>Bemerkungen <\/b>und <b>Bezeichnung <\/b>geschehen. Beide sind im Gegensatz zum Feld <b>AnzahlPomodori <\/b>sichtbar, also k&ouml;nnen wir die Linien per <b>If<\/b>-Bedingung auf die sichtbaren Steuerelemente im Detailbereich eingrenzen. Die Linien werden mit der <b>Line<\/b>-Methode erzeugt.<\/p>\n<p>Danach sorgt ein einziger weiterer Aufruf der <b>Line<\/b>-Anweisung f&uuml;r die &uuml;brigen Linien, also die am linken und rechten sowie am oberen und unteren Rand. Dies ist m&ouml;glich, weil die <b>Line<\/b>-Methode nicht nur Linien, sondern auch Rechtecke zeichnen kann.<\/p>\n<p>Schlie&szlig;lich f&uuml;gt die Prozedur noch zehn K&auml;stchen hinzu, in die der Benutzer seine Kreuzchen f&uuml;r erledigte Pomodori malen kann. Diese werden ebenfalls mit der <b>Line<\/b>-Methode gezeichnet. Der Clou ist: Innerhalb der Schleife pr&uuml;ft die Prozedur, wie viele Pomodori &uuml;berhaupt noch f&uuml;r die Aufgabe &uuml;brig sind, und markiert diese etwas fetter als die &uuml;brigen der zehn K&auml;stchen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit den hier beschriebenen Techniken k&ouml;nnen Sie eine Aufgabenliste erstellen und diese per ToDo-Liste abarbeiten. Ob Sie dabei die eingangs erw&auml;hnte Pomodoro-Technik einsetzen, bleibt Ihnen &uuml;berlassen &#8211; eine Hilfe zur Abarbeitung von Aufgaben liefert diese L&ouml;sung allemal. In einem weiteren Beitrag namens <b>Grafische Auswertungen <\/b>(<b>www.access-im-unternehmen.de\/785<\/b>) schauen wir uns noch an, auf welche Weise Sie die mit dieser Anwendung gesammelten Daten grafisch aufbereiten k&ouml;nnen.<\/p>\n<p>Und der Beitrag <b>Terminserien erstellen <\/b>(<b>www.access-im-unternehmen.de\/789<\/b>) liefert, wie bereits erw&auml;hnt, detaillierte Informationen dar&uuml;ber, wie Sie dem Benutzer die Erstellung von Terminserien erleichtern k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>PomodoroDB.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{AF781ED1-F158-404F-B2C1-C6D33DBF6FB9}\/aiu_791.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Haben Sie sich schon einmal von einer Tomate beim Programmieren antreiben lassen Falls nicht, haben wir vielleicht eine interessante Methode des Zeitmanagements f&uuml;r Sie. Nat&uuml;rlich nicht, ohne gleichzeitig eine entsprechende Datenbank zur Verwaltung der Ergebnisse zu pr&auml;sentieren. Wenn es Ihnen gef&auml;llt, arbeiten Sie vielleicht demn&auml;chst im 25-Minuten-Rythmus, und wenn nicht, k&ouml;nnen Sie vielleicht Ihre anderen T&auml;tigkeiten mit der hier vorgestellten Datenbank auswerten.<\/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":[662011,66042011,44000027],"tags":[],"class_list":["post-55000791","post","type-post","status-publish","format-standard","hentry","category-662011","category-66042011","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Tomatengetriebene Programmierung - 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\/Tomatengetriebene_Programmierung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tomatengetriebene Programmierung\" \/>\n<meta property=\"og:description\" content=\"Haben Sie sich schon einmal von einer Tomate beim Programmieren antreiben lassen Falls nicht, haben wir vielleicht eine interessante Methode des Zeitmanagements f&uuml;r Sie. Nat&uuml;rlich nicht, ohne gleichzeitig eine entsprechende Datenbank zur Verwaltung der Ergebnisse zu pr&auml;sentieren. Wenn es Ihnen gef&auml;llt, arbeiten Sie vielleicht demn&auml;chst im 25-Minuten-Rythmus, und wenn nicht, k&ouml;nnen Sie vielleicht Ihre anderen T&auml;tigkeiten mit der hier vorgestellten Datenbank auswerten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:57:22+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6\" \/>\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=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Tomatengetriebene Programmierung\",\"datePublished\":\"2020-05-22T21:57:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/\"},\"wordCount\":4518,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/45c15c6e00c949d7833c0f54e4345ef6\",\"articleSection\":[\"2011\",\"4\\\/2011\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/\",\"name\":\"Tomatengetriebene Programmierung - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/45c15c6e00c949d7833c0f54e4345ef6\",\"datePublished\":\"2020-05-22T21:57:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/45c15c6e00c949d7833c0f54e4345ef6\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/45c15c6e00c949d7833c0f54e4345ef6\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tomatengetriebene_Programmierung\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tomatengetriebene Programmierung\"}]},{\"@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":"Tomatengetriebene Programmierung - 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\/Tomatengetriebene_Programmierung\/","og_locale":"de_DE","og_type":"article","og_title":"Tomatengetriebene Programmierung","og_description":"Haben Sie sich schon einmal von einer Tomate beim Programmieren antreiben lassen Falls nicht, haben wir vielleicht eine interessante Methode des Zeitmanagements f&uuml;r Sie. Nat&uuml;rlich nicht, ohne gleichzeitig eine entsprechende Datenbank zur Verwaltung der Ergebnisse zu pr&auml;sentieren. Wenn es Ihnen gef&auml;llt, arbeiten Sie vielleicht demn&auml;chst im 25-Minuten-Rythmus, und wenn nicht, k&ouml;nnen Sie vielleicht Ihre anderen T&auml;tigkeiten mit der hier vorgestellten Datenbank auswerten.","og_url":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:57:22+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Tomatengetriebene Programmierung","datePublished":"2020-05-22T21:57:22+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/"},"wordCount":4518,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6","articleSection":["2011","4\/2011","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/","url":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/","name":"Tomatengetriebene Programmierung - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6","datePublished":"2020-05-22T21:57:22+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/45c15c6e00c949d7833c0f54e4345ef6"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Tomatengetriebene_Programmierung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Tomatengetriebene Programmierung"}]},{"@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\/55000791","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=55000791"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000791\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000791"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000791"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}