Kolumne: SharePoint ganz praktisch

Workflowerweiterungen in SharePoint
Kommentare

In der letzten Ausgabe der Kolumne wurde bereits demonstriert, wie ein Workflow in Visual Studio realisiert werden kann. Jetzt werden in einem umfangreicheren Workflow erweiterte Aktivitäten verwendet. Zudem wird gezeigt, wie alle zugehörigen Workflowerweiterungen, wie Listen und ein eigener Aufgabeninhaltstyp, über das Lösungspaket bereitgestellt werden können.

Innerhalb von Unternehmen finden sich viele (Geschäfts-)Prozesse, die sich sehr gut über einen elektronischen Workflow-Prozess abbilden lassen. In der letzten Ausgabe wurde bereits verdeutlicht, wie einfach SharePoint-Workflows mit der neuen Windows Workflow Foundation 4 innerhalb von Visual Studio als Entwicklungs-Umgebung umgesetzt werden können. In der Regel muss hier keine zusätzliche Entwicklungsumgebung eingesetzt werden. Um nun erweiterte Möglichkeiten der Workflow Foundation demonstrieren zu können, wird nachfolgend ein klassischer Freigabeprozess für einen Urlaubsantrag umgesetzt. Der Workflow beinhaltet folgende Schritte:

  1. Ein Mitarbeiter füllt ein Urlaubsantragsformular aus.
  2. Der Mitarbeiter startet den Freigabeprozess.
  3. Für den Vorgesetzten und seinen Vertreter wird eine Aufgabe generiert.
  4. Reagiert der Vorgesetzte/Stellvertreter nicht innerhalb der gesetzten Frist, wird eine Erinnerung versendet.
  5. Wird der Antrag nicht genehmigt, wird dies im Antragsformular mit dem Status „Abgelehnt“ vermerkt. Zusätzlich kann eine Begründung für die Ablehnung erfasst werden.
  6. Am Ende wird der Antragsteller über eine E-Mail informiert.

Als zusätzliche Anforderung soll das Aufgabenformular für die Bewilligung oder Ablehnung des Urlaubsantrags zwei spezielle Schaltflächen mit der Beschriftung „Erholsamen Urlaub“ und „Bitte Urlaub verschieben“ bereitstellen.

Spalten, Listen und Inhaltstypen definieren

Wie aus den oberen Anforderungen hervorgeht, werden neben dem eigentlichen Workflow oftmals auch spezielle Listen oder Inhaltstypen benötigt. Für dieses Beispiel wird eine spezielle Liste für die Erfassung der Urlaubsanträge benötigt. Diese soll mindestens die folgenden Datenfelder bereitstellen:

  • Name des Antragstellers
  • Zeitraum des geplanten Urlaubs (Datum von/bis)
  • Vorgesetzter (SharePoint-Benutzerfeld)
  • Stellvertreter (SharePoint-Benutzerfeld)
  • Status des Urlaubsantrags

Da der Standard-SharePoint-Workflow-Inhaltstyp („Workflow Task“) für Aufgaben nur die beiden Statuswerte „Genehmigt“ und „Abgelehnt“ bereitstellt, muss an dieser Stelle ein eigener Aufgabeninhaltstyp realisiert werden. Dieser muss ein zusätzliches Bemerkungsfeld beinhalten sowie angepasste Statuswerte für die Beendigung der Aufgabe bereitstellen. Alle zusätzlichen SharePoint-Elemente sollten im optimalen Fall über ein kompaktes SharePoint-Lösungspaket zur Verfügung gestellt werden. Somit installiert die Workflowlösung direkt alle benötigten Bestandteile und der Workflow kann unmittelbar eingesetzt werden.

Die Umsetzung des Workflows beginnt daher wie so oft mit der Anlage einer leeren Visual-Studio-Projektmappe. Als Erstes wird der Projektmappe eine neue benutzerdefinierte Liste hinzugefügt. Dazu wird das Projekt um ein neues Listenelement ergänzt, wie es Abbildung 1 verdeutlicht. Anschließend muss die Art der Liste angegeben werden. Da noch keine Vorlage für die neue Liste existiert, kann die vordefinierte Option „Create a customizable list template …“ übernommen werden. Im oberen Bereich kann ein Titel für die neue Liste vergeben werden. Nachdem der Dialog bestätigt wurde, erstellt Visual Studio eine neue Listendefinition und Instanz. Im letzten Schritt müssen der neuen benutzerdefinierten Liste nun noch alle benötigten Spalten hinzugefügt werden.

Abb. 1: Anlegen einer Liste

Abb. 1: Anlegen einer Liste

Inhaltstyp für Aufgaben

Um den speziellen Inhaltstyp erstellen zu können, müssen im Vorfeld noch zwei neue SharePoint-Felder (Site Columns) definiert werden. Benötigt werden eine Spalte für eine optionale Bemerkung sowie eine spezielle Spalte für die Beendigung der Aufgaben mit den vorgegebenen Statuswerten „Erholsamen Urlaub“ und „Bitte Urlaub verschieben“. Für die Anlage von Spalten (Site Columns) kann die vordefinierte Visual-Studio-Vorlage „Site Column“ verwendet werden. Listing 1 zeigt die notwendige XML-Deklaration der zwei neuen Felder. Die Spalte für die Bemerkung ist eine einfache Textspalte. Die Spalte „TaskResultStatus“ verwendet den Typ OutcomeChoice. Spalten dieses Typs besitzen eine erweiterte Darstellung und Funktion. Das SharePoint-Aufgabenformular stellt die definierten Auswahlwerte (Choices) als Schaltflächen dar und markiert die Aufgabe mit Klick auf eine der Schaltflächen als erledigt.

Nach der Definition der Spalten kann nun der spezielle Inhaltstyp für die Bearbeitung von Urlaubsanträgen angelegt werden. Für die Definition von Inhaltstypen kann die verfügbare Visual-Studio-Vorlage „Content Type“ verwendet werden. Als Name wird hier „TaskHoliday“ vergeben. Damit der neue Inhaltstyp innerhalb eines Workflows für die Erstellung von Aufgaben verwendet werden kann, muss dieser zwingend vom SharePoint-Standardinhaltstyp „Workflow Task (SharePoint 2013)“ ableiten. Nach der initialen Anlage müssen die Felder des neuen Inhaltstyps festgelegt werden. Dazu wird die XML-Deklaration erweitert (Listing 2). Über die beiden Knoten FieldRef werden die zwei neuen Spalten hinzugefügt. Da alle Felder des übergeordneten Aufgabentyps geerbt werden, wird die Standardspalte „TaskOutcome“ entfernt, da hierfür nun eine eigene Spalte definiert wurde. Damit sind die Vorbereitungen für den Workflow getroffen.

  
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Field ID="{B5F4CE9A-BA2A-401B-85C2-1C072A0853BC}"
    Name="TaskResultStatus" DisplayName="Genehmigungsstatus"
    Type="OutcomeChoice" Required="FALSE" Group="dev-sky">
      <CHOICES>
        <CHOICE>Erholsamen Urlaub</CHOICE>
        <CHOICE>Bitte Urlaub verschieben</CHOICE>
      </CHOICES>
  </Field>
  <Field ID="{0E7EC780-4DFD-4F21-9D79-86B5ABEBD665}"
    Name="TaskComment" DisplayName="Kommentar"
    Type="Text" Required="FALSE" Group="dev-sky">
  </Field>
</Elements>
Ende
  
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <!-- Parent ContentType: Workflow Task (SharePoint 2013) (0x0108003365C4474CAE8C42BCE396314E88E51F) -->
  <ContentType ID="0x0108003365C4474CAE8C42BCE396314E88E51F00265CDC
                   7F7D21492F85A88F40204E621B" Name="Bewilligung Urlaubsantrag" 
   Group="Custom Content Types" 
   Description="Spezieller Inhaltstyp für die Bearbeitung ..." 
   Inherits="TRUE" Version="0">
    <FieldRefs>
      <RemoveFieldRef Name="TaskOutcome" ID="{55B29417-1042-47F0-9DFF-CE8156667F96}"></RemoveFieldRef>
      <FieldRef ID="{B5F4CE9A-BA2A-401B-85C2-1C072A0853BC}"
       DisplayName="Genehmigungsstatus" Required="FALSE" Name="TaskStatus" />
      <FieldRef ID="{0E7EC780-4DFD-4F21-9D79-86B5ABEBD665}" 
       DisplayName="Kommentar" Required="FALSE" Name="TaskComment" />
    </FieldRefs>
  </ContentType>
</Elements>
zhou_kolumne_2

Abb. 2: Gesamte Workflowsequenz

zhou_kolumne_3

Abb. 3: Sequenz für das Anlegen einer Aufgabe

Der Workflow

Nachdem nun alle benötigten SharePoint-Elemente bereitstehen, kann der eigentliche Workflow umgesetzt werden. Dazu wird der Projektmappe zunächst ein neuer leerer Workflow hinzugefügt. Anschließend werden, gemäß dem weiter oben beschriebenen Ablauf, alle benötigten Aktivitäten hinzugefügt. Abbildung 2 zeigt den vollständigen Workflowverlauf. Die beiden Sequenzen für die Erstellung der Aufgabe sowie deren Auswertung sind hier zunächst eingeklappt und werden im weiteren Verlauf detailliert erläutert. Zu Beginn erfolgt ein Zugriff auf den aktuellen Listeneintrag, auf dem der Workflow operiert. Hier werden die beiden Spalten „Vorgesetzter“ und „Stellvertreter“ ausgelesen, da für diese beiden Personen eine Aufgabe erstellt werden muss. Beide Spalten sind vom Typ „User“. Benötigt wird an dieser Stelle die ID der eingetragenen Person. Um an diese Information zu gelangen, muss man wissen, wie die Information in der Liste zu einer Person gespeichert ist. Neben dem eigentlichen Feld „Vorgesetzter“ enthält die Liste ein weiteres Feld mit dem gleichen Namen, aber mit angehängter Zeichenkette „Id“. Somit kann die ID der eingetragenen Person ermittelt werden.

Mit den so ermittelten Personeninformationen können die Aufgaben für den Vorgesetzten und den Stellvertreter erstellt werden. Um den Workflow übersichtlicher zu gestalten, erfolgt dies in einer geschachtelten Sequenz. Abbildung 3 zeigt den Inhalt der Sequenz. Wie auch schon in der letzten Ausgabe erläutert wurde, können Variablen an eine Sequenz gebunden werden. Somit wird ein Überschuss an globalen Variablen vermieden. Zu Beginn der Sequenz werden zusätzliche Benutzerinformationen abgerufen. Hier kommt die zuvor abgerufene Benutzer-ID zum Einsatz, die der Aktivität LookupSPUser übergeben wird. Der Rückgabewert der Aktivität LookupSPUser ist vom Typ DynamicValue. Um auf die einzelnen Eigenschaften zuzugreifen, kommt die Aktivität GetDynamicValueProperties zur Verwendung.

Abb. 4: Zugriff auf Eigenschaften einer DynamicValue-Variablen

Abb. 4: Zugriff auf Eigenschaften einer DynamicValue-Variablen

Abb. 5: Konfiguration einer CompositeTask-Aktivität

Abb. 5: Konfiguration einer CompositeTask-Aktivität

Abbildung 4 zeigt, wie einzelne Eigenschaften abgerufen werden können. Da zeitgleich mehrere Aufgaben für die Bearbeitung angelegt werden müssen, kommt die Aktivität CompositeTask zum Einsatz. Diese erwartet eine Auflistung (Collection) an Personen, für die eine Aufgabe erstellt werden soll. Daher wird im Vorfeld über die Aktivität BuildCollection eine neue Auflistung erstellt. Der Auflistung werden die ermittelten Personen-ID-Werte übergeben. Aus Gründen der Übersicht wird hier lediglich die Ermittlung und Verwendung der ID des Vorgesetzten gezeigt. Die Ermittlung der anderen ID verläuft analog.

Abbildung 5 zeigt den Dialog für die Konfiguration der Aufgabe. Im oberen Feld „Assigned To“ wird die zuvor erstellt Auflistung eingetragen. Die meisten anderen Felder sind selbsterklärend. Im Feld Body ist zu sehen, wie dynamische Werte eingebaut werden können. Ebenfalls wird das Fälligkeitsdatum (Due date) dynamisch berechnet. Im Bereich Task options kann festgelegt werden, ob für jeden Beteiligten eine separate Aufgabe angelegt und ob auf die Bearbeitung der Aufgabe gewartet werden soll. Wenn auf die Fertigstellung gewartet werden soll, kann weiterhin bestimmt werden, ob alle Aufgaben abgeschlossen sein müssen oder lediglich eine Aufgabe. Für den konkreten Workflow ist es ausreichend, wenn entweder der Vorgesetzte oder der Stellvertreter seine Aufgabe abgeschlossen hat. Daher wird hier die Option „Wait for first response“ gesetzt. Neben dieser Option sind noch die folgenden möglich:

  • Wait for all responses
  • Wait for specific response
  • Wait for percentage of a response

