{"id":55000669,"date":"2009-06-01T00:00:00","date_gmt":"2020-05-22T22:23:52","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=669"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Softwareprojekte_verwalten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/","title":{"rendered":"Softwareprojekte verwalten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Softwareprojekte sind das A und O von Access-Entwicklern und somit auch f&uuml;r Sie. Es sei denn, Sie schnuppern rein zuf&auml;llig hier herein &#8211; und selbst dann k&ouml;nnen Sie mit der hier vorgestellten L&ouml;sung vielleicht etwas anfangen. Diese soll n&auml;mlich helfen, ein Softwareprojekt in seine Meilensteine, Iterationen, Kundenstories und T&auml;tigkeiten aufzuteilen und deren Abarbeitung zu organisieren.<\/b><\/p>\n<p>Ein Softwareprojekt l&auml;sst sich in den seltensten F&auml;llen und selbst unter Access nicht auf einer Karteikarte darstellen &#8211; und wenn doch, brauchen Sie sicher keine Datenbankanwendung, um ein solches Projekt zu verwalten. Sobald eine Anwendung jedoch aus einigen Tabellen, Abfragen, Formularen, Berichten und dem notwendigen VBA-Code besteht, kann es nicht schaden, das Projekt vern&uuml;nftig zu planen und auch die Fortschritte festzuhalten. Gerade wenn Sie ein Projekt f&uuml;r einen Kunden entwickeln, werden Sie keine ungenauen Prognosen bez&uuml;glich des zeitlichen und finanziellen Aufwands machen und den Kunden bei Abweichungen entt&auml;uschen wollen.<\/p>\n<p>Es ist daher immer sinnvoll, ein Projekt in der Entwurfsphase so genau wie m&ouml;glich zu skizzieren, was am einfachsten geht, wenn Sie die Anforderungen genau kennen. Deren Erfassung soll nicht Thema dieses Beitrags sein, sondern lediglich deren Umwandlung in eine Form, die Sie mit der hier vorgestellten L&ouml;sung verwalten k&ouml;nnen. Zugrunde liegen sollten die Informationen jedoch in der folgenden Aufgliederung:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Kundenstories: Sie und der Kunde m&uuml;ssen wissen, welche Aufgaben die Benutzer mit der Anwendung erledigen sollen. Dies erfassen Sie grob in Form von Kundenstories, die aus einem Titel und einer kurzen Beschreibung bestehen, zum Beispiel &#8222;Kunde anlegen&#8220; und &#8222;Der Benutzer legt einen neuen Kunden mit Adresse und Ansprechpartner an&#8220;.<\/li>\n<li class=\"aufz-hlung\">Meilensteine: Die daraus resultierende Menge von Kundenstories wird auf verschiedene Meilensteine aufgeteilt. Warum nicht nur ein Meilenstein, der alle Funktionen enth&auml;lt Nun: Kunden wollen schnell produktiv mit ihrer Software arbeiten, also entscheiden Sie zusammen mit dem Kunden, mit welchen Kundenstories sich eine sinnvoll einsetzbare Software entwickeln l&auml;sst, und erkl&auml;ren dies zu Meilenstein 1. Den Rest verteilen Sie auf weitere Meilensteine, zu denen Sie die Software um die &uuml;brigen Funktionen anreichern.<\/li>\n<li class=\"aufz-hlung\">Iterationen: Meilensteine hei&szlig;en nicht umsonst Meilensteine und nicht Metersteine, weil zwischen ihnen ein ordentlicher, genau definierter Fortschritt erfolgen soll. Vom Start der Softwareentwicklung bis zum ersten Meilenstein ist es aber oft ein weiter Weg, auf dem vieles schiefgehen kann. Also planen Sie kleinere Zwischenstationen ein, sogenannte Iterationen. Diese sollten eine &uuml;berschaubare Anzahl aufweisen und in regelm&auml;&szlig;igen Abst&auml;nden erfolgen. Eine Iteration entspricht hier einer Vorf&uuml;hrung des Zwischenstands der Software, der noch nicht alle f&uuml;r den jeweils n&auml;chsten Meilenstein geplanten Elemente enth&auml;lt, aber dennoch funktionst&uuml;chtige Abschnitte pr&auml;sentiert. Die Betonung liegt hier auf &#8222;funktionieren&#8220; im Gegensatz zu &#8222;perfekt sein&#8220;: Der Kunde soll sich hier ein Bild von den bereits fertigen Elementen machen und dem Entwickler Feedback liefern, ob man sich auf dem richtigen Weg befindet oder die Richtung ge&auml;ndert werden muss.<\/li>\n<li class=\"aufz-hlung\">Aufgaben: Eine Kundenstory beschreibt ein funktionierendes Element der Anwendung, dessen Erstellung aber eine ganze Reihe von Schritten umfassen kann, die wiederum in Aufgaben resultieren. Aufgaben sind die kleinsten Einheiten in der Projektplanung. Die Aufgaben f&uuml;r die Kundenstory &#8222;Kunde anlegen&#8220; hei&szlig;en beispielsweise &#8222;Kundentabelle anlegen&#8220;, &#8222;Formular zum Anlegen von Kunden erstellen&#8220; oder &#8222;Funktion zur Validierung der Kundendaten erstellen&#8220;. Aufgaben sollten so elementar aufgebaut sein, dass man sie in m&ouml;glichst kurzen Zeitr&auml;umen erledigen kann &#8211; also beispielsweise in einer oder wenigen Stunden. Dies hat den Vorteil, dass Sie Ihren Fortschritt erkennen und Aufgaben abhaken k&ouml;nnen, was eine gute Motivationshilfe sein kann. Denken Sie einmal daran, als Sie das letzte Mal tagelang an einer umfangreichen Aufgabe arbeiteten und einfach nicht fertig wurden &#8211; wenn Sie diese in kleine H&auml;ppchen aufteilen und diese St&uuml;ck f&uuml;r St&uuml;ck abhaken k&ouml;nnen, ist viel schneller Land in Sicht.<\/li>\n<\/ul>\n<p>Die Aufteilung, wie Sie sie hier vorfinden, lehnt sich an das Buch <b>Softwareentwicklung von Kopf bis Fu&szlig; <\/b>an (O&euro;Reilly, ISBN 978-3-89721-862-8). Es vermittelt Wissen zum Thema Softwareentwicklung auf witzige Weise, ohne sich auf spezielle Entwicklungsumgebungen festzulegen. Wenn Sie mehr zur Planung von Softwareprojekten erfahren m&ouml;chten, schauen Sie beim n&auml;chsten Besuch Ihrer Lieblingsbuchhandlung einfach einmal hinein, es lohnt sich wirklich.<\/p>\n<p>Die vorliegende L&ouml;sung k&ouml;nnen Sie nat&uuml;rlich auch ohne die Lekt&uuml;re dieses Buchs einsetzen. Sie besteht im Wesentlichen aus einem Formular mit einem <b>TreeView<\/b>-Steuerelement, mit dem Sie die oben genannten Elemente einer Softwareentwicklung verwalten k&ouml;nnen. Das oberste Element ist dabei das Projekt selbst. Darunter finden Sie, hierarchisch untereinander angeordnet, die Meilensteine, Iterationen, Kundenstories und Aufgaben.<\/p>\n<p>&Uuml;ber Kontextmen&uuml;eintr&auml;ge stellt das <b>TreeView<\/b>-Steuerelement Funktionen zum Anlegen untergeordneter Elemente und zum L&ouml;schen der Elemente selbst bereit. In einem Bereich rechts des TreeView-Steuerelements finden Sie Informationen zum jeweils aktivierten Eintrag.<\/p>\n<p>Damit sich auch der oben angesprochene Motivationseffekt einstellt, gibt es f&uuml;r die Aufgaben auch einen Kontextmen&uuml;eintrag, mit dem sich eine Aufgabe als &#8222;in Arbeit&#8220; und als &#8222;erledigt&#8220; abhaken l&auml;sst. Beides f&uuml;hrt zur Anzeige eines ver&auml;nderten Symbols des jeweiligen Eintrags. Sind alle Aufgaben einer Kundenstory erledigt, erh&auml;lt auch diese ein entsprechendes Symbol.<\/p>\n<p>Aber die L&ouml;sung soll nicht nur beim Erledigen der Aufgaben selbst helfen, sondern auch bei der Planung des Aufwands und somit bei der Kalkulation. In Anlehnung an oben erw&auml;hntes Buch k&ouml;nnen Sie auf zwei Ebenen den geplanten Aufwand eintragen: auf der Kundenstory-Ebene und auf Aufgaben-Ebene.<\/p>\n<p>Zu Beginn eines Projekts werden Sie sich noch keine Gedanken &uuml;ber die einzelnen Aufgaben machen, die zur Implementierung der f&uuml;r eine Kundenstory n&ouml;tigen Funktionen f&uuml;hren, sondern zun&auml;chst grob absch&auml;tzen, wieviel Aufwand die Umsetzung der Kundenstory selbst erfordert. Die Summe dieser Aufw&auml;nde ergibt eine Grobkalkulation des Projekts, auf deren Basis die grunds&auml;tzliche Entscheidung &uuml;ber die Durchf&uuml;hrung erfolgen kann. Sp&auml;ter werden Sie die einzelnen Aufgaben definieren und deren Aufwand absch&auml;tzen. Meilensteine, Iterationen und Kundenstories sollen dann jeweils die Kalkulation auf Basis der groben Absch&auml;tzung der Kundenstories und zus&auml;tzlich die verfeinerte, auf den Aufgaben basierende Berechnung liefern.<\/p>\n<p>Als Letztes sollen die Entwickler noch den tats&auml;chlichen Aufwand f&uuml;r die Durchf&uuml;hrung einer Aufgabe eintragen, um eine Nachkalkulation zu erm&ouml;glichen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zus&auml;tzliche Kundenstories und Aufgaben<\/p>\n<p>Nat&uuml;rlich kann und wird es passieren, dass Kundenstories hinzukommen, wegfallen oder sich &auml;ndern und dadurch Aufgaben neu organisiert werden m&uuml;ssen. Die Projektverwaltung soll dazu eine Funktion enthalten, mit der Sie die Planungsphase f&uuml;r das Projekt f&uuml;r beendet erkl&auml;ren k&ouml;nnen. Neu hinzugef&uuml;gte Elemente werden dann speziell gekennzeichnet, gel&ouml;schte Elemente ebenfalls &#8211; nur k&ouml;nnen diese auch noch ausgeblendet werden.<\/p>\n<p>Dies dient vor allem dazu, dass der Entwickler dem Kunden erkl&auml;ren kann, warum das Projekt pl&ouml;tzlich zeitintensiver und teurer wird als geplant.<\/p>\n<p><b>Mehrbenutzerf&auml;higkeit<\/b><\/p>\n<p>Bei gro&szlig;en Softwareprojekten sind meist mehrere Softwareentwickler involviert. Aber Access ist nicht gerade f&uuml;r die Entwicklung mit mehreren Personen optimiert und die Erfahrung zeigt, dass die meisten Projekte von Einzelk&auml;mpfern durchgef&uuml;hrt werden. Wir verzichten daher zun&auml;chst auf die Einrichtung einer zus&auml;tzlichen Tabelle zum Speichern mehrerer Benutzer und auf Funktionen zum Zuteilen von Aufgaben an diese Benutzer.<\/p>\n<p><b>Datenmodell<\/b><\/p>\n<p>Das Datenmodell besteht aus einigen hierarchisch verschachtelten Tabellen (siehe Bild 1). Die oberste Tabelle in der Hierarchie hei&szlig;t <b>tblProjekte<\/b>. Sie enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld lediglich ein Feld zum Speichern des Projektnamens sowie ein Feld namens <b>PlanungAbgeschlossenAm<\/b>. Nach diesem Zeitpunkt hinzugef&uuml;gte Elemente sollen zur besseren Nachvollziehbarkeit von &auml;nderungen, die w&auml;hrend des Projekts erfolgen, entsprechend gekennzeichnet werden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Das Datenmodell der Softwareprojektverwaltung<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblMeilensteine <\/b>ist &uuml;ber das Feld <b>ProjektID <\/b>mit dem Prim&auml;rschl&uuml;sselfeld der Projekte-Tabelle verkn&uuml;pft und enth&auml;lt eine Bezeichnung und das Datum des Meilensteins.<\/p>\n<p>Die Tabelle <b>tblIterationen <\/b>ist genauso aufgebaut, aber mit der Tabelle <b>tblMeilensteine <\/b>verkn&uuml;pft. Gleiches gilt f&uuml;r die Tabelle <b>tblKundenstories<\/b>, die &uuml;ber das Fremdschl&uuml;sselfeld <b>IterationID <\/b>mit der Tabelle <b>tblIterationen <\/b>verkn&uuml;pft ist.<\/p>\n<p>Interessant wird es bei der Tabelle <b>tblAufgaben<\/b>, die wiederum mit <b>tblKundenstories <\/b>verkn&uuml;pft ist. Sie enth&auml;lt ebenfalls die beiden Felder <b>Titel <\/b>und <b>Beschreibung <\/b>sowie Felder namens <b>GeschaetzterAufwand <\/b>und <b>TatsaechlicherAufwand<\/b>, die eine Angabe des Aufwands in Stunden erwarten (eine exakte Erfassung der einzelnen Zeiten, zu denen sich der Entwickler mit der Aufgabe besch&auml;ftigt, ist hier zun&auml;chst nicht geplant).<\/p>\n<p>Das Feld <b>FertiggestelltAm <\/b>erh&auml;lt das Datum, an dem der Entwickler diese Aufgabe erledigt hat &#8211; damit das Symbol des entsprechenden TreeView-Elements auch ein nettes &#8222;Erledigt&#8220;-H&auml;kchen bekommt und der Entwickler sich frohen Mutes der n&auml;chsten Aufgabe zuwenden kann. Damit der Entwickler einen &Uuml;berblick &uuml;ber den Fortschritt gewinnen kann, gibt es noch ein Feld namens <b>ProzentFertiggestellt<\/b>, das Werte von 0 % bis 100 % in Zehnerschritten annimmt.<\/p>\n<p>Alle Tabellen erhalten ein Feld namens <b>ReihenfolgeID<\/b>, das zur Sortierung der Datens&auml;tze im TreeView-Steuerelement und dar&uuml;ber zum Festlegen der Priorit&auml;t genutzt werden kann. Au&szlig;erdem erhalten alle Tabellen die Felder <b>AngelegtAm <\/b>und <b>GeloeschtAm<\/b>.<\/p>\n<p>Alle Tabellen besitzen au&szlig;erdem Felder, die f&uuml;r die Anzeige im TreeView-Steuerelement n&ouml;tig sind. Das Feld <b>Image <\/b>gibt den Namen einer Bilddatei an, die zum Zeitpunkt der Anzeige in einem entsprechenden ImageList-Steuerelement vorliegen muss &#8211; dazu weiter unten mehr. Au&szlig;erdem gibt es je ein Feld namens <b>Expanded<\/b>, das angibt, ob das zum Datensatz geh&ouml;rende TreeView-Element seine Unterelemente anzeigen oder verbergen soll.<\/p>\n<p><b>Formular zur Verwaltung der Softwareprojekte<\/b><\/p>\n<p>Das Formular soll <b>frmSoftwareprojektverwaltung <\/b>hei&szlig;en und f&uuml;rs Erste lediglich drei Steuerelemente enthalten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">ein <b>ImageList<\/b>-Steuerelement namens <b>ctlImageList<\/b> zum Speichern der Bilddateien, die als Icons im <b>TreeView<\/b>-Steuerelement angezeigt werden sollen,<\/li>\n<li class=\"aufz-hlung\">ein <b>TreeView<\/b>-Steuerelement namens <b>ctlTreeView <\/b>(Sie brauchen hier keine Eigenschaften anzupassen, dies erledigen wir sp&auml;ter) und<\/li>\n<li class=\"aufz-hlung\">ein Unterformular-Steuerelement namens <b>sfm<\/b>.<\/li>\n<\/ul>\n<p>Ordnen Sie die Steuerelemente wie in Bild 2 und passen Sie Gr&ouml;&szlig;e und Ausrichtung gro&szlig;z&uuml;gig an. Das <b>ImageList<\/b>-Steuerelement ist sp&auml;ter unsichtbar und kann an beliebiger Stelle platziert werden. Access 2007-Benutzer nutzen die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker<\/b>, damit sich die Steuerelemente automatisch mit dem Formular vergr&ouml;&szlig;ern.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Steuerelemente der Softwareprojektverwaltung<\/span><\/b><\/p>\n<p>Mit dem TreeView-Steuerelement f&uuml;gen Sie dem VBA-Projekt der Anwendung einen Verweis auf die Bibliothek <b>Microsoft Windows Common Controls 6.0<\/b> hinzu; zus&auml;tzlich ben&ouml;tigen Sie einen Verweis auf die Bibliothek <b>Microsoft Office x.0 Object Library<\/b>, die das <b>CommandBars<\/b>-Objektmodell f&uuml;r die Programmierung von Kontextmen&uuml;s liefert.<\/p>\n<p><b>TreeView-Konfigurator<\/b><\/p>\n<p>Unter uns gesagt w&uuml;rde die Beschreibung der Ausstattung des TreeViews inklusive F&uuml;llung und Funktionen, wie Drag and Drop sowie der restlichen Elemente des gew&uuml;nschten Formulars und die Synchronisierung zwischen TreeView und Formular, den Rahmen dieses Beitrags bei Weitem sprengen.<\/p>\n<p>Zum Gl&uuml;ck stellen wir im Beitrag <b>TreeView-Konfigurator <\/b>(s. Shortlink 667) ein Tool vor, mit dem das Programmieren des TreeViews viel einfacher vonstatten geht &#8211; Sie brauchen hier beispielsweise nicht selbst das F&uuml;llen des TreeViews, das Anzeigen von Kontextmen&uuml;s oder Drag and Drop zu implementieren.<\/p>\n<p>Alles, was Sie tun m&uuml;ssen, ist das Importieren der im oben erw&auml;hnten Beitrag genannten Access-Objekte, welche die Funktionalit&auml;t und die Benutzeroberfl&auml;che f&uuml;r das einfache F&uuml;llen des TreeViews mitbringen.<\/p>\n<p><b>TreeView mit Leben f&uuml;llen<\/b><\/p>\n<p>F&uuml;gen Sie dem Formular eine Prozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>hinzu. Diese dient als Ausgangspunkt f&uuml;r das Initialisieren und F&uuml;llen des TreeView-Steuerelements.<\/p>\n<p>Erweitern Sie die Prozedur wie folgt und deklarieren Sie au&szlig;erdem die modulweit g&uuml;ltige Variable <b>objTreeViewHandler<\/b>:<\/p>\n<pre>Private WithEvents objTreeViewHandler As &micro;\r\nclsTreeViewHandler\r\nPrivate Sub Form_Load()\r\n    Set objTreeViewHandler = New clsTreeViewHandler\r\n    With objTreeViewHandler\r\n    Set .TreeViewInst = Me.ctlTreeView.Object\r\n    Set .ImageListInst = Me.ctlImageList.Object\r\n    .InitTreeView (3)\r\n    .LineStyle = tvwTreeLines\r\n    .FillTree\r\n    End With\r\n    Me.sfm.SourceObject = \"sfmProjekte&euro;\r\n    End Sub<\/pre>\n<p>Im Gegensatz zur Vorgehensweise bei der direkten Programmierung des TreeView-Steuerelements brauchen Sie hier noch nicht einmal eine Objektvariable f&uuml;r dieses Element anzulegen.<\/p>\n<p>Die erste Anweisung weist der Objektvariablen <b>objTreeView <\/b>einen Verweis auf das entsprechende Steuerelement des Formulars zu, die beiden Folgenden initialisieren und f&uuml;llen das TreeView-Steuerelement. Das Initialisieren ersetzt die Einstellungen, die Sie normalerweise im <b>Eigenschaften<\/b>-Dialog des TreeView-Steuerelements vornehmen w&uuml;rden. Dies hat rein praktische Gr&uuml;nde: Sie brauchen nicht lange in den Eigenschaften herumzuspielen, sondern k&ouml;nnen einfach die Routine <b>InitTreeView <\/b>in die Zielanwendung kopieren und sie anpassen. Sollten die Eigenschaften des TreeView-Steuerelements nicht Ihren Vorstellungen entsprechen, k&ouml;nnen Sie diese sp&auml;ter &uuml;ber die Eigenschaften der Klasse <b>clsTreeViewHandler <\/b>anpassen.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Unterformular f&uuml;r die Projekt&uuml;bersicht<\/b><\/p>\n<p>Damit das Formular im aktuellen Zustand &uuml;berhaupt funktioniert, brauchen Sie erstens ein Unterformular namens <b>sfmProjekte<\/b>, dem Sie die Tabelle <b>tblProjekte <\/b>als Datenherkunft zuweisen und dessen Detailbereich Sie mit den beiden Feldern <b>ID <\/b>und <b>Projekt <\/b>der Datenherkunft f&uuml;llen (siehe Bild 3). Stellen Sie au&szlig;erdem die Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>ein.<\/p>\n<p>Die zweite Aktion, die notwendig ist, damit Sie das Formular &uuml;berhaupt ohne Fehler &ouml;ffnen k&ouml;nnen, ist das Anlegen eines TreeViews im TreeView-Konfigurator, den Sie dazu erstmalig &ouml;ffnen &#8211; und zwar in Form des Formulars <b>frmTreeViewConf<\/b>. Dort klicken Sie auf <b>TreeView neu anlegen <\/b>und geben im nun erscheinenden Dialog die Bezeichnung <b>Softwareprojektverwaltung <\/b>ein (siehe Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Das Unterformular sfmProjekte in der Entwurfsansicht<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Anlegen des neuen TreeViews im TreeView-Konfigurator<\/span><\/b><\/p>\n<p>Links unter dem Kombinationsfeld mit dem Namen des neuen TreeViews finden Sie eine <b>ID<\/b> (zum Beispiel <b>3<\/b>), die Sie nun in die folgende Zeile der oben bereits vorgestellten Prozedur <b>Form_Load <\/b>eintragen:<\/p>\n<pre>.InitTreeView (3)<\/pre>\n<p>&Ouml;ffnen Sie nun das neue Formular <b>frmSoftwareprojektverwaltung<\/b>, sollte Access eine Meldung mit dem Text <b>Die Konfiguration enth&auml;lt noch keine Tabellen zum F&uuml;llen des TreeView-Steuerelements <\/b>anzeigen, nach deren Best&auml;tigung das Formular mit leerem TreeView-Steuerelement erscheint.<\/p>\n<p><b>Tabellen in den Baum<\/b><\/p>\n<p>Nun beginnen wir mit dem F&uuml;llen des Baums. Der erste Schritt ist einfach: Sie legen eine Dummy-Tabelle namens <b>tblRoot<\/b> an, die wie in Bild 5 aufgebaut ist.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Die Dummy-Tabelle liefert das Root-Element f&uuml;r das TreeView-Steuerelement.<\/span><\/b><\/p>\n<p>Dann &ouml;ffnen Sie erneut den TreeView-Konfigurator und f&uuml;gen der Konfiguration mit einem Klick auf die Schaltfl&auml;che <b>Neue Tabelle <\/b>eine neue Tabelle hinzu. F&uuml;llen Sie die folgenden Felder aus:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ThisTable<\/b>: <b>tblRoot<\/b><\/li>\n<li class=\"aufz-hlung\"><b>KeyChar<\/b>: <b>r<\/b><\/li>\n<li class=\"aufz-hlung\"><b>PKIDField<\/b>: <b>ID<\/b><\/li>\n<li class=\"aufz-hlung\"><b>NodetextField<\/b>: <b>Root<\/b><\/li>\n<li class=\"aufz-hlung\"><b>NodeImageField<\/b>: <b>Image<\/b><\/li>\n<li class=\"aufz-hlung\"><b>NodeExpandedField<\/b>: <b>Expanded<\/b><\/li>\n<\/ul>\n<p>Klicken Sie auf <b>Tabelle speichern<\/b>, damit sich die Anzeige der Liste der im TreeView enthaltenen Tabellen im oberen Bereich des TreeView-Konfigurators aktualisiert, und schlie&szlig;en Sie diesen. Wenn Sie nun das Formular <b>frmSoftwareprojektverwaltung <\/b>&ouml;ffnen, erscheint bereits der erste Knoten des TreeViews.<\/p>\n<p><b>Kontextmen&uuml; hinzuf&uuml;gen<\/b><\/p>\n<p>Bevor wir weitere Elemente einbauen, f&uuml;gen wir nun zun&auml;chst ein Kontextmen&uuml; zum Root-Element hinzu, mit dem wir ein erstes Projekt in der Datenbank anlegen k&ouml;nnen.<\/p>\n<p>&Ouml;ffnen Sie erneut den TreeView-Konfigurator, w&auml;hlen Sie die Tabelle <b>tblRoot <\/b>aus und f&uuml;gen Sie im unteren Bereich einen Eintrag mit den folgenden Werten hinzu:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ContextmenuCaption<\/b>: <b>Projekt hinzuf&uuml;gen<\/b><\/li>\n<li class=\"aufz-hlung\"><b>ContextmenuParameter<\/b>: <b>Add<\/b><\/li>\n<\/ul>\n<p>Wenn Sie das Formular <b>frmSoftwareprojektverwaltung <\/b>nun erneut &ouml;ffnen und mit der rechten Maustaste auf den Eintrag <b>Projekte <\/b>klicken, erscheint das Kontextmen&uuml; aus Bild 6. Wie f&uuml;llen wir dieses nun mit Leben Nun, zun&auml;chst einmal brauchen Sie ein kleines Formular, mit dem Sie die Kerndaten des neuen Projekts anlegen k&ouml;nnen. Dieses sieht ganz einfach wie in Bild 7 aus, hei&szlig;t <b>frmProjektNeu <\/b>und enth&auml;lt verh&auml;ltnism&auml;&szlig;ig wenig Code. Den Beginn macht die Prozedur <b>Form_Open<\/b>, die das Formular gleich beim &Ouml;ffnen ausl&ouml;st:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic006_opt.jpeg\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Ein Kontextmen&uuml;eintrag, zun&auml;chst noch ohne Wirkung<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic007_opt.jpeg\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Formular zum Anlegen von Projekten<\/span><\/b><\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Me!RootID.DefaultValue = Me.OpenArgs\r\n    End Sub<\/pre>\n<p>Sie weist dem Fremdschl&uuml;sselfeld <b>RootID <\/b>der Tabelle <b>tblProjekte <\/b>den Wert als Standardwert hinzu, der mit dem &Ouml;ffnungsargument an das Formular &uuml;bergeben wurde &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Die Schaltfl&auml;che <b>Abbrechen <\/b>sorgt schlicht f&uuml;r das Schlie&szlig;en des Formulars:<\/p>\n<pre>Private Sub cmdCancel_Click()\r\n    DoCmd.Close acForm, Me.Name\r\n    End Sub<\/pre>\n<p>Die <b>OK<\/b>-Schaltfl&auml;che hingegen blendet das Formular aus, damit die aufrufende Routine es auswerten kann:<\/p>\n<pre>Private Sub cmdOK_Click()\r\n    Me.Visible = False\r\n    End Sub<\/pre>\n<p><b>Kontextmen&uuml; mit Funktion versehen<\/b><\/p>\n<p>Jetzt m&uuml;ssen Sie dem Kontextmen&uuml; nur noch beibringen, das Formular zu &ouml;ffnen. Dazu nutzen Sie eine Ereignisprozedur der Klasse <b>clsTreeViewConf<\/b>, die Sie &uuml;ber die Auswahl von <b>objTreeViewConf <\/b>und <b>ShortcutMenuClick <\/b>in den beiden Kombinationsfeldern des VBA-Fensters mit dem Klassenmodul des Formulars <b>frmSoftwareprojektverwaltung <\/b>anlegen.<\/p>\n<p>Die Prozedur f&uuml;llen Sie wie in Listing 1. Die Ereignisprozedur liefert &uuml;ber ihre Parameter jede Menge Informationen woher der Aufruf kommt. <b>strParameter <\/b>liefet den Wert <b>Add<\/b>, den Sie im TreeView-Konfigurator f&uuml;r das Root-Element eingetragen haben. Die &uuml;brigen offerieren den Namen der Tabelle, aus welcher das Element stammt, sowie den Prim&auml;rschl&uuml;sselnamen und -wert des entsprechenden Datensatzes. Die <b>Select Case<\/b>-Bedingung pr&uuml;ft den Inhalt von <b>strThisTable <\/b>und verzweigt an die entsprechende Stelle, wobei hier zun&auml;chst noch per Code die untergeordnete Tabelle, also <b>tblProjekte<\/b>, und das zum Anlegen eines neuen Datensatzes n&ouml;tige Formular festgelegt werden.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Aufrufen eines Formulars per Kontextmen&uuml;<\/p>\n<pre>Private Sub objTreeViewHandler_ShortcutMenuClick(strParameter As String, strThisTable As String, _\r\n    strPKID As String, lngPKIDValue As Long)\r\n    Dim strAddForm As String\r\n    Dim strChildTable As String\r\n    Select Case strParameter\r\n    Case \"Add\"\r\n    Select Case strThisTable\r\n    Case \"tblRoot\"\r\n    strAddForm = \"frmProjektNeu\"\r\n    strChildTable = \"tblProjekte\"\r\n    End Select\r\n    DoCmd.OpenForm strAddForm, WindowMode:=acDialog, DataMode:=acFormAdd, _\r\n    OpenArgs:=objTreeViewHandler.PKIDValue\r\n    If IstFormularGeoeffnet(strAddForm) Then\r\n        lngPKIDValue = Forms(strAddForm)(strPKID)\r\n        DoCmd.Close acForm, strAddForm\r\n        objTreeViewHandler.NewChildNode strChildTable, lngPKIDValue\r\n    End If\r\n    End Select\r\n    End Sub<\/pre>\n<p>Dieses hei&szlig;t nat&uuml;rlich <b>frmProjektNeu <\/b>und wird mit den Argumenten gef&uuml;ttert, die dazu f&uuml;hren, dass es einen neuen, leeren Datensatz anlegt, aber den Standardwert des Fremdschl&uuml;sselfelds <b>RootID <\/b>bereits mit dem Prim&auml;rschl&uuml;sselwert des Datensatzes hinter dem aufrufenden TreeView-Element best&uuml;ckt.<\/p>\n<p>Nach dem Ausf&uuml;llen und Schlie&szlig;en pr&uuml;ft die Routine, die w&auml;hrend der Anzeige des Formulars angehalten wurde, ob das Formular noch offen ist &#8211; ein Indiz daf&uuml;r, dass der Benutzer es nicht &uuml;ber die <b>Abbrechen<\/b>-Schaltfl&auml;che geschlossen, sondern lediglich &uuml;ber die <b>OK<\/b>-Schaltfl&auml;che unsichtbar geschaltet hat.<\/p>\n<p>Fertig &#8211; der neue Datensatz muss nur noch im TreeView erscheinen, was eigentlich durch diese Zeile geschehen sollte, welche die Methode <b>NewChildNode <\/b>mit dem Namen der Quelltabelle und dem Wert des Prim&auml;rschl&uuml;sselfelds aufruft:<\/p>\n<pre>objTreeViewHandler.NewChildNode &micro;\r\nstrChildTable, lngPKIDValue<\/pre>\n<p>Es geschieht aber nichts &#8211; und auch das Schlie&szlig;en und erneute &Ouml;ffnen des Formulars <b>frmSoftwareprojektverwaltung <\/b>schafft keine Besserung. Der Grund ist einfach: Die Tabelle <b>tblProjekte <\/b>ist noch nicht im TreeView-Konfigurator definiert, was wir nun nachholen.<\/p>\n<p>&Ouml;ffnen Sie also den TreeView-Konfigurator, klicken Sie auf <b>Neue Tabelle <\/b>und legen Sie ihre Eigenschaften wie in Bild 8 fest. Im Unterschied zur zuvor festgelegten Tabelle <b>tblRoot <\/b>definieren Sie hier auch <b>ParentTable <\/b>und <b>FKIDField<\/b>, was der &uuml;bergeordneten Tabelle, also <b>tblRoot<\/b>, und dem Fremdschl&uuml;sselfeld der Tabelle <b>tblProjekte <\/b>f&uuml;r die Verkn&uuml;pfung mit <b>tblRoot <\/b>entspricht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic008_opt.jpeg\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Eigenschaften der Tabelle tblProjekte f&uuml;r das TreeView<\/span><\/b><\/p>\n<p>Beim n&auml;chsten &Ouml;ffnen zeigt das Formular <b>frmSoftwareprojektverwaltung <\/b>nun auch die neuen Projekt-Knoten an (die Stellen, an denen normalerweise Images erscheinen sollten, bleiben noch leer &#8211; darum k&uuml;mmern wir uns sp&auml;ter).<\/p>\n<p>Beachten Sie, welche Aufgaben die Klasse <b>clsTreeViewConf<\/b> alle &uuml;bernommen hat:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie hat einen neuen Datensatz in der Tabelle <b>tblProjekte <\/b>angelegt, der die passende Bezeichnung und den richtigen Fremdschl&uuml;sselwert enth&auml;lt.<\/li>\n<li class=\"aufz-hlung\">Sie hat das Element zum TreeView hinzugef&uuml;gt.<\/li>\n<li class=\"aufz-hlung\">Sie hat, wenn Sie f&uuml;r die Tabelle ein Sortierfeld angegeben haben, das entsprechende Feld des neuen Datensatzes gef&uuml;llt (hier <b>ReihenfolgeID<\/b>) &#8211; und die Werte der bereits vorhandenen Datens&auml;tze gegl&auml;ttet.<\/li>\n<\/ul>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Daten zum TreeView-Element im Unterformular anzeigen<\/p>\n<p>Wenn Sie auf den neuen Projektknoten klicken, w&uuml;rden Sie wohl gern auch die Details zu diesem Projekt im Unterformular neben dem TreeView-Steuerelement sehen. Dort tut sich allerdings noch nichts. Zum Gl&uuml;ck liefert die Klasse <b>clsTreeViewConf <\/b>auch hierf&uuml;r eine Ereignisprozedur. Diese legen Sie im Klassenmodul des Formulars <b>frmSoftwareprojektverwaltung <\/b>wie in Bild 9 an. Das Ereignis liefert einen Verweis auf das angeklickte Element, die dahinterstehende Tabelle, den Namen des Prim&auml;rschl&uuml;sselfeldes sowie dessen Wert. Im Falle des Root-Elements soll einfach nur das &Uuml;bersichtsformular angezeigt werden, das auch bereits beim &Ouml;ffnen des Formulars eingeblendet wird. Mehr als den Namen der zugrunde liegenden Tabelle braucht der entsprechende <b>Case<\/b>-Zweig nicht, um das Formular <b>sfmProjekte <\/b>als Unterformular festzulegen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic009_opt.jpeg\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Dieses Ereignis wird beim Anklicken eines TreeView-Elements ausgel&ouml;st.<\/span><\/b><\/p>\n<p>Beim Projekte-Unterformular sieht das anders aus: Dieses soll keine &Uuml;bersicht aller Projekte, sondern nur die Daten eines speziellen Projekts anzeigen &#8211; n&auml;mlich jenes, auf das der Benutzer soeben geklickt hat. Dazu filtern die folgenden beiden Anweisungen noch die Datenherkunft des Formulars. Die Zeile<\/p>\n<pre>.Form.Filter = strPKID &amp; \" = \" &amp; lngPKID<\/pre>\n<p>setzt aus dem Inhalt der Variablen <b>strPKID <\/b>und <b>lngPKID <\/b>ein Filterkriterium wie das folgende zusammen:<\/p>\n<pre>ID = 12<\/pre>\n<p><b>Unterformular f&uuml;r Projekte erstellen<\/b><\/p>\n<p>Nat&uuml;rlich k&ouml;nnen wir kein Projekt in einem Unterformular abbilden, das es noch nicht gibt. Also bauen wir schnell eines zusammen, das die Tabelle <b>tblProjekte <\/b>als Datenherkunft besitzt und im Entwurf wie in Bild 10 aussieht. Sie sehen hier nicht ausschlie&szlig;lich Felder, die in der Tabelle <b>tblProjekte<\/b> enthalten sind, sondern auch einige ungebundene Textfelder. Diese sollen die in den weiter unten in der Hierarchie befindlichen Aufgaben enthaltenen Informationen, wie den geplanten Aufwand, den tats&auml;chlichen Aufwand, den aktuellen Fortschritt und das Fertigstellungsdatum f&uuml;r das komplette Projekt, zusammenrechnen. Diese Informationen werden &uuml;ber eine Abfrage ermittelt, die im Ereignis <b>Beim Anzeigen <\/b>ausgewertet wird &#8211; mehr dazu sp&auml;ter. Das Formular hei&szlig;t &uuml;brigens <b>sfmProjekt <\/b>(man achte auf den Singular im Vergleich zum weiter oben verwendeten Formular <b>sfmProjekte<\/b>).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic010_opt.jpeg\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Das Formular sfmProjekt in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Schlie&szlig;en und &ouml;ffnen Sie das Formular <b>frmSoftwareprojektverwaltung<\/b>, um sich von der Funktion des Mausklicks auf ein Projekt-Element und der anschlie&szlig;enden Anzeige des entsprechenden Unterformulars zu &uuml;berzeugen.<\/p>\n<p><b>Projekte l&ouml;schen<\/b><\/p>\n<p>Zum L&ouml;schen von Projekten brauchen wir einen weiteren Kontextmen&uuml;eintrag, den Sie im TreeView-Konfigurator f&uuml;r die Tabelle <b>tblProjekte <\/b>mit den Werten <b>Projekt l&ouml;schen <\/b>f&uuml;r das Feld <b>ContextmenuCaption <\/b>und <b>Delete <\/b>f&uuml;r das Feld <b>ContextmenuParameter <\/b>anlegen. Warum f&uuml;r die Tabelle <b>tblProjekte <\/b>und nicht f&uuml;r <b>tblRoot<\/b> Anders ginge es nicht: Der Eintrag soll ja in Zusammenhang mit dem jeweiligen Projekt-Element erscheinen, allein damit Sie dessen Daten (Tabellenname, Prim&auml;rschl&uuml;sselfeld, Prim&auml;rschl&uuml;sselwert) in der entsprechenden Ereignisprozedur verarbeiten k&ouml;nnen.<\/p>\n<p>Die Ereignisprozedur ist die aus Listing 1. Sie brauchen dort nur einen neuen <b>Case<\/b>-Zweig einzubauen. Dieser sieht so aus:<\/p>\n<pre>Case \"Delete\"\r\nIf MsgBox(\"M&ouml;chten Sie das Element &micro;\r\nwirklich l&ouml;schen\", vbYesNo + &micro;\r\nvbExclamation, \"Element l&ouml;schen\") &micro;\r\n= vbYes Then\r\nobjTreeViewHandler.DeleteCurrentNode\r\nEnd If<\/pre>\n<p>Die Routine fragt einfach nach, ob das Element gel&ouml;scht werden soll, und f&uuml;hrt dies gegebenenfalls durch einen einfachen Aufruf der Methode <b>DeleteCurrentNode <\/b>durch. Weitere Parameter braucht die Routine hier nicht, weil das aktuelle Element intern alle n&ouml;tigen Informationen liefert. Was macht diese Routine nun<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie l&ouml;scht den hinter dem Element stehenden Datensatz.<\/li>\n<li class=\"aufz-hlung\">Sie entfernt das Element aus dem TreeView.<\/li>\n<\/ul>\n<p><b>Top Down<\/b><\/p>\n<p>Auf die gleiche Weise, wie die Tabelle <b>tblProjekte, <\/b>binden Sie von oben nach unten auch die weiteren Tabellen <b>tblMeilensteine<\/b>, <b>tblIterationen<\/b>, <b>tblKundenstories <\/b>und <b>tblAufgaben <\/b>in den TreeView-Konfigurator ein. Dazu m&uuml;ssen Sie jeweils die folgenden Schritte durchf&uuml;hren:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Eintragen der Tabelle mit den entsprechenden Eigenschaften im TreeView-Konfigurator<\/li>\n<li class=\"aufz-hlung\">Anlegen eines Kontextmen&uuml;eintrags zum Hinzuf&uuml;gen eines neuen Elements im jeweils &uuml;bergeordneten Eintrag<\/li>\n<li class=\"aufz-hlung\">Eintragen jeweils eines <b>Case<\/b>-Zweigs pro Tabelle in der Ereignisprozedur <b>objTreeViewHandler_ShortcutMenuClick<\/b><\/li>\n<li class=\"aufz-hlung\">Anlegen eines Kontextmen&uuml;eintrags zum L&ouml;schen des Elements f&uuml;r den jeweils aktuellen Eintrag (weitere Eintr&auml;ge in der Ereignisprozedur <b>objTreeViewHandler_ShortcutMenuClick <\/b>sind nicht n&ouml;tig &#8211; au&szlig;er, wenn Spezialbehandlungen erforderlich sein sollten)<\/li>\n<li class=\"aufz-hlung\">Anlegen je eines Formulars zum Anlegen neuer Elemente (siehe Beispieldatenbank: <b>frmMeilensteinNeu<\/b>, <b>frmIterationNeu<\/b>, <b>frmKundenstoryNeu<\/b>, <b>frmAufgabeNeu<\/b>)<\/li>\n<li class=\"aufz-hlung\">Anlegen je eines Unterformulars zur Anzeige der Daten des aktuell angeklickten Elements (<b>sfmMeilenstein<\/b>, <b>sfmIteration<\/b>, <b>sfmKundenstory<\/b>, <b>sfmAufgabe<\/b>)<\/li>\n<li class=\"aufz-hlung\">Eintragen eines <b>Case<\/b>-Zweigs f&uuml;r die verschiedenen Elemente und die Anzeige der entsprechenden Unterformulare in der Ereignisprozedur <b>objTreeViewHandler_NodeClick<\/b><\/li>\n<\/ul>\n<p><b>Bottom Up<\/b><\/p>\n<p>In der umgekehrten Richtung gehen wir nun vor, was die Behandlung der f&uuml;r die einzelnen Aufgaben des Projekts eingetragenen Informationen wie gesch&auml;tzter Aufwand, tats&auml;chlicher Aufwand, Fertigstellungsdatum und Fortschritt angeht.<\/p>\n<p>Wir beginnen mit dem Unterformular <b>sfmAufgabe<\/b>, das im Entwurf wie in Bild 11 aussieht. Wichtig sind hier die Steuerelemente zum Eingeben der oben erw&auml;hnten Eigenschaften.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic011_opt.jpeg\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Entwurf des Formulars frmAufgaben<\/span><\/b><\/p>\n<p>Dies hier ist n&auml;mlich das einzige Formular, das diese Daten in elementarer Form enth&auml;lt, das hei&szlig;t, dass jede Information genau dem aktuellen Datensatz zugeordnet ist. <\/p>\n<p>Gehen wir weiter zum Unterformular <b>sfmKundenstories<\/b>, das die &uuml;bergeordneten Elemente anzeigen soll (siehe Bild 12).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic012_opt.jpeg\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Das Unterformular sfmKundenstory aggregiert Daten der untergeordneten Aufgaben.<\/span><\/b><\/p>\n<p>Es enth&auml;lt einige ungebundene Felder, die auf Basis von Informationen aus der Abfrage <b>qryKundenstoryDetails <\/b>gef&uuml;llt werden sollen.<\/p>\n<p>Die Abfrage basiert allein auf der Tabelle <b>tblAufgaben<\/b>, ist nach dem Feld <b>KundenstoryID <\/b>gruppiert und besitzt folgende Felder (die Abbildung der Entwurfsansicht ist an dieser Stelle aus Platzgr&uuml;nden nicht m&ouml;glich):<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>KundenstoryID<\/b>: Fremdschl&uuml;sselfeld zur &uuml;bergeordneten Tabelle <b>tblKundenstories<\/b><\/li>\n<li class=\"aufz-hlung\"><b>SummeTats&auml;chlicherAufwand<\/b>: Summe des Felds <b>TatsaechlicherAufwand <\/b>&uuml;ber alle Datens&auml;tze einer Gruppe<\/li>\n<li class=\"aufz-hlung\"><b>SummeProzentFertiggestellt<\/b>: Summe des Produkts der Felder <b>GeschaetzterAufwand <\/b>und <b>ProzentFertiggestellt<\/b><\/li>\n<li class=\"aufz-hlung\"><b>SummeGeschaetzterAufwand<\/b>: Summe des Felds <b>GeschaetzterAufwand<\/b><\/li>\n<li class=\"aufz-hlung\"><b>ProzentFertiggestelltKundenstory<\/b>: Ist <b>0<\/b>, wenn <b>SummeGeschaetzterAufwand <\/b>den Wert <b>0 <\/b>hat (da ansonsten eine Division durch 0 einen Fehler ausl&ouml;st), sonst der Quotient der Felder <b>SummeProzentFertiggestellt <\/b>und <b>SummeGeschaetzterAufwand<\/b>, also der prozentuale Anteil der Fertigstellung &uuml;ber alle Aufgaben einer Gruppierung<\/li>\n<li class=\"aufz-hlung\"><b>CountID<\/b>: Anzahl der Datens&auml;tze, deren Feld <b>FertiggestelltAm <\/b>nicht Null ist<\/li>\n<li class=\"aufz-hlung\"><b>MaxFertiggestelltAm<\/b>: Aktuellstes Datum der fertiggestellten Aufgaben einer Gruppierung<\/li>\n<\/ul>\n<p>Diese Abfrage wird beim Anzeigen eines Datensatzes im Unterformular <b>sfmKundenstory <\/b>mit der Ereignisprozedur aus Listing 2 ausgewertet. <\/p>\n<p class=\"kastentabelleheader\">Listing 2: F&uuml;llen eines Unterformulars mit aggregierten Daten zu den untergeordneten Aufgaben<\/p>\n<pre>Private Sub Form_Current()\r\n    Dim rst As DAO.Recordset\r\n    Set rst = dbs.OpenRecordset(\"SELECT * FROM qryKundenstoryDetails WHERE KundenstoryID = \" _\r\n    &amp; Me.ID, dbOpenDynaset)\r\n    If Not rst.EOF Then\r\n        With rst\r\n        Me.txtGeschaetzterAufwand = !SummeGeschaetzterAufwand\r\n        Me.txtTatsaechlicherAufwand = !SummeTatsaechlicherAufwand\r\n        Me.txtProzentErledigt = !ProzentFertiggestelltKundenstory\r\n        If !CountID = !CountFertiggestelltAm Then\r\n            Me.txtFertiggestelltAm = !MaxFertiggestelltAm\r\n        End If\r\n        End With\r\n    Else\r\n        With rst\r\n        Me.txtGeschaetzterAufwand = 0\r\n        Me.txtTatsaechlicherAufwand = 0\r\n        Me.txtProzentErledigt = 0\r\n        Me.txtFertiggestelltAm = \"\"\r\n        End With\r\n    End If\r\n    End Sub<\/pre>\n<p>Dabei werden drei Felder direkt mit den Werten der entsprechenden Abfragefelder gef&uuml;llt, das vierte wird nur dann mit dem Fertigstellungstermin der zuletzt fertiggestellten Aufgabe gef&uuml;llt, wenn alle Aufgaben zu dieser Kundenstory erledigt sind.<\/p>\n<p>Es gibt noch drei weitere Abfragen, die &auml;hnlich wie Abfrage <b>qryKundenstoryDetail <\/b>aufgebaut sind: <b>qryIterationDetails<\/b>, <b>qryMeilensteinDetails <\/b>und <b>qryProjektDetails<\/b>.<\/p>\n<p>Der einzige Unterschied ist, dass die Aggregierung der gesuchten Informationen jeweils f&uuml;r &uuml;bergeordnete Tabellen erfolgt und dementsprechend mit jeder Ebene eine Tabelle zur Abfrage hinzukommt &#8211; genau so, dass jeweils alle Tabellen enthalten sind, die sich in der Hierarchie unterhalb der im Formular anzuzeigenden Tabelle befinden. <b>qryProjektDetail <\/b>beispielsweise liefert die Daten f&uuml;r das Unterformular <b>sfmProjekt<\/b> und sieht wie in Bild 13 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/Projektverwaltung-web-images\/pic013_opt.jpeg\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Diese Abfrage aggregiert Aufgaben-Daten f&uuml;r das komplette Projekt.<\/span><\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Images einf&uuml;gen<\/p>\n<p>Ein wenig nackt sieht ein solches TreeView-Steuerelement ohne jegliches Icon schon aus, also f&uuml;gen wir welche hinzu, genau genommen zur Tabelle <b>tblImages<\/b>. Dort speichern Sie die Bilddatei, die einen transparenten<span class=\"todo\"> <\/span>oder wei&szlig;en Hintergrund liefern sollte, mit der Funktion <b>SaveFileToOLEField <\/b>aus dem Modul <b>mdlOLE <\/b>in der Zieltabelle, hier <b>tblImages <\/b>(f&uuml;r den reibungslosen Betrieb mit dem TreeView-Konfigurator muss diese Tabelle nicht so hei&szlig;en &#8211; aber Sie m&uuml;ssen eine Abfrage namens <b>qryImages <\/b>mit den drei Feldern <b>ID<\/b>, <b>ImageName <\/b>und <b>ImageObject <\/b>auf diese oder eine andere Tabelle mappen, welche ein entsprechendes OLE-Feld enth&auml;lt). Der Aufruf dieser Funktion lautet beispielsweise wie folgt, wobei <b>c:\\application.png <\/b>die zu speichernde Datei, <b>tblImages <\/b>die Zieltabelle, <b>ImageObject <\/b>das Zielfeld, <b>ID <\/b>das Prim&auml;rschl&uuml;sselfeld und <b>123 <\/b>der Prim&auml;rschl&uuml;ssel f&uuml;r einen bestehenden Datensatz in dieser Tabelle ist:<\/p>\n<pre>SaveFileToOLEField \"c:\\application.png\", \"tblImages\", \"ImageObject\", True, \"ID\", 123<\/pre>\n<p>Haben Sie auf diese Weise einige Bilder in der Tabelle <b>tblImages <\/b>gespeichert, m&uuml;ssen Sie dem TreeView-Konfigurator mitteilen, welche Bilder f&uuml;r welches Element verwendet werden sollen.<\/p>\n<p>Dies geschieht auf zwei Ebenen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Erstens k&ouml;nnen Sie im TreeView-Konfigurator im Feld <b>StandardImage <\/b>eine der in der Tabelle <b>tblImages <\/b>gespeicherten Bilddateien ausw&auml;hlen. Das Kombinationsfeld zeigt dabei den Inhalt des Felds <b>ImageObject <\/b>der Abfrage <b>qryImage <\/b>an. Dieses Bild wird nun zun&auml;chst f&uuml;r alle Elemente aus dieser Tabelle angezeigt.<\/li>\n<li class=\"aufz-hlung\">Die zweite Variante arbeitet auf Datensatzebene. Hier wird nun der Sinn des Feldes <b>Image <\/b>in den Tabellen klar: Sie k&ouml;nnen f&uuml;r jeden einzelnen Datensatz ein individuelles Bild einstellen, indem Sie einen der Werte des Felds <b>ImageName <\/b>in der Zieltabelle in dem Feld speichern, das im Konfigurator unter <b>NodeImageField <\/b>angegeben ist.<\/li>\n<\/ul>\n<p>Beim Aufbauen des TreeViews verwendet der TreeView-Konfigurator prim&auml;r die mit den Datens&auml;tzen angegebenen Images und greift erst beim Fehlen eines entsprechenden Feldes oder des Feldinhalts auf die standardm&auml;&szlig;ig f&uuml;r Datens&auml;tze der entsprechenden Tabelle festgelegten Images zu (ist nirgends ein Image angegeben, wird einfach keines angezeigt).<\/p>\n<p><b>Komfortl&ouml;sung<\/b><\/p>\n<p>Dank TreeView-Konfigurator k&ouml;nnen Sie bei der Arbeit mit der Softwareprojektverwaltung nicht nur die gew&uuml;nschten Elemente anlegen, l&ouml;schen, deren Eigenschaften bearbeiten und die aggregierten Daten in h&ouml;heren Hierarchieebenen betrachten, sondern noch mehr:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Verschieben aller untergeordneten Elemente unter andere, gleichrangige Parent-Elemente per Drag and Drop<\/li>\n<li class=\"aufz-hlung\">&auml;ndern der Reihenfolge von Elementen durch Ziehen eines Elements per Drag and Drop bei gedr&uuml;ckter <b>Alt<\/b>-Taste auf die gew&uuml;nschte Position<\/li>\n<\/ul>\n<p><b>Notizen<\/b><\/p>\n<p>Die Beispieldatenbank enth&auml;lt auch noch die M&ouml;glichkeit, Notizen zu jedem der Elemente hinzuzuf&uuml;gen. Die Notizen stammen aus der Tabelle <b>tblNotizen<\/b>.<\/p>\n<p>Sie ahnen es bereits: Wenn Sie Daten aus einer einzigen Tabelle zu Elementen aus allen Ebenen hinzuf&uuml;gen m&ouml;chten, m&uuml;ssen Sie auch mehr als einen Eintrag im TreeView-Konfigurator vornehmen.<\/p>\n<p>Sie m&uuml;ssen f&uuml;r jede Tabelle, f&uuml;r deren Elemente Sie Notizen anlegen und &uuml;ber das TreeView verwalten m&ouml;chten, einen neuen Eintrag anlegen, der die entsprechende Tabelle als <b>ParentTable <\/b>enth&auml;lt. Dementsprechend sieht auch die Handhabung des Formulars zum Anlegen neuer Notizen etwas anders aus &#8211; mehr erfahren Sie, wenn Sie sich die Beispieldatenbank ansehen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Softwareprojektverwaltung sieht zwar in erster Linie wie eine Beispielanwendung f&uuml;r den TreeView-Konfigurator aus, aber sie sollte &#8211; gegebenenfalls mit Anpassungen &#8211; auch in der Praxis einsetzbar sein. Bislang enth&auml;lt sie im Prinzip nur ein Formular mit vielen Hilfsformularen, aber die Erweiterung durch Berichte mit Auswertungen oder mit weiteren Formularen steht Ihnen offen.<\/p>\n<p>Geplant war f&uuml;r diese Version der Softwareprojektverwaltung eigentlich noch die M&ouml;glichkeit, &uuml;ber die Images der einzelnen TreeView-Elemente Informationen &uuml;ber den Fortschritt und die Einhaltung der gesch&auml;tzten Aufw&auml;nde zu liefern &#8211; beispielsweise, indem man die bestehenden Images um kleine Icons wie Ausrufezeichen, <b>OK<\/b>-Zeichen et cetera unten links und unten rechts erweitert.<\/p>\n<p>Leider w&auml;re die Programmierung eines solchen Features etwas aufw&auml;ndiger geworden und wir wollten die Vereinfachungen bei der Gestaltung des TreeViews durch den TreeView-Konfigurator nicht durch erh&ouml;hten Aufwand f&uuml;r andere Features wieder zunichte machen.<\/p>\n<p>Wenn Sie konkrete Ideen zum Ausbau oder Einsatz der Softwareprojektverwaltung haben, teilen Sie uns diese doch einfach unter <b>info@access-im-unternehmen.de <\/b>mit &#8211; wir informieren Sie im Gegenzug &uuml;ber Neuerungen beim TreeView-Konfigurator.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Softwareprojektverwaltung.mdb<\/p>\n<p>Softwareprojektverwaltung.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{675B4DFA-FB51-465E-B43D-F137A42F114F}\/aiu_669.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Softwareprojekte sind das A und O von Access-Entwicklern und somit auch f&uuml;r Sie. Es sei denn, Sie schnuppern rein zuf&auml;llig hier herein &#8211; und selbst dann k&ouml;nnen Sie mit der hier vorgestellten L&ouml;sung vielleicht etwas anfangen. Diese soll n&auml;mlich helfen, ein Softwareprojekt in seine Meilensteine, Iterationen, Kundenstories und T&auml;tigkeiten aufzuteilen und deren Abarbeitung zu organisieren.<\/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":[662009,66032009,44000027],"tags":[],"class_list":["post-55000669","post","type-post","status-publish","format-standard","hentry","category-662009","category-66032009","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>Softwareprojekte verwalten - 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\/Softwareprojekte_verwalten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Softwareprojekte verwalten\" \/>\n<meta property=\"og:description\" content=\"Softwareprojekte sind das A und O von Access-Entwicklern und somit auch f&uuml;r Sie. Es sei denn, Sie schnuppern rein zuf&auml;llig hier herein - und selbst dann k&ouml;nnen Sie mit der hier vorgestellten L&ouml;sung vielleicht etwas anfangen. Diese soll n&auml;mlich helfen, ein Softwareprojekt in seine Meilensteine, Iterationen, Kundenstories und T&auml;tigkeiten aufzuteilen und deren Abarbeitung zu organisieren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:23:52+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983\" \/>\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=\"27\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Softwareprojekte verwalten\",\"datePublished\":\"2020-05-22T22:23:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/\"},\"wordCount\":5204,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/94547646291f48e9a4ddec6ace77d983\",\"articleSection\":[\"2009\",\"3\\\/2009\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/\",\"name\":\"Softwareprojekte verwalten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/94547646291f48e9a4ddec6ace77d983\",\"datePublished\":\"2020-05-22T22:23:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/94547646291f48e9a4ddec6ace77d983\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/94547646291f48e9a4ddec6ace77d983\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Softwareprojekte_verwalten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Softwareprojekte verwalten\"}]},{\"@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":"Softwareprojekte verwalten - 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\/Softwareprojekte_verwalten\/","og_locale":"de_DE","og_type":"article","og_title":"Softwareprojekte verwalten","og_description":"Softwareprojekte sind das A und O von Access-Entwicklern und somit auch f&uuml;r Sie. Es sei denn, Sie schnuppern rein zuf&auml;llig hier herein - und selbst dann k&ouml;nnen Sie mit der hier vorgestellten L&ouml;sung vielleicht etwas anfangen. Diese soll n&auml;mlich helfen, ein Softwareprojekt in seine Meilensteine, Iterationen, Kundenstories und T&auml;tigkeiten aufzuteilen und deren Abarbeitung zu organisieren.","og_url":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:23:52+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Softwareprojekte verwalten","datePublished":"2020-05-22T22:23:52+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/"},"wordCount":5204,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983","articleSection":["2009","3\/2009","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/","url":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/","name":"Softwareprojekte verwalten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983","datePublished":"2020-05-22T22:23:52+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/94547646291f48e9a4ddec6ace77d983"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Softwareprojekte_verwalten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Softwareprojekte verwalten"}]},{"@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\/55000669","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=55000669"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000669\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}