{"id":55001288,"date":"2021-02-01T00:00:00","date_gmt":"2021-03-22T16:26:20","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1288"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Statische_Workflows_im_Griff","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/","title":{"rendered":"Statische Workflows im Griff"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1\" alt=\"\" width=\"1\" height=\"1\" \/><\/p>\n<p><b>Es gibt immer wieder Standardabl\u00e4ufe im B\u00fcroalltag. Bei mir ist es das Schreiben von Artikeln. F\u00fcr jeden Artikel gibt es einige Aufgaben, die immer in der gleichen Reihenfolge ablaufen. Wer denkt, das geht nach 20 Jahren automatisch, irrt sich &#8211; immer wieder bleibt mal eine Teilaufgabe liegen oder wird nicht in der richtigen Reihenfolge erledigt. Um das zu \u00e4ndern, erstellen wir in diesem Beitrag eine L\u00f6sung, um wiederkehrende, nach dem gleichen Schema ablaufende Aufgaben zu verfolgen. Dazu speichern wir die einzelnen Schritte als Felder in einer Tabelle. \u00dcber die Benutzeroberfl\u00e4che stellen wir die Aufgaben und die Teilschritte optisch so dar, dass die nun zu erledigenden Teilaufgaben immer im Blickfeld sind!<\/b><\/p>\n<h2>Beispiel f\u00fcr einen Workflow<\/h2>\n<p>Wie sieht ein beispielhafter Workflow aus Ich w\u00e4hle gleich den aus meiner t\u00e4glichen Arbeit &#8211; das Erstellen eines Beitrags etwa f\u00fcr das vorliegende Magazin. Hier tauchen die folgenden Aufgaben auf:<\/p>\n<ul>\n<li>Beitrag in Beitragsdatenbank aufnehmen<\/li>\n<li>Beitrag schreiben<\/li>\n<li>Beitrag setzen<\/li>\n<li>Beitrag zum Lektor schicken<\/li>\n<li>Beitrag wird durch Lektor gepr\u00fcft<\/li>\n<li>Korrekturvorschl\u00e4ge des Lektors einarbeiten<\/li>\n<li>Beitrag in Beitragsdatenbank einlesen<\/li>\n<li>Beispieldateien in Beitragsdatenbank aufnehmen<\/li>\n<li>Beitrag und Beispieldateien online stellen<\/li>\n<\/ul>\n<p>Zus\u00e4tzlich gibt es je Magazin noch eine Reihe weiterer Aufgaben:<\/p>\n<ul>\n<li>PDF erstellen<\/li>\n<li>PDF zum Verlag schicken<\/li>\n<li>Verlag macht letzte Korrekturvorschl\u00e4ge<\/li>\n<li>Korrekturvorschl\u00e4ge des Verlags einarbeiten<\/li>\n<li>Magazin online stellen<\/li>\n<li>Downloadseite um neue Ausgabe erweitern<\/li>\n<li>Neuen Benutzer f\u00fcr die neuen Zugangsdaten anlegen<\/li>\n<li>Newsletter an Abonnenten schicken<\/li>\n<\/ul>\n<p>Das sind bereits einige Aufgaben, die im Alltag noch etwas detaillierter ausfallen. Sie sollen jedoch reichen, um Beispielmaterial f\u00fcr die zu erstellende L\u00f6sung zu liefern.<\/p>\n<p>In der Praxis gibt es f\u00fcr jeden Beitrag einen neuen Workflow und auch f\u00fcr jede neue Ausgabe. Wir k\u00f6nnten noch einen Schritt weitergehen und die Workflows einander unterordnen, also beispielsweise die Beitrags-Workflows den Magazin-Workflows zuweisen. Dies wollen wir aus Gr\u00fcnden der \u00dcbersicht in diesem Beitrag nicht erledigen.<\/p>\n<h2>Einfachste Methode<\/h2>\n<p>Wenn Sie immer wiederkehrende Unteraufgaben haben, k\u00f6nnen Sie einfach f\u00fcr jede Aufgabe ein Kontrollk\u00e4stchen zur Aufgabe hinzuf\u00fcgen und diese nach Erledigung der Aufgaben abhaken. Damit wissen Sie jederzeit, welchen Stand die Aufgabe hat. Wenn die Unteraufgaben sich nicht ver\u00e4ndern, ist das auch die beste und einfachste Methode.<\/p>\n<p>Wenn wir bei meinem Beispiel bleiben, wo sich die Unteraufgaben beim Schreiben eines Beitrags nie \u00e4ndern, k\u00f6nnen Sie einfach f\u00fcr jede Unteraufgabe ein <b>Ja\/Nein<\/b>-Feld zu der Tabelle hinzuf\u00fcgen, in der Sie auch weitere Daten zu den Beitr\u00e4gen speichern &#8211; wie den Titel, den Inhalt et cetera.<\/p>\n<p>Der Entwurf der Tabelle <b>tblBeitraege<\/b> sieht danach etwa wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_001.png\" alt=\"Einfache Variante zum Einbau eines Workflows\" width=\"424,7115\" height=\"250,5798\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 1: Einfache Variante zum Einbau eines Workflows<\/span><\/b><\/p>\n<p>Danach k\u00f6nnen Sie die Felder wie in Bild 2 in einem Formular zur Bearbeitung der Beitr\u00e4ge unterbringen. Damit erhalten Sie einen detaillierten \u00dcberblick \u00fcber alle Daten zu einem Beitrag.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_002.png\" alt=\"Formularentwurf mit Ja\/Nein-Feldern\" width=\"424,7115\" height=\"366,485\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 2: Formularentwurf mit Ja\/Nein-Feldern<\/span><\/b><\/p>\n<p>Noch praktischer f\u00fcr einen \u00dcberblick \u00fcber alle Aufgaben ist eine \u00dcbersicht der Aufgaben mehrerer Beitr\u00e4ge in einem Endlosformular oder in einem Datenblatt. Gegebenenfalls k\u00f6nnen Sie auch ein Listenfeld nutzen.<\/p>\n<h2>Bessere Reproduzierbarkeit mit Datum<\/h2>\n<p>Damit sehen wir nun, wie weit jeder Beitrag ist und welche Aufgaben noch zu erledigen sind. Aber was, wenn der Lektor fragt, wo der Beitrag bleibt, sie diesen aber schon als verschickt gekennzeichnet haben Dann m\u00fcssen Sie gegebenenfalls den kompletten Ordner der gesendeten Elemente in Outlook durchsuchen.<\/p>\n<p>Etwas einfacher geht es, wenn Sie zumindest wissen, wann Sie den Beitrag an den Lektor verschickt haben. Zu diesem Zweck \u00e4ndern wir den Datentyp der <b>Ja\/Nein<\/b>-Felder der Tabelle <b>tblBeitraege <\/b>in <b>Datum\/Zeit <\/b>um (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_003.png\" alt=\"Tabelle mit Datum\/Uhrzeit-Feldern\" width=\"424,7115\" height=\"261,4959\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 3: Tabelle mit Datum\/Uhrzeit-Feldern<\/span><\/b><\/p>\n<p>Allerdings wollen wir diese Information nur abrufen, wenn unbedingt n\u00f6tig. In einer \u00dcbersicht hingegen sollen nur Kontrollk\u00e4stchen angezeigt werden, die angeben, ob die Unteraufgabe erledigt wurde oder nicht. In der Detailansicht wollen wir auch nur Kontrollk\u00e4stchen anzeigen, die der Benutzer nach Erledigung einer Teilaufgabe abhaken kann. Nach dem Abhaken soll dann das Datum der Erledigung in das betroffene Feld eingetragen werden.<\/p>\n<p>Zusammenfassend: Die Tabelle soll ein Datumsfeld f\u00fcr das Erledigungsdatum einer jeden Unteraufgabe enthalten. Die Formulare hingegen sollen ein Kontrollk\u00e4stchen anzeigen. Das Kontrollk\u00e4stchen soll angehakt sein, wenn das Datumsfeld nicht leer ist, wenn es leer ist, soll das Kontrollk\u00e4stchen keinen Haken enthalten. Au\u00dferdem soll, wenn der Benutzer einen Haken in ein Kontrollk\u00e4stchen setzt, das Erledigungsdatum in das zugrunde liegende <b>Datum\/Zeit<\/b>-Feld eingetragen werden.<\/p>\n<p>Wir haben also ein <b>Datum\/Zeit<\/b>-Feld, dessen Status <b>Null<\/b>\/<b>Nicht Null <\/b>in Form des Wertes eines Kontrollk\u00e4stchens erscheinen soll. Dazu ben\u00f6tigen wir eine technische L\u00f6sung, die zum Beispiel in einer entsprechend formulierten Abfrage liegen k\u00f6nnte. Diese w\u00fcrde f\u00fcr jedes Unteraufgaben-Feld zwei Felder enthalten &#8211; einmal das <b>Datum\/Zeit<\/b>-Feld und ein weiteres Feld, das pr\u00fcft, ob das <b>Datum\/Zeit<\/b>-Feld bereits einen Wert enth\u00e4lt oder nicht und abh\u00e4ngig davon den Wert <b>True <\/b>oder <b>False <\/b>ausgibt.<\/p>\n<p>Diese Abfrage formulieren wir wie in Bild 4. Sie enth\u00e4lt das Feld <b>BeitragGeschrieben <\/b>und ein berechnetes Feld namens <b>BeitragGeschriebenJaNein<\/b>, das den Wert <b>-1 <\/b>liefert, wenn das Feld <b>BeitragGeschrieben <\/b>gef\u00fcllt ist:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_004.png\" alt=\"Abfrage, die sowohl das Datum\/Zeit-Feld als auch ein davon abh\u00e4ngiges Ja\/Nein-Feld liefert.\" width=\"700\" height=\"366,0482\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 4: Abfrage, die sowohl das Datum\/Zeit-Feld als auch ein davon abh\u00e4ngiges Ja\/Nein-Feld liefert.<\/span><\/b><\/p>\n<pre>BeitragGeschriebenJaNein: Nicht IstNull([BeitragGeschrieben])<\/pre>\n<p>Bild 5 zeigt, wie das Ergebnis der Abfrage f\u00fcr zwei Datens\u00e4tze aussieht, von denen einer einen Datumswert im Feld <b>BeitragGeschrieben <\/b>aufweist und der andere den Wert <b>Null<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_005.png\" alt=\"Ergebnis der Abfrage mit je einem gef\u00fcllten und einem nicht gef\u00fcllten BeitragGeschrieben-Feld \" width=\"700\" height=\"307,5281\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 5: Ergebnis der Abfrage mit je einem gef\u00fcllten und einem nicht gef\u00fcllten BeitragGeschrieben-Feld <\/span><\/b><\/p>\n<p>Wir w\u00fcrden nun gern noch das berechnete Feld <b>BeitragGeschriebenJaNein <\/b>als Kontrollk\u00e4stchen in der Datenblattansicht anzeigen. Dazu verwenden wir normalerweise die Eigenschaft <b>Steuerelement anzeigen <\/b>im Bereich <b>Nachschlagen <\/b>der Eigenschaften einer Spalte der Abfrage. Hier finden wir allerdings nur die drei M\u00f6glichkeiten <b>Textfeld<\/b>, <b>Listenfeld <\/b>und <b>Kombinationsfeld <\/b>vor (siehe Bild 6). Anders ist es, wenn wir ein Abfragefeld auf Basis eines <b>Ja\/Nein<\/b>-Feldes erstellen &#8211; dann stehen Kontrollk\u00e4stchen, Textfeld und Kombinationsfeld zur Verf\u00fcgung. Da dies hier nicht der Fall ist, m\u00fcssen wir in den sauren Apfel bei\u00dfen und vorerst mit Textfeldern arbeiten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_006.png\" alt=\"Die Anzeige als Kontrollk\u00e4stchen ist nicht m\u00f6glich.\" width=\"424,7115\" height=\"315,6327\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 6: Die Anzeige als Kontrollk\u00e4stchen ist nicht m\u00f6glich.<\/span><\/b><\/p>\n<p>Der Nachteil davon zeigt sich, wenn wir das nun in einen Formular abbilden wollen &#8211; wir h\u00e4tten dort f\u00fcr die berechneten <b>Ja\/Nein<\/b>-Felder gern direkt Kontrollk\u00e4stchen erhalten, aber beim Hinzuf\u00fcgen im Formularentwurf \u00fcbernimmt Access den in der Tabelle beziehungsweise Abfrage voreingestellten Steuerelementtyp.<\/p>\n<p>Wenn wir die Felder aus der Abfrage, welche die <b>Ja\/Nein<\/b>-Ausdr\u00fccke f\u00fcr die Datumsfelder berechnen, in das Formular ziehen und versuchen, diese in Kontrollk\u00e4stchen umzuwandeln, finden wir auch hier diese M\u00f6glichkeit nicht vor (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_007.png\" alt=\"Textfelder k\u00f6nnen nicht in Kontrollk\u00e4stchen umgewandelt werden\" width=\"649,559\" height=\"376,726\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 7: Textfelder k\u00f6nnen nicht in Kontrollk\u00e4stchen umgewandelt werden<\/span><\/b><\/p>\n<p>Also m\u00fcssen wir wohl oder \u00fcbel jeweils ein Kontrollk\u00e4stchen f\u00fcr jedes Feld in den Formularentwurf ziehen und dann der Eigenschaft <b>Steuerelementinhalt <\/b>die berechneten <b>Ja\/Nein<\/b>-Felder der als Datensatzquelle verwendeten Abfrage zuweisen. Au\u00dferdem benennen wir die Kontrollk\u00e4stchen auch direkt mit dem passenden Pr\u00e4fix, also beispielsweise <b>chkBeitragGeschrieben<\/b>.<\/p>\n<p>F\u00fcr das berechnete Feld <b>BeitragGeschriebenJaNein<\/b> sieht das Kontrollk\u00e4stchen wie in Bild 8 aus: Es hat den Namen <b>chkBeitragGeschrieben <\/b>und den Steuerelementinhalt <b>BeitragGeschriebenJaNein<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_008.png\" alt=\"Kontrollk\u00e4stchen f\u00fcr die Unteraufgaben\" width=\"649,559\" height=\"530,0645\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 8: Kontrollk\u00e4stchen f\u00fcr die Unteraufgaben<\/span><\/b><\/p>\n<p>Rechts daneben wollen wir nun noch das Datum abbilden f\u00fcr den Fall, dass die Unteraufgabe bereits erledigt wurde. Dazu f\u00fcgen wir noch die entsprechenden Textfelder hinzu. Diese markieren wir in der Feldliste und ziehen sie gleich neben die bereits angelegten Kontrollk\u00e4stchen. Die mit diesen Textfeldern ebenfalls zum Formularentwurf hinzugef\u00fcgten Bezeichnungsfelder markieren wir und l\u00f6schen diese direkt wieder. Die Textfelder platzieren wir so, dass sie sich direkt neben den Kontrollk\u00e4stchen befinden.<\/p>\n<p><!--30percent--><\/p>\n<p>Die Namen der Textfelder erg\u00e4nzen wir ebenfalls noch um das entsprechende Pr\u00e4fix, in diesem Fall txt. Das Textfeld f\u00fcr die erste Unteraufgabe hei\u00dft so beispielsweise <b>txtBeitragGeschrieben<\/b>.<\/p>\n<h2>Datum f\u00fcr erledigte Aufgaben anzeigen<\/h2>\n<p>Nun fehlt noch Code, der daf\u00fcr sorgt, dass die Textfelder nur erscheinen, wenn die jeweilige Unteraufgabe bereits erledigt wurde. Diesen platzieren wir in der Prozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel\u00f6st wird. Diese Prozedur finden Sie in Listing 1.<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>Form_Current()\n     Me!txtBeitragGeschrieben.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragGeschrieben)\n     Me!txtBeitragGesetzt.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragGesetzt)\n     Me!txtBeitragZumLektor.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragZumLektor)\n     Me!txtBeitragLektoriert.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragLektoriert)\n     Me!txtBeitragKorrigiert.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragKorrigiert)\n     Me!txtBeitragEingelesen.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragEingelesen)\n     Me!txtBeispieleErstellt.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeispieleErstellt)\n     Me!txtBeitragOnline.Visible = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragOnline)\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 1: Ein- oder Ausblenden der Datumsfelder f\u00fcr erledigte Unteraufgaben<\/span><\/b><\/p>\n<p>Hier berechnen wir f\u00fcr jedes Datumsfeld der Datensatzquelle, ob es den Wert Null hat und stellen die Eigenschaft Visible des dazugeh\u00f6renden Textfeldes zur Anzeige des Datums so ein, dass es nur angezeigt wird, wenn ein Datum gespeichert ist.<\/p>\n<h2>Datum beim Aktivieren von Kontrollk\u00e4stchen setzen<\/h2>\n<p>Wenn der Benutzer eine Aufgabe erledigt, markiert er das entsprechende Kombinationsfeld. Dann soll automatisch das aktuelle Datum plus Uhrzeit in das betreffende Datumsfeld eingetragen werden.<\/p>\n<p>Das erste Problem ist, dass es sich bei dem <b>Ja\/Nein<\/b>-Feld aus der Abfrage um ein berechnetes Feld handelt und wir es nicht direkt bearbeiten k\u00f6nnen. Access zeigt beim Versuch in der Statusleiste den folgenden Text an:<\/p>\n<pre>Feld 'BeitragGeschriebenJaNein' basiert auf einem Ausdruck und kann nicht bearbeitet werden.<\/pre>\n<p>Der Ansatz mit dem gebundenen <b>Ja\/Nein<\/b>-Feld war ein Holzweg, denn auch \u00fcber das Abfangen mit verschiedenen Ereignisprozeduren k\u00f6nnen wir die Anzeige dieser Meldung und das damit verbundene akustische Signal nicht abfangen.<\/p>\n<p>Wir heben also die Bindung f\u00fcr die Kontrollk\u00e4stchen an die Felder der Datensatzquelle auf, indem wir die Eigenschaft <b>Steuerelementinhalt <\/b>f\u00fcr alle Kontrollk\u00e4stchen leeren. Dann stellen wir, ebenfalls in der Prozedur <b>Form_Current<\/b>, die Werte dieser Kontrollk\u00e4stchen per Code ein.<\/p>\n<p>Dazu f\u00fcgen wir oben die Zeilen aus Listing 2 ein. Die Anweisungen stellen jeweils den Wert der Kontrollk\u00e4stchen auf das negierte Ergebnis der <b>IsNull<\/b>-Funktion f\u00fcr das entsprechende Datumsfeld ein. Damit wird der Wert des Datumsfeldes immer noch nicht gesetzt, wenn der Benutzer eines der Kontrollk\u00e4stchen aktiviert. Dazu legen wir beispielsweise f\u00fcr das Kontrollk\u00e4stchen <b>chkBeitragGeschrieben <\/b>die folgende Ereignisprozedur an:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>Form_Current()\n     Me!chkBeitragGeschrieben = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragGeschrieben)\n     Me!chkBeitragGesetzt = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragGesetzt)\n     Me!chkBeitragZumLektor = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragZumLektor)\n     Me!chkBeitragLektoriert = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragLektoriert)\n     Me!chkBeitragKorrigiert = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragKorrigiert)\n     Me!chkBeitragEingelesen = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragEingelesen)\n     Me!chkBeispieleErstellt = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeispieleErstellt)\n     Me!chkBeitragOnline = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragOnline)\n     ...\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 2: Setzen der Kontrollk\u00e4stchen<\/span><\/b><\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>chkBeitragGeschrieben_AfterUpdate()\n     <span style=\"color: blue;\">If <\/span>Me!chkBeitragGeschrieben = <span style=\"color: blue;\">True<\/span><span style=\"color: blue;\"> Then<\/span>\n         Me!BeitragGeschrieben = Date\n         Me!txtBeitragGeschrieben.Visible = <span style=\"color: blue;\">True<\/span>\n     <span style=\"color: blue;\">Else<\/span>\n         Me!BeitragGeschrieben = Null\n         Me!txtBeitragGeschrieben.Visible = <span style=\"color: blue;\">False<\/span>\n     <span style=\"color: blue;\">End If<\/span>\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Diese wird nach dem Aktualisieren des Kontrollk\u00e4stchens <b>chkBeitragGeschrieben <\/b>ausgel\u00f6st und pr\u00fcft seinen Wert.<\/p>\n<p>Hat der Benutzer das Kontrollk\u00e4stchen aktiviert, erh\u00e4lt das Feld <b>BeitragGeschrieben <\/b>das aktuelle Datum als Wert und das daran gebundene Textfeld <b>txtBeitragGeschrieben <\/b>wird \u00fcber das Einstellen der Eigenschaft <b>Visible <\/b>sichtbar gemacht.<\/p>\n<p>Anderenfalls leert die Prozedur das Feld <b>BeitragGeschrieben <\/b>und blendet das Textfeld <b>txtBeitragGeschrieben <\/b>aus.<\/p>\n<p>Da es etwas aufwendig ist, diese Prozedur f\u00fcr alle Steuer-elemente zu erstellen, gliedern wir die Funktion aus und parametrisieren diese. Das Ergebnis sieht wie folgt aus:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>chk_AfterUpdate(strFeld<span style=\"color: blue;\"> As String<\/span>)\n     <span style=\"color: blue;\">If <\/span>Me(\"chk\" &amp; strFeld) = <span style=\"color: blue;\">True<\/span><span style=\"color: blue;\"> Then<\/span>\n         Me(strFeld) = Date\n         Me(\"txt\" &amp; strFeld).Visible = <span style=\"color: blue;\">True<\/span>\n     <span style=\"color: blue;\">Else<\/span>\n         Me(strFeld) = Null\n         Me(\"txt\" &amp; strFeld).Visible = <span style=\"color: blue;\">False<\/span>\n     <span style=\"color: blue;\">End If<\/span>\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur nimmt den Namen des Feldes per Parameter entgegen. Praktischerweise haben wir f\u00fcr die Kontrollk\u00e4stchen und Textfelder Namen vergeben, die sich aus dem Pr\u00e4fix <b>chk <\/b>beziehungsweise <b>txt <\/b>und dem Feldnamen zusammensetzen, sodass wir \u00fcber die Klammern-Syntax die Steuerelementnamen aus dem Pr\u00e4fix und dem Feldnamen zusammenstellen k\u00f6nnen.<\/p>\n<p>Der Aufruf erfolgt mit jeweils einer Ereignisprozedur pro Kontrollk\u00e4stchen, die wir f\u00fcr das Ereignis <b>Nach Aktualisierung <\/b>der Kontrollk\u00e4stchen hinzuf\u00fcgen:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>chkBeitragGeschrieben_AfterUpdate()\n     chk_AfterUpdate \"BeitragGeschrieben\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeispieleErstellt_AfterUpdate()\n     chk_AfterUpdate \"BeispieleErstellt\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeitragEingelesen_AfterUpdate()\n     chk_AfterUpdate \"BeitragEingelesen\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeitragGesetzt_AfterUpdate()\n     chk_AfterUpdate \"BeitragGesetzt\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeitragKorrigiert_AfterUpdate()\n     chk_AfterUpdate \"BeitragKorrigiert\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeitragLektoriert_AfterUpdate()\n     chk_AfterUpdate \"BeitragLektoriert\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeitragOnline_AfterUpdate()\n     chk_AfterUpdate \"BeitragOnline\"\n<span style=\"color: blue;\">End Sub<\/span>\n<span style=\"color: blue;\">Private Sub <\/span>chkBeitragZumLektor_AfterUpdate()\n     chk_AfterUpdate \"BeitragZumLektor\"\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir nun noch die Ausrichtung der Textfelder auf <b>Linksb\u00fcndig <\/b>und die Rahmenart auf <b>Transparent <\/b>einstellen, erhalten wir das Ergebnis aus Bild 9.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_01\/pic_1288_009.png\" alt=\"Das Formular nach dem Finetuning\" width=\"499,6607\" height=\"408,9781\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 9: Das Formular nach dem Finetuning<\/span><\/b><\/p>\n<h2>Unteraufgabe f\u00fcr Unteraufgabe<\/h2>\n<p>Manche Unteraufgaben sollen in einer bestimmten Reihenfolge abgearbeitet werden. F\u00fcr die Benutzeroberfl\u00e4che bedeutet dies, dass wir das Abhaken einer Aufgabe erst freigeben, wenn die vorherige Aufgabe erledigt wurde.<\/p>\n<p>Sprich: Zu Beginn sind die Kontrollk\u00e4stchen f\u00fcr alle Aufgaben au\u00dfer f\u00fcr die erste deaktiviert. Erst nach dem Setzen eines Hakens f\u00fcr die erste Aufgabe wird die zweite Aufgabe freigeschaltet und so weiter. Auch das programmieren wir f\u00fcr unsere L\u00f6sung mit fixen Unteraufgaben manuell.<\/p>\n<p>Dazu f\u00fcgen wir eine neue Prozedur namens <b>KontrollkaestchenFreischalten <\/b>hinzu. Diese pr\u00fcft jeweils, ob das Feld zum vorherigen Kontrollk\u00e4stchen gef\u00fcllt ist oder nicht und aktiviert oder deaktiviert in Abh\u00e4ngigkeit davon das Kontrollk\u00e4stchen (siehe Listing 3). Der Aufruf erfolgt an verschiedenen Stellen. Die Erste ist die Prozedur <b>Form_Current<\/b>, die jeweils beim Anzeigen des Datensatzes aufgerufen wird und bereits die Textfelder ein- und ausblendet sowie die Kontrollk\u00e4stchen f\u00fcllt:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>KontrollkaestchenFreischalten()\n     Me!chkBeitragGeschrieben.Enabled = <span style=\"color: blue;\">True<\/span>\n     Me!chkBeitragGesetzt.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragGeschrieben)\n     Me!chkBeitragZumLektor.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragGesetzt)\n     Me!chkBeitragLektoriert.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragZumLektor)\n     Me!chkBeitragKorrigiert.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragLektoriert)\n     Me!chkBeitragEingelesen.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragKorrigiert)\n     Me!chkBeispieleErstellt.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeitragEingelesen)\n     Me!chkBeitragOnline.Enabled = <span style=\"color: blue;\">Not<\/span> IsNull(Me!BeispieleErstellt)\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 3: Freischalten der Kontrollk\u00e4stchen<\/span><\/b><\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>Form_Current()\n     ...\n     KontrollkaestchenFreischalten\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Au\u00dferdem bauen wir einen Aufruf in die Prozedur <b>chk_AfterUpdate <\/b>ein, die nach dem Aktualisieren eines Kombinationsfeldes ausgel\u00f6st wird:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>chk_AfterUpdate(strFeld<span style=\"color: blue;\"> As String<\/span>)\n     ...\n     KontrollkaestchenFreischalten\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Damit deaktivieren wir alle Kontrollk\u00e4stchen unterhalb des ersten nicht angehakten.<\/p>\n<h2>Beim Deaktivieren alle Folgeaufgaben deaktivieren<\/h2>\n<p>Der Benutzer hat noch die M\u00f6glichkeit, eines der aktivierten Kontrollk\u00e4stchen wieder zu deaktivieren. Das bedeutet, dass er eine Unteraufgabe mittendrin wieder als nicht erledigt markieren kann, obwohl die folgenden Aufgaben aktiviert bleiben. Das k\u00f6nnen wir auf zwei Arten behandeln:<\/p>\n<ul>\n<li>Entweder wir verhindern das Deaktivieren einer Unteraufgabe, zu der bereits eine Folgeaufgabe als erledigt markiert wurde, oder<\/li>\n<li>wir markieren alle folgenden Unteraufgaben wieder als nicht erledigt, wenn die dar\u00fcber liegende Unteraufgabe als nicht erledigt markiert wird.<\/li>\n<\/ul>\n<p>Im ersten Fall m\u00fcsste der Benutzer dann von unten nach oben alle Aufgaben bis zur zuletzt erledigten Aufgabe als nicht erledigt markieren. Im zweiten Fall sollten wir eine R\u00fcckfrage einbauen, bevor der Benutzer mehrere als erledigt markierte Unteraufgaben wieder zur\u00fccknimmt.<\/p>\n<p>Wir w\u00e4hlen die zweite Variante, da diese f\u00fcr den Benutzer weniger Mausklicks erfordert, falls er tats\u00e4chlich einmal mehrere Unteraufgaben versehentlich als erledigt markiert hat.<\/p>\n<p>Hier sehen wir, dass eine statische Vorgehensweise mit dem Eintragen der einzelnen Unteraufgaben als einzelne Felder in eine Tabelle f\u00fcr jeden Schritt einigen Aufwand nach sich zieht. In diesem Fall m\u00fcssen wir f\u00fcr jede Unteraufgabe, die wir als nicht erledigt markieren wollen, alle folgenden Unteraufgaben durchlaufen, was viel Arbeit bedeutet &#8211; vor allem, wo wir mit <b>chk_AfterUpdate <\/b>schon eine parametrisierte Prozedur programmiert haben, die Code einsparen sollte.<\/p>\n<p>Hier m\u00fcssten wir nun in den <b>Else<\/b>-Zweig einsteigen. Dort m\u00fcssten wir in einer <b>Select Case<\/b>-Bedingung pr\u00fcfen, welches Feld der Benutzer bearbeitet hat und davon abh\u00e4ngig die Felder f\u00fcr alle folgenden Unteraufgaben leeren und die Eigenschaften der Steuerelemente erneut einstellen. Die <b>Select Case<\/b>-Bedingung gliedern wir allerdings so aus, dass wir zumindest nicht alle Konstellationen auflisten m\u00fcssen.<\/p>\n<p>Schauen wir uns zun\u00e4chst die \u00c4nderungen beziehungsweise den <b>Else<\/b>-Zweig der Prozedur <b>chk_AfterUpdate <\/b>an (siehe Listing 4). Hier f\u00fcgen wir eine <b>If&#8230;Then<\/b>-Bedingung ein, deren Bedingung das Ergebnis des Aufrufs einer <b>MsgBox<\/b>-Funktion ist.<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>chk_AfterUpdate(strFeld<span style=\"color: blue;\"> As String<\/span>)\n     <span style=\"color: blue;\">If <\/span>Me(\"chk\" &amp; strFeld) = <span style=\"color: blue;\">True<\/span><span style=\"color: blue;\"> Then<\/span>\n         Me(strFeld) = Date\n         Me(\"txt\" &amp; strFeld).Visible = <span style=\"color: blue;\">True<\/span>\n     <span style=\"color: blue;\">Else<\/span>\n         <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">MsgBox<\/span>(\"Diese Aufgabe inklusive der folgenden Aufgaben als nicht erledigt markieren\", vbYesNo) = vbYes<span style=\"color: blue;\"> Then<\/span>\n             AlsNichtErledigtMarkieren strFeld\n         <span style=\"color: blue;\">End If<\/span>\n     <span style=\"color: blue;\">End If<\/span>\n     KontrollkaestchenFreischalten\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 4: Aktualisierung nach \u00c4nderung des Wertes eines Kontrollk\u00e4stchens<\/span><\/b><\/p>\n<p>Diese soll fragen, ob diese Aufgabe einschlie\u00dflich der folgenden Aufgaben wieder als nicht erledigt markiert werden soll. Antwortet der Benutzer hier mit <b>Ja<\/b>, ruft die Prozedur die Routine <b>AlsNichtErledigtMarkieren <\/b>auf und \u00fcbergibt den Namen des Feldes, also beispielsweise <b>BeispieleErstellt<\/b>.<\/p>\n<h2>Prozedur zum Markieren als nicht erledigt<\/h2>\n<p>Wenn der Benutzer die unterste Aufgabe, hier <b>Beitrag online<\/b>, als nicht erledigt markiert, soll nur das Kontrollk\u00e4stchen <b>chkBeitragOnline<\/b> auf <b>False <\/b>eingestellt und das Textfeld <b>txtBeitragOnline <\/b>geleert werden. Das ist der erste <b>Case<\/b>-Zweig der folgenden Prozedur <b>AlsNichtErledigtMarkieren<\/b>:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>AlsNichtErledigtMarkieren(strFeld<span style=\"color: blue;\"> As String<\/span>)\n     Select Case strFeld\n         <span style=\"color: blue;\">Case <\/span>\"BeitragOnline\"\n             Me!txtBeitragOnline = Null\n             Me!chkBeitragOnline = <span style=\"color: blue;\">False<\/span><\/pre>\n<p>Der zweite Zweig wird aufgerufen, wenn der Benutzer die vorletzte Aufgabe als nicht erledigt markieren will. Dann sollen die Kontrollk\u00e4stchen und Textfelder f\u00fcr die beiden letzten Aufgaben auf <b>False <\/b>und <b>Null <\/b>eingestellt werden:<\/p>\n<pre>         <span style=\"color: blue;\">Case <\/span>\"BeispieleErstellt\"\n             Me!txtBeispieleErstellt = Null\n             Me!chkBeispieleErstellt = <span style=\"color: blue;\">False<\/span>\n             Me!txtBeitragOnline = Null\n             Me!chkBeitragOnline = <span style=\"color: blue;\">False<\/span><\/pre>\n<p>Der n\u00e4chste Zweig ist dann wieder zwei Anweisungen l\u00e4nger und so setzt es sich fort:<\/p>\n<pre>         <span style=\"color: blue;\">Case <\/span>\"BeitragEingelesen\"\n             Me!txtBeitragEingelesen = Null\n             Me!chkBeitragEingelesen = <span style=\"color: blue;\">False<\/span>\n             Me!txtBeispieleErstellt = Null\n             Me!chkBeispieleErstellt = <span style=\"color: blue;\">False<\/span>\n             Me!txtBeitragOnline = Null\n             Me!chkBeitragOnline = <span style=\"color: blue;\">False<\/span>\n         <span style=\"color: blue;\">Case <\/span>\"BeitragKorrigiert\"\n             Me!txtBeitragKorrigiert = Null\n             Me!chkBeitragKorrigiert = <span style=\"color: blue;\">False<\/span>\n             Me!txtBeitragEingelesen = Null\n             Me!chkBeitragEingelesen = <span style=\"color: blue;\">False<\/span>\n             Me!txtBeispieleErstellt = Null\n             Me!chkBeispieleErstellt = <span style=\"color: blue;\">False<\/span>\n             Me!txtBeitragOnline = Null\n             Me!chkBeitragOnline = <span style=\"color: blue;\">False<\/span>\n         '... weitere Case-Zweige\n     <span style=\"color: blue;\">End Select<\/span>\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Das k\u00f6nnen wir erheblich abk\u00fcrzen durch die folgende Variante, die sich selbst f\u00fcr die untergeordneten Felder aufruft:<\/p>\n<pre><span style=\"color: blue;\">Private Sub <\/span>AlsNichtErledigtMarkieren(strFeld<span style=\"color: blue;\"> As String<\/span>)\n     Me(\"txt\" &amp; strFeld) = Null\n     Me(\"chk\" &amp; strFeld) = <span style=\"color: blue;\">False<\/span>\n     Select Case strFeld\n         <span style=\"color: blue;\">Case <\/span>\"BeitragOnline\"\n         <span style=\"color: blue;\">Case <\/span>\"BeispieleErstellt\"\n             AlsNichtErledigtMarkieren \"BeitragOnline\"\n         <span style=\"color: blue;\">Case <\/span>\"BeitragEingelesen\"\n             AlsNichtErledigtMarkieren \"BeispieleErstellt\"\n         <span style=\"color: blue;\">Case <\/span>\"BeitragKorrigiert\"\n             AlsNichtErledigtMarkieren \"BeitragEingelesen\"\n         <span style=\"color: blue;\">Case <\/span>\"BeitragLektoriert\"\n             AlsNichtErledigtMarkieren \"BeitragKorrigiert\"\n         <span style=\"color: blue;\">Case <\/span>\"BeitragZumLektor\"\n             AlsNichtErledigtMarkieren \"BeitragLektoriert\"\n         <span style=\"color: blue;\">Case <\/span>\"BeitragGesetzt\"\n             AlsNichtErledigtMarkieren \"BeitragZumLektor\"\n         <span style=\"color: blue;\">Case <\/span>\"BeitragGeschrieben\"\n             AlsNichtErledigtMarkieren \"BeitragGesetzt\"\n     <span style=\"color: blue;\">End Select<\/span>\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Wenn sich Ihre Workflows selten \u00e4ndern, so wie es etwa beim Schreiben von Beitr\u00e4gen wie diesem hier ist, k\u00f6nnen Sie mit dieser Variante einer Workflow-Verwaltung vermutlich gut arbeiten &#8211; und sollte tats\u00e4chlich mal ein Zwischenschritt auftauchen, k\u00f6nnen Sie als Entwickler schnell die notwendigen Elemente im Formular und im VBA-Code hinzuf\u00fcgen.<\/p>\n<p>Spannender wird es, wenn Sie verschiedene Workflows pflegen wollen, die sich gelegentlich \u00e4ndern. Oder wenn Sie die Workflow-Anwendung Benutzern zur Verf\u00fcgung stellen wollen, die selbst ihre Workflows gestalten sollen. Dann m\u00fcsste man die hier verwendeten Ans\u00e4tze in Form einer flexiblen Anwendung umsetzen. Das bedeutet, dass man sowohl f\u00fcr die Workflows als auch f\u00fcr die enthaltenen Aufgaben Tabellen anlegt, in denen die Daten gespeichert werden, sowie Formulare, mit denen der Benutzer seine Workflows selbst definieren kann.<\/p>\n<p>Eine Erweiterung der vorliegenden und auch einer flexibleren L\u00f6sung w\u00e4re das Anzeigen aller Workflows in einer \u00dcbersicht, um den Status der einzelnen Aufgaben im \u00dcberblick zu betrachten.<\/p>\n<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>WorkflowsImGriff.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/9F382898-C003-4746-9155-CC2112E9B329\/aiu_1288.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt immer wieder Standardabl&auml;ufe im B&uuml;roalltag. Bei mir ist es das Schreiben von Artikeln. F&uuml;r jeden Artikel gibt es einige Aufgaben, die immer in der gleichen Reihenfolge ablaufen. Wer denkt, das geht nach 20 Jahren automatisch, irrt sich &#8211; immer wieder bleibt mal eine Teilaufgabe liegen oder wird nicht in der richtigen Reihenfolge erledigt. Um das zu &auml;ndern, erstellen wir in diesem Beitrag eine L&ouml;sung, um wiederkehrerende, nach dem gleichen Schema ablaufende Aufgaben zu verfolgen. Dazu speichern wir die einzelnen Schritte als Felder in einer Tabelle. &Uuml;ber die Benutzeroberfl&auml;che stellen wir die Aufgaben und die Teilschritte optisch so dar, dass die nun zu erledigen Teilaufgaben immer im Blickfeld sind!<\/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":[66012021,662021,44000027],"tags":[],"class_list":["post-55001288","post","type-post","status-publish","format-standard","hentry","category-66012021","category-662021","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>Statische Workflows im Griff - 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\/Statische_Workflows_im_Griff\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Statische Workflows im Griff\" \/>\n<meta property=\"og:description\" content=\"Es gibt immer wieder Standardabl&auml;ufe im B&uuml;roalltag. Bei mir ist es das Schreiben von Artikeln. F&uuml;r jeden Artikel gibt es einige Aufgaben, die immer in der gleichen Reihenfolge ablaufen. Wer denkt, das geht nach 20 Jahren automatisch, irrt sich - immer wieder bleibt mal eine Teilaufgabe liegen oder wird nicht in der richtigen Reihenfolge erledigt. Um das zu &auml;ndern, erstellen wir in diesem Beitrag eine L&ouml;sung, um wiederkehrerende, nach dem gleichen Schema ablaufende Aufgaben zu verfolgen. Dazu speichern wir die einzelnen Schritte als Felder in einer Tabelle. &Uuml;ber die Benutzeroberfl&auml;che stellen wir die Aufgaben und die Teilschritte optisch so dar, dass die nun zu erledigen Teilaufgaben immer im Blickfeld sind!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-22T16:26:20+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Statische Workflows im Griff\",\"datePublished\":\"2021-03-22T16:26:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/\"},\"wordCount\":2652,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/85acb7708dd1455ebab582293413f3d1\",\"articleSection\":[\"1\\\/2021\",\"2021\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/\",\"name\":\"Statische Workflows im Griff - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/85acb7708dd1455ebab582293413f3d1\",\"datePublished\":\"2021-03-22T16:26:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/85acb7708dd1455ebab582293413f3d1\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/85acb7708dd1455ebab582293413f3d1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Statische_Workflows_im_Griff\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Statische Workflows im Griff\"}]},{\"@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":"Statische Workflows im Griff - 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\/Statische_Workflows_im_Griff\/","og_locale":"de_DE","og_type":"article","og_title":"Statische Workflows im Griff","og_description":"Es gibt immer wieder Standardabl&auml;ufe im B&uuml;roalltag. Bei mir ist es das Schreiben von Artikeln. F&uuml;r jeden Artikel gibt es einige Aufgaben, die immer in der gleichen Reihenfolge ablaufen. Wer denkt, das geht nach 20 Jahren automatisch, irrt sich - immer wieder bleibt mal eine Teilaufgabe liegen oder wird nicht in der richtigen Reihenfolge erledigt. Um das zu &auml;ndern, erstellen wir in diesem Beitrag eine L&ouml;sung, um wiederkehrerende, nach dem gleichen Schema ablaufende Aufgaben zu verfolgen. Dazu speichern wir die einzelnen Schritte als Felder in einer Tabelle. &Uuml;ber die Benutzeroberfl&auml;che stellen wir die Aufgaben und die Teilschritte optisch so dar, dass die nun zu erledigen Teilaufgaben immer im Blickfeld sind!","og_url":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-03-22T16:26:20+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Statische Workflows im Griff","datePublished":"2021-03-22T16:26:20+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/"},"wordCount":2652,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1","articleSection":["1\/2021","2021","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/","url":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/","name":"Statische Workflows im Griff - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1","datePublished":"2021-03-22T16:26:20+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/85acb7708dd1455ebab582293413f3d1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Statische_Workflows_im_Griff\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Statische Workflows im Griff"}]},{"@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\/55001288","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=55001288"}],"version-history":[{"count":2,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001288\/revisions"}],"predecessor-version":[{"id":88072381,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001288\/revisions\/88072381"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}