Welcome to NetFxFactory Sign in | Join | Help

articles

WF dans Sharepoint 2007

SharePoint 2007 est le nouveau produit server phare de Microsoft. Quand on m'a parlé de SharePoint la première fois, c'était sous SharePoint 2003 et on ne peut pas dire que j'étais emballé. Mais pour des raisons business, et commerciales, je fus obligé de m'y intéresser. Petit à petit je me mis à découvrir le logiciel et je fus assez bluffé par l'ensemble des fonctionnalités du produit, mais certain manquement était pour moi inexcusable, manque d'une corbeille, de workflow digne de ce nom, impossibilité de personnaliser l'interface utilisateur. Bref le produit était bon pour moi mais pas mature. Avec SharePoint 2007 on en est loin, le produit est réellement mature et l'ensemble des fonctionnalités est énorme.
Le but de cet article est de vous montrer à travers un exemple simple, la validation d'une demande de congés, comment mettre en place un workflow de validation.

Le processus

Le processus de cet article sera une validation de note de frais toute simple. Quelqu'un entre une note de frais dans le système, une tache pour la comptabilité est créée, la personne va sur le site pour voire ses tâches, elle valide la note de frais.

Les formulaires :

Voici le formulaire de note de frais, Il est entièrement interactif avec le serveur sharepoint. Les ComboBox qui contiennent les informations du client et des projets sont dynamiques par rapport au contenu de listes qui se trouve dans sharepoint. Dans Sharepoint j'ai créé 3 listes :

La première est une liste de type contact qui contient les clients de ma société, son nom est « client ».
La deuxième est une custom liste « projet », qui à une colonne (look up) permettant de récupérer le nom complet du client. La dernière liste est une custom liste catégorie, qui contiendra les différentes catégories de frais possible.

Ensuite je lance mon application office préférée (mais non pas word) c'est infopath.

La je fait le design de mon formulaire

Puis j'ajoute des data connections pour récupérer les informations de sharepoint.
D'abord le client. La manipulation étant relativement simple (on va dans datasource sur la barre office puis manage data connection, on selectionne receive data, sharepoint list ou library, on met le nom du serveur et ensuite c'est assez explicite). Ensuite on selectionne la dropdown list client (clic avec le bouton droit et propriété) et dedans on clic sur « look up values from an external data source » on met le nom de sa source de données. Voila a quoi ca ressemble :

Pour les projet on fait pareil mais on ajoute en plus « Filter Data »

Cela permet de remplir la combobox au moment ou on selectionne le client. Avant qu'un client est selectionné on ajoute un conditionnal formating :

Pour que la combo soit desactivée.

Pour le total on ajoute la default value suivante :

Pour le bouton submit on choisit

Pour que le formulaire soit posté directement dans sharepoint enregistré puis fermé automatiquement.

Voila notre formulaire est prêt.

Recapitulons :

Ce formulaire contient le titre de la demande, la liste des clients de la société (qui sont enregistrer dans la libraire contact de SharePoint), lorsqu'on choisit un client dans la liste la liste des projets du client est mise à jours par rapport au client sélectionné. Ensuite on sélectionne la catégorie de la dépense (catégorie enregistrée dans une librairie sharepoint). On indique la somme de la catégorie, comme c'est une repeat section on peut en mettre autant qu'on souhaite. Le total est calculé automatiquement. Puis on valide. La validation entraine le lancement du workflow.

Voici le formulaire de démarrage du workflow.

Ce formulaire permet d'indiquer qui sera la personne responsable de la validation de la note de frais, ici a part le bouton il n'y a rien de spécial. Pour le bouton on mets ceci

La dataconnection pour le bouton est de ce style :

Et voici le formulaire de tache :

Ici on n'a pas grand-chose, juste une checkbox pour valider ou pas et un bouton qui posséde les même informations que le bouton du démarrage du workflow.

Mon Workflow :

Le processus c'est quoi ?

En fait le workflow est instancié, on met le nom du comptable qui gère les notes de frais du service. Quand quelqu'un ajoute une note de frais le workflow commence, a ce moment la une tache est créer dans la liste des taches du portail. Ensuite on vérifie que la check box de validation est cochée. Lorsqu'elle est cochée on finit la tache. Pour cela, j'ai mis les activités suivantes.