Bei Verwendung der letzten Option kann der Prozentwert festgelegt werden, ab dem die Aufgabe als erledigt markiert werden soll.

Im Bereich E-mail options kann das Verhalten für eine Erinnerung definiert werden, wenn die Aufgabe nicht rechtzeitig bearbeitet wurde.

Der Bereich Outcome options erlaubt die Definition des Ergebnisses der Aufgabe. Hier kommt nun der zuvor angelegte eigene Aufgabeninhaltstyp zum Einsatz. Dieser steht nun in der Auswahlliste „Task content type“ zur Auswahl bereit. Über die Auswahlliste „Outcome field“ muss das Feld mit dem Ergebnistypen ausgewählt werden. In der Auswahlliste darunter kann der Standardwert eingestellt werden. Somit ist die Konfiguration der Aufgabe abgeschlossen und die Einstellungen können gespeichert werden.

Auswertung der Aufgabe

Der Workflow wartet nun auf die Bearbeitung der Aufgabe. Sobald diese bearbeitet wurde, setzt der Workflow die Abarbeitung fort. Da der Antragsteller via E-Mail über den Status der Entscheidung informiert werden soll, muss dazu zunächst die E-Mail-Adresse oder der Claims-Log-in-Name des Antragstellers ermittelt werden. Das geht am einfachsten über die Aktivität LookupWorkflowContextProperties, über die die Eigenschaft Initiator ausgelesen werden kann. Diese Eigenschaft enthält die notwendige Information, um über die Aktivität Email später eine Mail senden zu können. Da die E-Mail-Aktivität für die To-Eigenschaft wiederum eine Auflistung (Collection) erwartet, wird diese nachfolgend über die BuildCollection-Aktivität vorbereitet. Abschließend muss das gewählte Ergebnis der Aufgabe ausgewertet werden. Dazu ist die if-Sequenz zuständig (Abb. 6). Hier wird nun die Variable CheckResult ausgewertet, die das Ergebnis der Auswahl aus dem Aufgabenformular beinhaltet. Wurde der Antrag genehmigt, ist der Wert 0, andernfalls wurde der Antrag abgelehnt. Ja nach Status wird dann eine E-Mail an den Antragsteller versendet. Danach ist der Workflow beendet.

Abb. 6: Auswertung der Aufgabe

Testen

Nach der Erstellung des Workflows kann dieser nun installiert und getestet werden. Die Testinstallation kann direkt aus Visual Studio heraus ausgeführt werden. Da alle für den Workflow notwendigen Elemente über die Lösung bereitgestellt werden, kann über die definierte Urlaubsliste direkt nach der Installation ein Urlaubswunsch erfasst werden. Anschließend kann der Workflow für den Listeneintrag gestartet werden. Der Workflow erstellt daraufhin neue Aufgaben und wartet auf die Bearbeitung. Hier sind nun auch die beiden speziellen Statuswerte „Erholsamen Urlaub“ und „Bitte Urlaub verschieben“ sichtbar. Nach der Auswahl einer dieser Schaltflächen läuft der Workflow erwartungsgemäß weiter und versendet eine E-Mail an den Antragsteller. Danach wird der Workflow beendet.

Zusammenfassung

Die heutige Ausgabe der Kolumne hat gezeigt, wie ein gesamter Workflow inklusive aller benötigten SharePoint-Erweiterungen aufgebaut werden kann. Die entstandene Projektmappe beinhaltet alle notwendigen Elemente. Wie gezeigt wurde, ermöglicht die Verwendung eines eigenen Aufgabeninhaltstyps die Definition eigener Statuswerte für die Fertigstellung. Dabei ist es wichtig zu beachten, dass der Inhaltstyp vom Standard-SharePoint-Workflow-Inhaltstyp abgeleitet werden muss. In der nächsten Ausgabe der Kolumne wird demonstriert, wie Webdienste verwendet und eigene Aktivtäten realisiert werden können.

Das Video zum Text

Als Ergänzung zum Artikel gibt es ein Video, das die vorgestellten Skripte und ihre Ergebnisse zeigt:

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -