Le but de ce tutorial est de créer un template de workflow qui effectue les actions suivantes:
- Une instance de workflow démarre selon les paramètres définis lors du déploiement (manuellement, lorsqu'un nouvel élément arrive dans la liste, etc.).
- L'instance crée et affecte une tâche à un utilisateur.
- L'instance de workflow se termine lorsqu'un utilisateur a réalisé la tâche à 100%.
Configuration requise
- Microsoft Visual Studio 2008 (sur la même machine que MOSS 2007)
- MOSS 2007
- Windows 2003 Server (pour exécuter MOSS 2007)
Dans notre cas, une machine virtuelle contenant ces trois logiciels est utilisée pour travailler depuis une machine Desktop Windows XP.
Début

-
Ouvrir Workflow1.cs en mode design. Un événement nommé onWorkflowActivated est créé par défaut.
-
Ajouter une activité createTask, suivie d'une boucle whileActivity, puis d'une activité completeTask. Dans la whileActivity, ajouter un événement onTaskChanged. Le résultat devrait ressembler à la copie d'écran ci-dessous.

Le premier élément onWorkflowActivated est indispensable. Il est appelé lorsqu'une nouvelle instance de workflow est créée et permet par exemple de récupérer des paramètres d'initiation. L'activité createTask permet, comme son nom l'indique, de créer une nouvelle tâche associée au workflow. Ensuite, une boucle whileActivity est exécutée tant que la tâche précédemment créée n'a pas été accomplie par l'utilisateur auquel elle a été affectée. Finalement, l'activité completeTask permet de modifier le statut de la tâche à "completed".
On constate qu'il y a un avertissement sur chaque activité du schéma. Il va donc falloir paramétrer certaines parties afin que ce template de workflow soit exploitable.
Définir la propriété "CorrelationToken"
Tout d'abord, il faut définir le paramètre CorrelationToken pour les activités createTask, onTaskChanged et completeTask. Ce paramètres est important car il permet de définir à quelle instance de workflow est attachée une tâche. Dans notre exemple, il permet de lancer l'événement onTaskChanged lorsque la tâche définie par l'activité createTask a été modifiée.

-
Cliquer sur l'activité createTask. Dans la fenêtre des propriétés, saisir le nom "taskToken" pour la propriété CorrelationToken.
-
Définir la sous-propriété OwnerActivityName à "Workflow1", représentant le nom du template de workflow qui a créé cette tâche.
-
Effectuer les tâches 1 et 2 pour les activités onTaskChanged et completeTask.
Définir l'identifiant (Guid) de la tâche
Un autre élément important concerne la génération d'une identifiant unique (Guid) pour la tâche qui va être créée. Cet identifiant doit être généré automatiquement par le système.
-
Afficher le code source de Workflow1.cs.
-
Ajouter un attribut à la classe Workflow1 en tapant la ligne ci-dessous:
-
En mode design, faire un double clique sur l'activité createTask. Le handler MethodInvoking pointe automatiquement sur la méthode nommée createTask_methodInvoking.
-
Dans la méthode createTask_methodInvoking, il faut ajouter une ligne pour générer automatiquement un Guid inexistant dans le système:
-
Basculer en mode design et afficher les propriétés de l'activité createTask. Cliquer dans la case à droit du libellé de la propriété TaskId. Dans la boîte de dialogue qui s'ouvre, sélectionner l'attribut taskId créé à l'étape no. 2.

Définir la propriété TaskProperties
TaskProperties sert à définir les propriétés (titre, description, utilisateur, etc.) de la tâche créée avec l'activité createTask. Il faut créer un objet dans la classe Workflow1 de type Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties. Les propriétés de cet objet seront initialisées lors de l'activité createTask, juste avant que la tâche soit réellement créée.
-
En mode design, sélectionner l'activité createTask, puis ouvrir l'assistant proposé pour la propriété TaskProperties.
-
Dans l'onglet "Bind to a new member", sélectionner le bouton radio Create Property et nommer la nouvelle propriété taskProperties.

-
Basculer en mode d'affichage du code source. Visual Studio a automatiquement déclaré un nouvel attribut:
-
public static DependencyProperty taskPropertiesProperty = DependencyProperty.Register("taskProperties", typeof(Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties), typeof(TestWorkflow3.Workflow1));
-
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[BrowsableAttribute(true)]
[CategoryAttribute("Misc")]
public SPWorkflowTaskProperties taskProperties
{
get
{
return ((Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties)(base.GetValue(TestWorkflow3.Workflow1.taskPropertiesProperty)));
}
set
{
base.SetValue(TestWorkflow3.Workflow1.taskPropertiesProperty, value);
}
}
-
L'attribut taskProperties a été défini mais pas initialisé. On peut effectuer cette opération dans le handler MethodInvoking de l'activité createTask, au même endroit que la génération du Guid de la tâche. Cette méthode s'exécute juste avant que la tâche soit réellement créée. Elle constitue donc l'endroit idéal pour initialiser des données. Ajouter les lignes suivantes:
Définir le suivi de la tâche
Notre tâche est maintenant créée et assignée à un utilisateur. Le but est de détecter le moment où un utilisateur accomplit la tâche, puis de récupérer les données associées. Dans cet exemple, on ne vérifie pas que la tâche soit accomplie par l'utilisateur auquel elle a été assignée.
Il est important de noter que le workflow se met en attente lorsqu'il atteint l'événement onTaskChanged. Dans notre exemple, on aimerait que le workflow reste à l'état "In Progress" tant que le pourcentage complété de la tâche n'est pas égal à 100%.
L'événement onTaskChanged a l'avantage de posséder une propriété fournissant les informations de la tâche saisies par l'utilisateur. On va donc utiliser cette propriété, nommée AfterProperties, pour enregistrer la valeur du champs qui nous intéresse, nommé PercentComplete. Elle est également de type Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties.
-
Créer un attribut de classe Workflow1 pour enregistrer l'état d'avancement de la tâche. Cette variable sera utilisée dans la condition de la boucle while (WhileActivity) englobant l'événement onTaskChanged. Ajouter la ligne suivante dans la classe Workflow1.
-
En mode design, cliquer sur l'événement onTaskChanged, puis ouvrir l'assistant pour la propriété AfterProperties. Dans l'onglet "Bind to a new member", créer un nouvel attribut nommé taskAfterModifProperties.

-
Toujours en mode design, double-cliquer sur l'événement onTaskChanged. Une méthode pour le handler Invoked est créée. Cette méthode se nomme onTaskChanged_Invoked.
-
On veut stocker l'état de la tâche (renseigné par l'utilisateur) dans l'attribut percentComplete. Ajouter la ligne suivante dans la méthode onTaskChanged_Invoked créée à l'étape précédente.
Il ne reste plus qu'à configurer la boucle while afin qu'elle s'exécute uniquement lorsque le pourcentage complété de la tâche est inférieur à 100%. Il est possible de définir une condition d'exécution pour une whileActivity.
-
En mode design, cliquer sur whileActivity afin d'afficher les propriétés.
-
Pour la propriété "Condition", sélectionner "Code Condition" dans la liste. Il faut ensuite saisir un nom de méthode pour le handler Condition.
-
Appuyer sur "enter" dans la zone de texte Condition afin d'afficher la méthode permettant de gérer la condition. Elle doit ressembler au code ci-dessous:
-
On doit retourner true ou false par la propriété Result de l'objet ConditionalEventArgs fournie en paramètre. Ajouter le code suivant pour retourner true (la boucle s'exécute) si la valeur de l'attribut percentComplete n'est pas égal à 100%.
Tester le workflow
Si Visual Studio est exécuté sur une machine possédant MOSS 2007, on peut utiliser les fonctionnalités de débuggage. Il suffit de cliquer sur "Start debugging" (la flèche verte). Une fenêtre Internet Explorer affiche automatiquement une vue contenant la liste pour tester le workflow. Il faut avoir préalablement défini les paramètres de débuggage. Pour y parvenir, faire un click droite sur la racine du projet et cliquer sur le menu "Sharepoint Debug Settings..."
Après avoir testé le workflow, il est possible d'appuyer sur le bouton Stop dans VS. A ce moment, le workflow est automatiquement désinstallé et la fenêtre Internet Explorer fermée.
Déployer le workflow
Un autre article de ce blog traitera plus en détail les aspects liés au déploiement d'une feature.
Références
CorrelationToken - "Notice that the CorrelationToken and TaskId properties are set to the variables used in the createTask1 activity. This binds this activity to the same task created by the createTask1 activity, and ensures that the workflow is receiving the change event for the correct task." -
http://msdn.microsoft.com/en-us/library/ms580283.aspx