On developpe.

Ici je vais expliquer ce que j'ai dans Visual Studio, j'expliquerais aussi comment le déployer.
Je lance Visual Studio, et je créer un nouveau projet :

Je sélectionne Sharepoint Server Sequential Workflow, ce type de projet est un projet WF mais customisé pour Sharepoint, le workflow principal hérite de « SharePointSequentialWorkflowActivity », et des activités supplémentaires spécifiques à sharepoint sont ajoutées. Le workflow est créé. J'ajoute à mon workflow, qui posséde déjà OnWorkflowActivated1, l'activité "Create Task", c'est cette activité qui va créer la tache associée à mon workflow, celle qui permettra de valider la note de frais. Ensuite j'ajoute une boucle While qui me permettra de boucler sur le changement de la tache, afin de vérifier que la checkbox de validation n'est pas cochée. Dans la boucle While j'ajoute OnTaskChanged qui permet de récupérer les informations sur le changement de la tache. Puis en dehors de la boucle While je mets un CompleteTask qui finit le workflow. Voici à quoi mon processus ressemble :

Démarrage du workflow

L'activité OnTaskActivate est le démarrage du workflow. Ici le démarrage du workflow est orchestré par un formulaire infopath qui demande les informations du validateur de la note de frais. Pour lire les informations on enregistre le formulaire de démarrage du workflow en tant que source (file/Save as source file). Un fichier XSD est créé en plus d'autres, qui nous permettra de générer une classe C# qui sera ajoutée au projet. Pour générer cette classe on utilise la ligne de commande XSD nomfichier.xsd /c puis on ajoute ce fichier au projet.

On double clique sur OnWorkflowActivated et dans le gestionnaire d'événement ainsi créé on ajoute ce code :

XmlSerializer serializer = new XmlSerializer(typeof(myFields)); XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(this.workflowProperties.InitiationData)); myFields initwkfl = (myFields)serializer.Deserialize(reader); this.AssigneTo = initwkfl.txtComptable; 

Ici on désérialize le contenu du XML posté par le formulaire d'initialisation et on le passe a la classe autogénérer a partir du schema XSD. Ensuite on lit le contenu de la textbox txtComptable et on l'assigne a une variable de classe

La corrélation

Dans tous les systèmes de workflow, le plus important c'est la corrélation, c'est-à-dire pouvoir se faire suivre les étapes en réactivant le bon workflow et pouvoir différentier chaque instance.

Ici on va créer un token pour les taches. Dans les propriétés de createTask on va mettre un nom dans la propriété correlationToken en spécifiant que c'est le workflow1 qui contient ce token.

On met le MEME nom sur OnTaskChanged et CompleteTask.

Cette corrélation permettra au système de savoir de ou il vient et ou il doit aller quand la tâche est créé, changé ou finit.

Accéder aux informations des taches.

Pour créer une tache dans sharepoint il faut lui assigné un ID cela est fait avec la propriété TaskID de l'activité createtask, il faut aussi accéder aux propriétés de la tâche, comme le titre la personne qui doit executer la tâche, avec taskProperties. Voici la fenêtre des propriétés :

Pour cela on clique sur le bouton avec les trois petits points et on selection bind to a new member. Pour ces deux champs on choisira field et on mettra un nom.

Il nous faut aussi pouvoir lire les informations qui ont été modifiées quand on valide la tache. Pour cela on mets à jour la propriété AfterProperties :

On peut maintenant coder dans la création de la tache. On va donc dans les events de create task et dans le seul event de cette activity on ajoute le code suivant :

this.taskId=Guid.NewGuid();
this.taskProps.Title = "Validation de la note de frais de " + this.workflowProperties.Originator;
this.taskProps.Description = "Test";
this.taskProps.AssignedTo = this.AssigneTo;

Voila maintenant dans la clause while on spécifie qu'on utilise un codecondition comme condition, c'est-à-dire qu'on va codé le test.

Cela créer la méthode suivante :

private void OnValidation(object sender, ConditionalEventArgs e) {}

Dans cette méthode tant que la propriété Result, de l'objet e instance de ConditionalEventArgs, est vrai on boucle. On peut donc créer une variable initialisé a false qui s'appelle isValidated et mettre le code suivant dans la fonction :

e.Result = !isValidated;

Bien maintenant il faut changer cette valeur pour qu'à un moment elle passe à true.

Dans l'event OnTaskChanged on met le code suivant :

isValidated = bool.Parse(this.afterProperties.ExtendedProperties["chkFinished"].ToString());

Le deployment

Pour déployer notre workflow, nous créons un répertoire netfxfactory dans le répertoire des features de sharepoint (c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\). Dans ce répertoire nous mettons le repertoire forms avec les deux formulaires de taches et de démarrage de workflow, puis nous mettons les fichiers feature.xml et workflow.xml à la racine. C'est fichier les voici :

Feature

<?xml version="1.0" encoding="utf-8"?>
<!-- _lcid="1033" _version="12.0.3111" _dal="1" -->
<!-- _LocalBinding -->

<!-- Insert Feature.xml Code Snippet here.  To do this:
1) Right click on this page and select "Insert Snippet" (or press Ctrl+K, then X)
2) Select Snippets->SharePoint Workflow->Feature.xml Code -->
<Feature  Id="1FEBEEB6-86B9-44be-910E-862B9D4C567B"
          Title="NetfxFeature"
          Description="Fonctionnalité de validation de la note de frais"
          Version="12.0.0.0"
          Scope="Site"
          ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
          ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver"
          xmlns="http://schemas.microsoft.com/sharepoint/">
    <ElementManifests>
        <ElementManifest Location="workflow.xml" />
    </ElementManifests>
    <Properties>
        <Property Key="GloballyAvailable" Value="true" />

        <!-- Value for RegisterForms key indicates the path to the forms relative to feature file location -->
        <!-- if you don't have forms, use *.xsn -->
        <Property Key="RegisterForms" Value="forms\*.xsn" />
    </Properties>
</Feature>

Workflow :

<?xml version="1.0" encoding="utf-8" ?>
<!-- _lcid="1033" _version="12.0.3015" _dal="1"   -->
<!-- _LocalBinding   -->

<!-- Insert Workflow.xml Code Snippet here.  To do this:
1) Right click on this page and select "Insert Snippet" (or press Ctrl+K, then X)
2) Select Snippets->SharePoint Workflow->Workflow.xml Code -->

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <Workflow
         Name="NetfxWkfl"
         Description="Workflow de validation de la note de frais"
         Id="2F216DF4-7C01-4f84-9B93-48AB62FA1E06"
         CodeBesideClass="netfxWkfl.Workflow1"
         CodeBesideAssembly="netfxWkfl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2356c27bb4cae2f8"
         TaskListContentTypeId="0x01080100C9C9515DE4E24001905074F980F93160"
         AssociationUrl="_layouts/CstWrkflIP.aspx"
         InstantiationUrl="_layouts/IniWrkflIP.aspx"
         ModificationUrl="_layouts/ModWrkflIP.aspx"
         StatusUrl="_layouts/WrkStat.aspx">

        <Categories/>
        <!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->
        <MetaData>
            <Association_FormURN>urn:schemas-microsoft-com:office:infopath:startWkfl:-myXSD-2007-01-31T20-09-38</Association_FormURN>
            <Instantiation_FormURN>urn:schemas-microsoft-com:office:infopath:startWkfl:-myXSD-2007-01-31T20-09-38</Instantiation_FormURN>
            <Task0_FormURN>urn:schemas-microsoft-com:office:infopath:task:-myXSD-2007-02-01T15-19-59</Task0_FormURN>
        </MetaData>
    </Workflow>
</Elements>

Puis nous l'installons à l'aide de stsadm.

Conclusion

Cet article survol la mise en place d'un workflow dans sharepoint pour vous montrer dans un premier temps comment le mettre en place. Une version plus complète verra le jour prochainement. Ainsi que des articles sur WF

Published Wednesday, February 07, 2007 11:23 AM by admin
Filed under: ,

Comments

 

VANNESTE Xavier said:

Voici un petit article que j'ai écrit sur les workflow dans Sharepoint 2007. Les technologies employées

February 7, 2007 8:06 AM
Anonymous comments are disabled

This Blog

Syndication

Powered by Community Server (Personal Edition), by Telligent Systems