Passer au contenu principal
Logo du centre de compétences SharePoint de la HEIG-VD

CCSP Blog

Lancer la recherche
Centre de Compétences SharePoint
CCSP Blog
  

Autres blogs
Il n'y a aucun élément dans la liste.
Centre de Compétences SharePoint > CCSP Blog > Catégories
Conception d'un workflow pour la création automatique d'une tâche avec Visual Studio 2008
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
  • Créer un nouveau projet de type Sharepoint Sequential Workflow.

Création nouveau projetj sequential workflow

  • 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.

Schéma workflow

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.

Task token

  • 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:
    • public Guid taskid = default(System.Guid);
  • 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:
    • this.taskid = Guid.NewGuid();
  • 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.

Task Guid

  • Répéter l'étape précédente pour l'événement onTaskChanged et completeTask.

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.

Task Properties

  • 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:
    •             this.taskProperties = new SPWorkflowTaskProperties();
                  this.taskProperties.Title = "Un titre de tâche";
                  this.taskProperties.Description = "La nouvelle tâche que j'ai créée";
                  this.taskProperties.AssignedTo = "SERVEUR-CLG\\cleglaun";

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.
    • public float percentComplete = 0.0F;
  • 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.

Task After Properties

  • 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.
    • this.percentComplete = this.taskAfterModifProperties.PercentComplete;

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:
    •         private void whileActivity_Condition(object sender, ConditionalEventArgs e)
              {
              }
  • 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%.
    • e.Result = (this.percentComplete < 1.0F);

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
 
L'extranet du RCSO-TIC

Voici, en quelques mots, la description de ce site, dédié aux échanges et à la collaboration du RCSO-TIC (Réseau de Compétences de Suisse Occidentale pour les Technologies de l'Information et de la Communication).

Formé d'un comité scientifique de 12 membres, cet organisme encourage la collaboration entre les différentes établissements et instituts des HES concernées et dirige les travaux de Recherches appliquée et Développement (Ra&D) en sélectionnant et assurant le suivi des projets de recherche financés par les fonds de la réserve stratégique de la HES-SO.

 Cliquez sur l'image pour agrandir.

Ce site est basé sur MOSS2007. Les principales fonctionnalités sont les suivantes:

  • Utilisation des type de contenu.
  • Utilisation des enquêtes.
  • Utilisation de webparts maisons
    • Un "compositeur": il permet l'affichage et les liens vers a) un document PDF à évaluer, b) une enquête permettant l'évaluation et c) les résultats de l'enquête.
    • Un Webpart SOAP: il permet d'utiliser les webservices SharePoint et passe le XML-Soap résultant à la moulinette XSL pour afficher les résultats des enquêtes. En effet, pour certains types de questions, l'affichage standard des résultats n'est pas satisfaisant.
  • Création de workflows. Par exemple, lors du chargement d'un fichier PDF à évaluer, le workflow va:
    • Créer une enquête associée à ce document sur la base d'un modèle d'enquête.
    • Ajouter une méta donnée au type de contenu du document pour le lier à l'enquête.
    • Créer des tâches (une par "évaluateur" potentiel) lui indiquant la nouvelle évaluation à faire.

Ce site est toujours en cours d'amélioration :)