Outlook 2007 als Projektzeiterfassungs-Frontend

Die Projektzeiterfassung leidet meist darunter, dass man seinen Pflichten nicht nachkommt und seine Zeiten nicht pflegt. Das ist auch verständlich: Heutzutage muss sich der Anwender mit immer mehr Tools herumschlagen und ist beinahe mehr mit der Dokumentation seines Tuns als mit seiner Arbeit beschäftigt. Da wäre es doch schön, wenn man zwei Fliegen mit einer Klappe schlagen könnte – etwa, indem man die in Outlook eingetragenen Termine und mehr direkt in die Projektzeiterfassung überträgt.

Outlook bietet grundsätzlich nicht alles, was eine Projektzeiterfassung ausmacht: So kann man dort eigentlich keine Projekte festlegen und auch keine Tätigkeiten mit Aufgaben verknüpfen. Diese drei Elemente machen nämlich i,m Kontext dieses Beitrags die Erfassung von Projektzeiten aus: Zu einem Projekt gibt es mehrere Aufgaben und jede Aufgabe kann mit einer oder mehreren Tätigkeiten erledigt werden. Na gut, unter Outlook gibt es immerhin das Aufgaben-Element. Aber was ist mit Projekten und Tätigkeiten Wie bildet man diese nach und vor allem: Wie verknüpfen Sie diese miteinander

Kümmern wir uns zunächst um die Projekte. In einer Anwendung wie Outlook haben Projektinformationen eigentlich nichts zu suchen und auch der allgemeine Mitarbeiter braucht nur zu wissen, welche Aufgaben in Zusammenhang mit einem Projekt anfallen. Also reicht eine Möglichkeit aus, Projekte in irgendeiner Form aufzulisten und diesen Aufgaben zuzuweisen – denn die sind ja, wie oben besprochen, als einziges Element standardmäßig schon in Outlook vorhanden. Zu einem Projekt gehören mehrere Aufgaben. Welcher Analogieschluss lässt sich daraus für die Elemente von Outlook ziehen Aufgaben sind im Aufgabenordner enthalten. Ein Aufgabenordner kann aber, wie auch Mail- oder Kontaktordner, einen oder mehrere, auch hierarchisch verschachtelte Unterordner besitzen. Damit wäre das Projekte-Problem gelöst: Sie legen einfach im Aufgabenordner einen Unterordner namens Projekte an und in diesem für jedes Projekt einen weiteren Ordner.

Das sieht dann in der Ordnerliste von Outlook, die sich für solche Ansichten am besten eignet, etwa wie in Bild 1 aus. Diese Ansicht erhalten Sie über Ansicht|Navigationsbereich|Normal und anschließendes Anklicken des Eintrags Ordnerliste.

pic001.tif

Bild 1: Projektordner und darin enthaltene Aufgaben

Hat man einmal ein paar Projektordner angelegt, kann man direkt die passenden Aufgaben – natürlich inklusive geplantem Fertigstellungsdatum – dort ablegen. Projekte, Aufgaben … fehlen noch die Tätigkeiten. Eine Tätigkeit ist ein Element, das durch die Beschreibung der Tätigkeit selbst sowie weitere Informationen, vornehmlich Start- und der Endzeit, gekennzeichnet ist. Richtig – die Beschreibung passt genau auf einen Outlook-Termin. Im Betreff legen Sie eine überschrift fest, in der Beschreibung gegebenenfalls weitere Informationen, und zwei weitere Felder dienen zum Eingeben des Start- und des Endzeitpunkts, aus denen man letztlich die Dauer ermittelt.

