Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Es gibt immer wieder Standardabläufe im Büroalltag. Bei mir ist es das Schreiben von Artikeln. Fü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 ändern, erstellen wir in diesem Beitrag eine Lösung, um wiederkehrende, nach dem gleichen Schema ablaufende Aufgaben zu verfolgen. Dazu speichern wir die einzelnen Schritte als Felder in einer Tabelle. Über die Benutzeroberfläche stellen wir die Aufgaben und die Teilschritte optisch so dar, dass die nun zu erledigenden Teilaufgaben immer im Blickfeld sind!
Beispiel für einen Workflow
Wie sieht ein beispielhafter Workflow aus Ich wähle gleich den aus meiner täglichen Arbeit – das Erstellen eines Beitrags etwa für das vorliegende Magazin. Hier tauchen die folgenden Aufgaben auf:
- Beitrag in Beitragsdatenbank aufnehmen
- Beitrag schreiben
- Beitrag setzen
- Beitrag zum Lektor schicken
- Beitrag wird durch Lektor geprüft
- Korrekturvorschläge des Lektors einarbeiten
- Beitrag in Beitragsdatenbank einlesen
- Beispieldateien in Beitragsdatenbank aufnehmen
- Beitrag und Beispieldateien online stellen
Zusätzlich gibt es je Magazin noch eine Reihe weiterer Aufgaben:
- PDF erstellen
- PDF zum Verlag schicken
- Verlag macht letzte Korrekturvorschläge
- Korrekturvorschläge des Verlags einarbeiten
- Magazin online stellen
- Downloadseite um neue Ausgabe erweitern
- Neuen Benutzer für die neuen Zugangsdaten anlegen
- Newsletter an Abonnenten schicken
Das sind bereits einige Aufgaben, die im Alltag noch etwas detaillierter ausfallen. Sie sollen jedoch reichen, um Beispielmaterial für die zu erstellende Lösung zu liefern.
In der Praxis gibt es für jeden Beitrag einen neuen Workflow und auch für jede neue Ausgabe. Wir könnten noch einen Schritt weitergehen und die Workflows einander unterordnen, also beispielsweise die Beitrags-Workflows den Magazin-Workflows zuweisen. Dies wollen wir aus Gründen der Übersicht in diesem Beitrag nicht erledigen.
Einfachste Methode
Wenn Sie immer wiederkehrende Unteraufgaben haben, können Sie einfach für jede Aufgabe ein Kontrollkästchen zur Aufgabe hinzufügen und diese nach Erledigung der Aufgaben abhaken. Damit wissen Sie jederzeit, welchen Stand die Aufgabe hat. Wenn die Unteraufgaben sich nicht verändern, ist das auch die beste und einfachste Methode.
Wenn wir bei meinem Beispiel bleiben, wo sich die Unteraufgaben beim Schreiben eines Beitrags nie ändern, können Sie einfach für jede Unteraufgabe ein Ja/Nein-Feld zu der Tabelle hinzufügen, in der Sie auch weitere Daten zu den Beiträgen speichern – wie den Titel, den Inhalt et cetera.
Der Entwurf der Tabelle tblBeitraege sieht danach etwa wie in Bild 1 aus.
Bild 1: Einfache Variante zum Einbau eines Workflows
Danach können Sie die Felder wie in Bild 2 in einem Formular zur Bearbeitung der Beiträge unterbringen. Damit erhalten Sie einen detaillierten Überblick über alle Daten zu einem Beitrag.
Bild 2: Formularentwurf mit Ja/Nein-Feldern
Noch praktischer für einen Überblick über alle Aufgaben ist eine Übersicht der Aufgaben mehrerer Beiträge in einem Endlosformular oder in einem Datenblatt. Gegebenenfalls können Sie auch ein Listenfeld nutzen.
Bessere Reproduzierbarkeit mit Datum
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üssen Sie gegebenenfalls den kompletten Ordner der gesendeten Elemente in Outlook durchsuchen.
Etwas einfacher geht es, wenn Sie zumindest wissen, wann Sie den Beitrag an den Lektor verschickt haben. Zu diesem Zweck ändern wir den Datentyp der Ja/Nein-Felder der Tabelle tblBeitraege in Datum/Zeit um (siehe Bild 3).
Bild 3: Tabelle mit Datum/Uhrzeit-Feldern
Allerdings wollen wir diese Information nur abrufen, wenn unbedingt nötig. In einer Übersicht hingegen sollen nur Kontrollkästchen angezeigt werden, die angeben, ob die Unteraufgabe erledigt wurde oder nicht. In der Detailansicht wollen wir auch nur Kontrollkästchen 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.
Zusammenfassend: Die Tabelle soll ein Datumsfeld für das Erledigungsdatum einer jeden Unteraufgabe enthalten. Die Formulare hingegen sollen ein Kontrollkästchen anzeigen. Das Kontrollkästchen soll angehakt sein, wenn das Datumsfeld nicht leer ist, wenn es leer ist, soll das Kontrollkästchen keinen Haken enthalten. Außerdem soll, wenn der Benutzer einen Haken in ein Kontrollkästchen setzt, das Erledigungsdatum in das zugrunde liegende Datum/Zeit-Feld eingetragen werden.
Wir haben also ein Datum/Zeit-Feld, dessen Status Null/Nicht Null in Form des Wertes eines Kontrollkästchens erscheinen soll. Dazu benötigen wir eine technische Lösung, die zum Beispiel in einer entsprechend formulierten Abfrage liegen könnte. Diese würde für jedes Unteraufgaben-Feld zwei Felder enthalten – einmal das Datum/Zeit-Feld und ein weiteres Feld, das prüft, ob das Datum/Zeit-Feld bereits einen Wert enthält oder nicht und abhängig davon den Wert True oder False ausgibt.
Diese Abfrage formulieren wir wie in Bild 4. Sie enthält das Feld BeitragGeschrieben und ein berechnetes Feld namens BeitragGeschriebenJaNein, das den Wert -1 liefert, wenn das Feld BeitragGeschrieben gefüllt ist:
Bild 4: Abfrage, die sowohl das Datum/Zeit-Feld als auch ein davon abhängiges Ja/Nein-Feld liefert.
BeitragGeschriebenJaNein: Nicht IstNull([BeitragGeschrieben])
Bild 5 zeigt, wie das Ergebnis der Abfrage für zwei Datensätze aussieht, von denen einer einen Datumswert im Feld BeitragGeschrieben aufweist und der andere den Wert Null.
Bild 5: Ergebnis der Abfrage mit je einem gefüllten und einem nicht gefüllten BeitragGeschrieben-Feld
Wir würden nun gern noch das berechnete Feld BeitragGeschriebenJaNein als Kontrollkästchen in der Datenblattansicht anzeigen. Dazu verwenden wir normalerweise die Eigenschaft Steuerelement anzeigen im Bereich Nachschlagen der Eigenschaften einer Spalte der Abfrage. Hier finden wir allerdings nur die drei Möglichkeiten Textfeld, Listenfeld und Kombinationsfeld vor (siehe Bild 6). Anders ist es, wenn wir ein Abfragefeld auf Basis eines Ja/Nein-Feldes erstellen – dann stehen Kontrollkästchen, Textfeld und Kombinationsfeld zur Verfügung. Da dies hier nicht der Fall ist, müssen wir in den sauren Apfel beißen und vorerst mit Textfeldern arbeiten.
Bild 6: Die Anzeige als Kontrollkästchen ist nicht möglich.
Der Nachteil davon zeigt sich, wenn wir das nun in einen Formular abbilden wollen – wir hätten dort für die berechneten Ja/Nein-Felder gern direkt Kontrollkästchen erhalten, aber beim Hinzufügen im Formularentwurf übernimmt Access den in der Tabelle beziehungsweise Abfrage voreingestellten Steuerelementtyp.
Wenn wir die Felder aus der Abfrage, welche die Ja/Nein-Ausdrücke für die Datumsfelder berechnen, in das Formular ziehen und versuchen, diese in Kontrollkästchen umzuwandeln, finden wir auch hier diese Möglichkeit nicht vor (siehe Bild 7).
Bild 7: Textfelder können nicht in Kontrollkästchen umgewandelt werden
Also müssen wir wohl oder übel jeweils ein Kontrollkästchen für jedes Feld in den Formularentwurf ziehen und dann der Eigenschaft Steuerelementinhalt die berechneten Ja/Nein-Felder der als Datensatzquelle verwendeten Abfrage zuweisen. Außerdem benennen wir die Kontrollkästchen auch direkt mit dem passenden Präfix, also beispielsweise chkBeitragGeschrieben.
Für das berechnete Feld BeitragGeschriebenJaNein sieht das Kontrollkästchen wie in Bild 8 aus: Es hat den Namen chkBeitragGeschrieben und den Steuerelementinhalt BeitragGeschriebenJaNein.
Bild 8: Kontrollkästchen für die Unteraufgaben
Rechts daneben wollen wir nun noch das Datum abbilden für den Fall, dass die Unteraufgabe bereits erledigt wurde. Dazu fügen wir noch die entsprechenden Textfelder hinzu. Diese markieren wir in der Feldliste und ziehen sie gleich neben die bereits angelegten Kontrollkästchen. Die mit diesen Textfeldern ebenfalls zum Formularentwurf hinzugefügten Bezeichnungsfelder markieren wir und löschen diese direkt wieder. Die Textfelder platzieren wir so, dass sie sich direkt neben den Kontrollkästchen befinden.
Die Namen der Textfelder ergänzen wir ebenfalls noch um das entsprechende Präfix, in diesem Fall txt. Das Textfeld für die erste Unteraufgabe heißt so beispielsweise txtBeitragGeschrieben.
Datum für erledigte Aufgaben anzeigen
Nun fehlt noch Code, der dafür sorgt, dass die Textfelder nur erscheinen, wenn die jeweilige Unteraufgabe bereits erledigt wurde. Diesen platzieren wir in der Prozedur, die durch das Ereignis Beim Anzeigen des Formulars ausgelöst wird. Diese Prozedur finden Sie in Listing 1.
Private Sub Form_Current() Me!txtBeitragGeschrieben.Visible = Not IsNull(Me!BeitragGeschrieben) Me!txtBeitragGesetzt.Visible = Not IsNull(Me!BeitragGesetzt) Me!txtBeitragZumLektor.Visible = Not IsNull(Me!BeitragZumLektor) Me!txtBeitragLektoriert.Visible = Not IsNull(Me!BeitragLektoriert) Me!txtBeitragKorrigiert.Visible = Not IsNull(Me!BeitragKorrigiert) Me!txtBeitragEingelesen.Visible = Not IsNull(Me!BeitragEingelesen) Me!txtBeispieleErstellt.Visible = Not IsNull(Me!BeispieleErstellt) Me!txtBeitragOnline.Visible = Not IsNull(Me!BeitragOnline) End Sub
Listing 1: Ein- oder Ausblenden der Datumsfelder für erledigte Unteraufgaben
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo