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

30. März 2011

Dies ist der zweite Teil einer kleinen Reihe zu dem Thema SharePoint 2010 Workflows mit Visual Studio 2010 und InfoPath 2010.

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 von Association Form an Initiation Form

Im ersten Teil der Reihe habe ich aufgezeigt wie Datenfelder in einer Association Form über die Metadaten des Workflows vorbelegt werden können. Nun möchte ich im zweiten Schritt zeigen, wie diese Daten an die Initiation Form übergeben werden können. In der MSDN unter How to: Design a Workflow Form to Use Association and Initiation Data heißt es:

“When SharePoint Server 2010 displays a custom InfoPath form for workflow initiation on the server, it calls the Forms Server control to convert the form into an ASP.NET 2.0 page and host it. As part of the form load, the Forms Server control retrieves the initiation data from the AssociationData property of the appropriate SPWorkflowAssociation object, and passes it to the initiation form as XML. The Forms Server control automatically data-binds any elements to the form control of the same name.”

Die AssociationData wird als XML an die Initiation Form übergeben und man muss die Controls gleich benennen. Ist dies so einfach? Nein, denn auch hier müssen die XML Namespaces beachtet werden. In Teil 1 habe ich aufgezeigt, dass die Association Form eine XML Repräsention aufweist, die von XML Namespaces abhängig ist. Es ist sogar so, dass der XML Namespace der einfachen Felder unter Umständen abhängig vom Erstelldatum der Form ist und generiert wird. Lege ich nun eine neue Form als Initiation Form über das Template “Blank Form” an, so erhalten die Felder einen neuen Namespace auch bei Beibehaltung des gleichen lokalen Namens. Damit die automatische Datenbindung zum Erfolg führt, müssen die Felder der Association Form und der Initiation Form dem selben XML Namespace angehören. Daher muss die Initiation Form auf Basis der Association Form erstellt werden. Dies kann zum Beispiel erreicht werden, in dem man die Association Form unter neuem Namen abspeichert. Nach Anpassung des Aussehens ist die Form allerdings neu unter neuen Namen zu publizieren, denn mit einem Quick Publish würde die publizierte Association Form überschrieben werden. Alternativ könnte die Initiation Form auf Basis des “XML or Schema” Templates erstellt werden und dabei die Schema Datei der Association Form verwendet werden (Export Source Files).

Ist das Formular neu publiziert (Network Location), ist 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:      InstantiationUrl="_layouts/IniWrkflIP.aspx"

   8:      CodeBesideClass="HowToWorkflow.ReviewWorkflow.ReviewWorkflow"

   9:      CodeBesideAssembly="$assemblyname$">

  10:     <AssociationData>

  11:       <my:myFields ...>...</my:myFields>

  12:     </AssociationData>

  13:     <MetaData>

  14:       <AssociationCategories>List</AssociationCategories>

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

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

  17:       <Instantiation_FormURN>urn:schemas-microsoft-com:office:infopath:InitForm:-myXSD-2011-02-22T14-04-28</Instantiation_FormURN>

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

  19:     </MetaData>

  20:   </Workflow>

  21: </Elements>

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

Ist dies erfolgt, so präsentiert sich das Formular beim Start des Workflows an einem Listeneintrag wie folgt:

image

Fazit

Um eine Übergabe von Association Daten an die Initiation Form zu erreichen, müssen die Felder in beiden Formularen dem selben Namespace angehören. Damit muss die Initiation Form auf Basis der Association Form erstellt werden. Dies kann entweder durch ein “Save As” der Association Form oder über das XML or Schema Template mit der XSD der Association Form erreicht werden.

Im nächsten Beitrag widme ich mich der Aufgabe die Daten der Association Form und/oder der Initiation Form im Workflow zu verwenden und Daten mit einer Task InfoPath Form auszutauschen.