Das einzige Problem ist, dass sich ein Termin nicht so leicht einer Aufgabe zuordnen lässt wie eine Aufgabe einem Projektordner. Die Lösung dieses Problems betrachten wir jedoch weiter unten. Bis dahin sei zumindest verraten, wie der Benutzer Termine beziehungsweise Tätigkeiten anlegen kann, die mit einer bestimmten Aufgabe verknüpft sind: Er wechselt dazu von der in Bild 1 gezeigten Ansicht mit einem Klick auf die Schaltfläche Kalender des Navigationsbereichs und aktiviert dann mit Ansicht|Aufgabenleiste|Normal die Aufgabenleiste. Diese zeigt je nach Einstellung beispielsweise die demnächst fertig zu stellenden Aufgaben an, was in diesem Fall Voraussetzung ist (siehe Bild 2): Eine solche Aufgabe lässt sich nämlich per Drag & Drop mit der Maus auf den Zeitplan des aktuellen Tages ziehen und übernimmt einige Eigenschaften in Textform in die Terminbeschreibung (siehe Bild 3). Der Termin hat nun einen oberflächlichen Bezug, aber keine wirkliche Beziehung zu der Aufgabe, aus der er entstanden ist.

pic002.tif

Bild 2:
Neue Tätigkeiten legen Sie durch Ziehen von Aufgaben in den Kalender an.

pic003.tif

Bild 3: Ein Termin, der durch Ziehen einer Aufgabe in den Kalender erzeugt wurde.

Synchronerfassung

Bis jetzt hat der Beitrag noch nicht viel mit Access zu tun, was sich nun ändern wird: Wie Sie vielleicht wissen, ist Outlook zwar gut in der Erfassung von Terminen, Kontakten et cetera, aber es bringt zum Beispiel keine Werkzeuge mit, um die im Verlauf eines Tages oder eines Projekts angefallenen Daten auszuwerten und gegebenenfalls in Druckform aufzubereiten (es kann prima Terminpläne und Telefonlisten drucken, aber das ist ein anderes Thema).

Hier kommt Access ins Spiel: Wenn man schon die ganzen Projektzeit-Daten in Outlook erfasst, muss es doch einen Weg geben, diese gleichzeitig in die Tabelle einer passenden Datenbank zu schreiben, die Sie unter dem Namen Projektzeiterfassung.mdb in den Beispieldateien zu diesem Beitrag finden.

Voraussetzungen/Vorbereitung

Outlook 2007 ist ein Muss für den Einsatz dieser Anwendung, da es einige Objekte und Ereigniseigenschaften mit sich bringt, ohne die das automatisierte Nachverfolgen der änderungen an Projektordnern, Aufgaben und Tätigkeiten und das damit verbundene Eintragen der Daten in eine Datenbank nicht möglich wäre. Es gibt aber noch weitere Voraussetzungen:

  • Sie importieren die vier Module ThisOutlookSession.cls, clsTasks.cls, mdlGlobal.bas und mdlOutlook.bas in das VBA-Projekt. Den Inhalt von ThisOutlookSession.cls kopieren Sie komplett in die gleichnamige standardmäßig vorhandene Klasse (in deutschen Versionen könnte ihr Name auch DieseOutlookSitzung heißen). Zum Importieren ziehen Sie einfach die passenden Dateien aus dem Windows Explorer in den Projekt-Explorer im VBA-Editor von Outlook (Strg + R).
  • Sie müssen für das Outlook-VBA-Projekt einen Verweis auf die passende DAO-Bibliothek festlegen.
  • Stellen Sie die Konstante cStrDB auf den Pfad der Datenbank Projektzeiterfassung.accdb/.mdb ein.
  • Stellen Sie die Sicherheitseinstellungen von Outlook so ein, dass es die Ausführung von Makros zulässt!
  • Sie sollten alle, aber auch wirklich alle Routinen mit einer Fehlerbehandlung ausstatten. Hilfe bietet Ihnen dabei die Toolsammlung MZ-Tools (siehe auch Beitrag Programmierhilfe, Shortlink 450). Die beim Start von Outlook in der Ereignisprozedur Application_Startup instanzierten Variablen werden nämlich bei unbehandelten Fehlern geleert; somit erfolgt im Anschluss kein übertragen der Daten von Projektordnern, Aufgaben und Tätigkeiten an die Datenbank mehr. In den Beispielmodulen können Sie sich ansehen, wie eine vollständige Fehlerbehandlung aussieht.

Outlook 2007 bietet immerhin einige Ereignisse, die mit den verschiedensten Ordnern und Elementen zusammenhängen und – so viel sei vorweggenommen – teilweise nicht ganz unkompliziert sind. Nun denn: Schauen wir uns an, was denn bei Verwendung des Projektzeiterfassungs-Frontends namens Outlook so alles erfasst werden müsste:

  • Wenn der Benutzer ein neues Projekt (sprich: einen Aufgabenordner) anlegt, sollte dieses ebenfalls in der Tabelle tblProjekte gespeichert werden. Andersherum wäre ein automatisches Anlegen des passenden Ordners beim Hinzufügen eines Projektdatensatzes in der Datenbank sinnvoll.
  • In beiden Fällen sollte man eine Beziehung herstellen – etwa in Form einer gemeinsamen ID. Dazu verwendet man praktischerweise die ID des Access-Datensatzes, die noch an geeigneter Stelle im Outlook-Ordner gespeichert werden muss. Mangels Alternativen kommt hier die Eigenschaft Beschreibung (VBA: Description) zum Zuge. Beim Anlegen des Projekts in der Datenbank sollte diese Eigenschaft also die neue ProjektID erhalten.
  • Eine neue Aufgabe innerhalb eines Projekts legt der Benutzer beispielsweise an, indem er den Projektordner markiert und doppelt auf die Aufgabenliste klickt. Diese Aufgabe sollte ebenfalls in Form eines Datensatzes der Tabelle tblAufgaben in der Datenbank verewigt werden. Auch hier gilt: Die Aufgaben-ID des neuen Datensatzes soll mit dem passenden Outlook-Element gespeichert werden. Glücklicherweise besitzen alle Elemente wie Mails, Termine oder Aufgaben die BillingInformation-Eigenschaft, die sonst wohl nie benötigt wird. Also schreibt man die Aufgaben-ID hier herein.
  • Fehlt noch der Bezug zum Projekt: Natürlich muss beim Anlegen der Aufgabe auch die ID des passenden Projekts berücksichtigt und in der Tabelle tblAufgaben gespeichert werden.
  • Legt der Benutzer auf oben genannte Weise eine neue Tätigkeit an, wird diese natürlich ebenfalls in der Datenbank gespeichert und zwar in der Tabelle tblTaetigkeiten. Die Tätigkeits-ID des neuen Datensatzes findet wiederum Platz in der BillingInformation-Eigenschaft. Schwierig wird es hier, die Beziehung zwischen Tätigkeit und Aufgabe herzustellen, also die Aufgabe zu ermitteln, auf der die Tätigkeit basiert.

Dies sind die Aktionen, die beim Anlegen von Elementen zu beachten sind. Es gibt noch eine Reihe weiterer Aktionen, die etwa durch das ändern, Verschieben oder Löschen von Elementen ausgelöst werden. Dies sind im Einzelnen:

  • Umbenennen eines Projektordners: Aktualisieren von tblProjekte
  • ändern von Eigenschaften einer Aufgabe: Aktualisieren von tblAufgaben
  • ändern von Eigenschaften einer Tätigkeit: Aktualisieren von tblTaetigkeiten
  • Verschieben einer Aufgabe in einen anderen Ordner: Aktualisieren von tblAufgaben
  • Löschen eines Projektordners: Führt nicht zum Löschen eines Datensatzes, sondern zum Eintragen des Löschdatums in ein geeignetes Feld des Datensatzes. Sollte nur möglich sein, wenn der Projektordner keine Aufgaben enthält.
  • Löschen einer Aufgabe: wie bei Projekten. Sollte nur möglich sein, wenn es keine korrespondierenden Tätigkeiten zur Aufgabe gibt.
  • Löschen einer Tätigkeit: wie bei Projekten

Ereignisreich

Das schöne an Outlook gegenüber allen anderen Mail-Clients und PIM-Programmen ist, dass es mit VBA steuerbar ist und – noch viel besser – auch noch die Möglichkeit bietet, Ereignisse von Objekten abzufangen und mit eigenem Code zu versehen. Einen kleinen Eindruck davon haben Sie bereits im Beitrag Outlook-Objekte in Access speichern (Shortlink 500) erhalten, nun geht es an den knallharten Praxiseinsatz.

