SharePoint 2010 Workflow mit Visual Studio 2010 und InfoPath 2010 (Part 1)

18. März 2011

Einiges an Internetrecherche hat zu diesem Beitrag geführt, denn die notwendigen Informationen sind nicht unbedingt zu finden bzw. müssen aus verschiedenen Bruchstücken zusammengesucht werden. Die verfügbaren Informationen in der MSDN oder in Blogbeiträgen lassen teilweise Aspekte unberücksichtigt, die jedoch im Projektalltag allzu oft angefordert werden.

Es soll ein Workflow für eine Dokumentenliste einer SharePoint 2010 Site erstellt werden, welcher eine Association Form, eine Initiation Form sowie eine Task Form verwendet. Alle Formulare sollen mit Hilfe des InfoPath Designers 2010 erzeugt werden und in einem Visual Studio 2010 Workflow Projekt verwendet werden. Fachlich handelt es sich auch um einen Freigabeprozess für Dokumente. Dabei soll der Workflow bei der Zuordnung zu einer Liste eine Association Form anzeigen, in der bereits Felder vorbelegt sind. Des Weiteren sollen dann die Daten aus der Association Form an die Initiation Form übergeben werden und ggfs. vom Anwender verändert werden können. Abschließend werden dann die Daten in der Task Form dem Bearbeiter angezeigt.

Ein sehr guter Beitrag zu diesem Thema ist in einer Blogreihe von Reiner Ganser (1st Quad Blog) zu finden. Diese Blogreihe ist eine Schritt für Schritt Anleitung für die Erstellung eines Workflows, allerdings werden in diesem Beispiel für Association und Initiation Form ASPX Seiten verwendet. Das Hauptaugenmerk in meiner dreiteiligen Blogreihe liegt auf dem Datenaustausch zwischen den Formularen und dem Workflow. Ansonsten  sind nur die wesentlichen Schritte beschrieben. Dabei behandeln die Blogbeiträge folgende Themen

  1. Datenübergabe an Association Form
  2. Datenübergabe von Association Form an Initiation Form
  3. Datenaustausch mit dem Workflow und Task Form

Datenübergabe an Association Form

Nach der Anlage eines Sharepoint 2010 Workflow Projektes mit Visual Studio 2010 ist das Projekt für die Verwendung von InfoPath Forms vorzubereiten. Dazu ist im Feature Set des Projektes eine Anpassung notwendig. Über den Designer wird zu den Features die Datei “Feature1.template.xml” geöffnet und mit folgendem Inhalt versehen:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <Feature

   3:   ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"

   4:   ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver"

   5:   xmlns="http://schemas.microsoft.com/sharepoint/">

   6:   <Properties>

   7:     <Property Key="GloballyAvailable" Value="true" />

   8:     <Property Key="RegisterForms" Value="ReviewWorkflow*.xsn" />

   9:   </Properties>

  10: </Feature>

Mit den Attributen ReceiverAssembly und ReceiverClass des Features wird eine Komponente hinterlegt, die bei Aktivierung des Features zur Registrierung der InfoPath Forms notwendig ist. Des Weiteren ist ein <Property> Eintrag mit dem Key "RegisterForms" zu hinterlegen, wobei der Value auf den Ablageort der InfoPath Formulare zeigt. Dieser Ablageort ist in der Regel gleich dem Namen des Workflows und *.xsn schließt alle InfoPath Formulare ein.

Anschließend kann ein InfoPath Formular angelegt werden, welches als Association Form dient. Diese Form braucht neben den gewünschten Eingabefeldern noch eine Submit Data Connection an den umgebenden Host oder die ASPX Seite.

image

Nach der Fertigstellung ist das Formular selbst zu publizieren (Network Location), die publizierte XSN-Datei unterhalb des Workflows in das Projekt aufzunehmen und der Deployment Type auf “ElementFile” zu setzen. Zur Verwendung des Formulars ist dann noch die Metadatendatei “Elements.xml” des Workflows an zwei Stellen anzupassen.

   1: <Elements xmlns="http://schemas.microsoft.com/sharepoint/">

   2: <Workflow

   3:    Name="HowToWorkflow - ReviewWorkflow"

   4:    Description="My SharePoint Workflow"

   5:    Id="64261495-cba6-417c-bc7d-83ec41fd0cec"

   6:    AssociationUrl="_layouts/CstWrkflIP.aspx"

   7:    CodeBesideClass="HowToWorkflow.ReviewWorkflow.ReviewWorkflow"

   8:    CodeBesideAssembly="$assemblyname$">

   9:   <MetaData>

  10:     <AssociationCategories>List</AssociationCategories>

  11:     <!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->

  12:     <Association_FormURN>urn:schemas-microsoft-com:office:infopath:AssocForm:-myXSD-2011-02-22T14-04-28</Association_FormURN>

  13:     <StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl>

  14:   </MetaData>

  15: </Workflow>

  16: </Elements>

In Zeile 6 wird ein AssociationUrl Attribut auf den Wert “_layouts/CstWrkflIP.aspx” gesetzt und in Zeile 12 wird die URN gesetzt, die im InfoPath Designer über File –> Form Template Properties –> ID ermittelt wird.

Wie können nun Daten an die Association Form übergeben werden? Über den Workflow-Code ist es nicht möglich, da zum Zeitpunkt der Anzeige des Formulars der Workflow noch nicht instanziiert wird. In der MSDN (siehe How to: Design a Workflow Form to Use Association and Initiation Data) wird die Datenbindung beschrieben, wenn auch nicht ausführlich. Dort heißt es “You can specify default association data in the AssociationData element of the workflow definition file for your workflow solution” und “Name your InfoPath form control the same as the element in the association data XML”. Der Punkt hierbei ist allerdings die Beachtung von XML Namespaces, denn die Formularfelder liegen in einem XML Namespace und bei Verwendung von Person/Group Picker kommen vordefinierte Namespaces zum Einsatz. Den Namespace eines einzelnen Formularfeldes kann über dessen Properties und den Tabreiter “Details” ermittelt werden. Einfacher ist es jedoch sich von dem gesamten Formular die XML Repräsentation zu beschaffen. Dies ist über das Menü File –> Publish –> Export Source Files möglich, denn hier werden unter anderem Schema-Dateien und auch eine Datei namens “Sampledata.xml” erstellt. Letztere ist ein XML Instanz des Formulars. Der Inhalt kann dann in das XML Tag <AssociationData> der Datei Elements.xml des Workflows eingefügt werden und mit den gewünschten Daten vorbelegt werden.

   1: <Elements xmlns="http://schemas.microsoft.com/sharepoint/">

   2:   <Workflow

   3: ...

   4:      CodeBesideAssembly="$assemblyname$">

   5:     <AssociationData>

   6:       <my:myFields

   7:         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   8:         xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-02-22T14:04:28"

   9:         xmlns:xd="http://schemas.microsoft.com/office/infopath/2007"

  10:         xml:lang="en-us"

  11:         xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">

  12:         <my:Reviewer>

  13:           <pc:Person>

  14:             <pc:DisplayName>Matthias Straßer</pc:DisplayName>

  15:             <pc:AccountId>domainusername</pc:AccountId>

  16:             <pc:AccountType>User</pc:AccountType>

  17:           </pc:Person>

  18:         </my:Reviewer>

  19:         <my:Instructions>Bitte Dokument prüfen und freigeben</my:Instructions>

  20:       </my:myFields>

  21:     </AssociationData>

  22:     <MetaData>

  23: ...

  24:     </MetaData>

  25:   </Workflow>

  26: </Elements>

In dem Beispiel habe ich auf der Association Form zwei Felder, ein Person/Group Picker namens “Reviewer” und eine Textbox namens “Instructions”. Zu beachten ist der “my” und der “pc” Namespace. Der my-Namespace ist ein generierter Namespace und beinhaltet ein Datum und eine Uhrzeit. Dies ist der Zeitpunkt der Anlage des Formulars. Der pc-Namespace ist ein vordefinierter Namespace, der durch die Verwendung des Person/Group Pickers im Formular benötigt wird.

Hinweis: Der generierte my-Namespace kann umgangen werden, wenn ein Formular auf Basis eines zuvor angelegten Schemas erstellt wird. Dann kann man selbst den Namen des Namespaces beeinflussen.

Mit der Einbindung des <AsscociationData> Tags präsentiert sich das Formular bei der Zuordnung wie folgt:

image

Fazit

Felder in Association Formularen, die mit InfoPath Designer 2010 erstellt worden sind, können über das XML Tag <AssociationData> der Metadaten zu einem Workflow (Elements.xml) vorbelegt werden. Hierbei sind die XML Namespaces des Formulares und der verwendeten Controls zu beachten. Ist ein Workflow in Produktion deployed, so können die Werte bei Bedarf geändert werden. Allerdings muss hierfür die “Elements.xml” Datei im SharePoint 2010 Hive (C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions14TEMPLATEFEATURES<YourWorkflowFeature><YourWorkflow>) angepasst werden und der Application Pool der SharePoint Web Site neu gestartet werden.

Im nächsten Beitrag widme ich mich der Aufgabe die Daten der Association Form an eine Initiation Form zu übergeben.