Projektordner in Projektdatensätze
umwandeln

Als Erstes kümmern Sie sich um die Projektordner: Jedesmal, wenn der Benutzer einen neuen Ordner anlegt, soll Outlook dessen Informationen in der Tabelle tblProjekte speichern. Ein Projekt entspricht ja, wie weiter vorne erwähnt, einem Aufgabenordner in Outlook. Da die Benutzer vermutlich auch noch andere Aufgabenordner als die für Projekte benötigen, erstellen Sie für die Projektordner einen speziellen übergeordneten Aufgabenordner. Outlook sollte beim Start prüfen, ob der Projektordner schon vorhanden ist und ihn gegebenenfalls anlegen. Dazu benötigen Sie zunächst eine passende Objektvariable, die in diesem Fall mit dem Schlüsselwort WithEvents deklariert wird. Auf diese Weise können Sie, ähnlich wie bei Formularen oder Steuerelementen, Ereignisprozeduren schreiben, die beim Arbeiten mit diesem Element ausgelöst werden:

Dim WithEvents objProjects As Outlook.Folders

Um diese Zeile einzugeben, müssen Sie zunächst den VBA-Editor mit dem passenden Outlook-VBA-Projekt öffnen, was unter Outlook am schnellsten mit Alt + F11 erledigt ist. Sie finden dort ein Standardprojekt namens ThisOutlookSession (deutsche Variante: DieseOutlookSitzung) vor. Hier tragen Sie auch die folgende Routine ein, die mit dem AutoExec-Makro von Access vergleichbar ist: Sie wird nämlich beim Start von Outlook automatisch aufgerufen. In diesem Falle belegt sie die oben deklarierte Objektvariable mit einem Aufgabenordner namens Projekte. Beim ersten Aufruf ist dieser noch nicht vorhanden, was einen Fehler auslöst, den die Routine erkennt und mit dem Anlegen des benötigten Ordners ausbügelt – beim nächsten Versuch direkt im Anschluss wird die Folders-Auflistung des Projekte-Ordners dann zugewiesen (auch wenn sie zu diesem Zeitpunkt noch leer ist):

Private Sub Application_Startup() 
On Error Resume Next
Set objProjects = _
GetTaskfolder.Folders("Projekte").Folders If Not Err.Number = 0 Then GetTaskfolder.Folders.Add "Projekte", _
olFolderTasks End If Set objProjects = _
GetTaskfolder.Folders("Projekte").Folders ... End Sub

Was haben Sie nun davon Nun: Sie haben ein Objekt, für das Sie Ereignisprozeduren anlegen können, die etwa beim Hinzufügen oder ändern eines Ordners unterhalb des Projekte-Ordners ausgelöst werden. Dies nutzen Sie nun zunächst für eine Routine, die beim Anlegen eines neuen Projektordners einen entsprechenden Datensatz in die Tabelle tblProjekte der Projektzeiterfassungs-Datenbank einträgt (s. Listing 1). Die Routine prüft, ob der Ordner standardmäßig Aufgaben aufnimmt, und setzt dann eine SQL-Anweisung zusammen, die einen neuen Eintrag mit dem Namen des Ordners in die Tabelle tblProjekte einträgt.

Listing 1: Eintragen eines neuen Projekts

Private Sub objProjects_FolderAdd(ByVal Folder As MAPIFolder)
    Dim strSQL As String
    Dim objTasks As clsTasks
    Select Case Folder.DefaultItemType
        Case olTaskItem
            strSQL = "INSERT INTO tblProjekte(Projektbezeichnung) VALUES('" & Folder.Name & "')"
            CurrentDBC.Execute strSQL, dbFailOnError
            If CurrentDBC.RecordsAffected = 1 Then
                Folder.Description = "[project|" _
& CurrentDBC.OpenRecordset("SELECT @@IDENTITY").Fields(0).Value & "]" End If Case Else End Select ... End Sub

Nun fehlt dem Projektordner noch eine Information, die das anschließende Zuordnen zum frisch angelegten Datensatz erlaubt. Geeignet wäre hierfür die Datensatznummer in der Datenbank. Diese müssen Sie dem Outlook-Ordner nun noch in geeigneter Weise zuweisen. üblicherweise verwendet man dafür die sonst nicht genutzte BillingInformation-Eigenschaft oder eine benutzerdefinierte Eigenschaft. Beides steht aber nur für Elemente wie Mails, Termine et cetera zur Verfügung und nicht für Ordner. Also behilft man sich mit einer Notlösung und schreibt einen Ausdruck wie [project|125] in die Eigenschaft Description des Ordners. 125 wäre hier die ProjektID aus der Tabelle tblProjekte, die Sie mit der @@IDENTITY-Funktion von SQL ermitteln. Diese Funktion liefert den zuletzt in irgendeiner Tabelle der Datenbank eingefügten Autowert; die Verwendung eines Autowerts als Wert des Primärschlüsselfeldes ist hier also obligatorisch. Das Drumherum, also [project|…], dient der sicheren Identifizierung der Datensatznummer.

Wenn Sie nun Outlook neu starten und automatisch ein Projekte-Ordner im Bereich Aufgaben erscheint, können Sie das erste Projekt anlegen und einen ersten Blick in die Tabelle tblProjekte werfen. Dort sollte der erste Eintrag nun ebenfalls zu finden sein. Legen Sie nun direkt die nächste Ereignisprozedur an, die beim ändern des Ordners durch das Ereignis FolderChange ausgelöst wird (s. Listing 2). Diese Routine liest zunächst die ID des betroffenen Ordners aus – genau die ID, die Sie per [project|…] in die Eigenschaft Description eingebettet haben. Dafür sorgt die Funktion GetID, die für das Ermitteln der IDs verschiedener Objekte wie Ordner, Aufgaben und Tätigkeiten verantwortlich ist. Für das Ermitteln der Projekt-ID übergeben Sie der Funktion den Description-Wert sowie eine Zeichenfolge zur Charakterisierung des zu ermittelnden Wertes – hier project (dies scheint hier doppelt gemoppelt, ist aber an anderer Stelle sinnvoll, wie Sie weiter unten lesen werden).

Listing 2: ändern der Eigenschaften eines Projekts

Private Sub objProjects_FolderChange(ByVal Folder As MAPIFolder)
    Dim strDescription As String
    Dim lngProjectID As Long
    Dim strSQL As String
    Select Case Folder.DefaultItemType
        Case olTaskItem
            strDescription = Folder.Description
            lngProjectID = GetID(strDescription, "project")
            If lngProjectID = 0 Then
                strSQL = "INSERT INTO tblProjekte(Projektbezeichnung) VALUES('" & Folder.Name & "')"
                CurrentDBC.Execute strSQL, dbFailOnError
                If CurrentDBC.RecordsAffected = 1 Then
                    Folder.Description = "[project|" _
& CurrentDBC.OpenRecordset("SELECT @@IDENTITY").Fields(0).Value & "]" End If Else strSQL = "UPDATE tblProjekte SET Projektbezeichnung = '" & Folder.Name _
& "' WHERE ProjektID = " & lngProjectID CurrentDBC.Execute strSQL, dbFailOnError End If End Select End Sub

Die Routine prüft diesen Wert. Ist er 0, bedeutet dies, dass der Ordner noch gar nicht vorhanden ist und neu in der Datenbank angelegt werden muss. Hat er einen anderen Wert, passt die Routine den entsprechenden Datensatz in der Tabelle tblProjekte an. Woher aber kommt ein Ordner, der noch nicht in der Datenbank erfasst ist

Nun: Wenn der Benutzer direkt unterhalb des Aufgabenordners einen Ordner anlegt und diesen anschließend in den Projekte-Ordner zieht, wird dieser – im Sinne der vorliegenden Anwendung – auch zum Projektordner und entsprechend erfasst und gekennzeichnet.

Aufgaben anlegen

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar