Service Pack 2 empêche un flux de travail sur modification de se lancer lui-même

Service Pack 2 empêche un flux de travail sur modification de se lancer lui-même

Bonjour à tous, c’est à nouveau Stephen. Je suis rédacteur sur SharePoint Designer. J’aimerais vous parler d’un correctif qui a été inclus dans le Service Pack 2 pour Office SharePoint Server 2007 et Windows SharePoint Services 3.0. Ce correctif concerne les flux de travail créés dans SharePoint Designer 2007. Je vous montrerai ensuite comment créer intentionnellement une boucle de flux de travail en utilisant deux flux au lieu d’un.

Avant le Service Pack 2, il était trop simple de concevoir par inadvertance un flux de travail qui se déclenchait lui-même et créait une boucle infinie. Par exemple, imaginez ce scénario :

1) Un flux de travail démarre lorsqu’un élément est modifié.

2) Le flux de travail met à jour (ou modifie) l’élément actuel (par ex. en utilisant l’action Définir le champ dans l’élément actif).

3) Comme le flux de travail modifie l’élément, il s’auto-déclenche.

Alors, si vous aviez un flux de travail sur modification qui vous envoie un message électronique, puis met à jour l’élément actif, vous pouviez rapidement recevoir plusieurs centaines de messages dans votre boîte de réception.

Après avoir installé le Service Pack 2 sur votre serveur, il est désormais impossible qu’un flux de travail qui démarre lorsqu’un élément est modifié se déclenche lui-même en modifiant/mettant à jour l’élément actif. Ce scénario de boucle infinie n’est plus possible :

clip_image002

Beaucoup d’utilisateurs, cependant, ont conçu des flux de travail qui en fait exploitent le bouclage infini. Par exemple, vous pouviez concevoir un flux de travail sur changement qui boucle sans fin sur un élément tâche et envoie un rappel quotidien jusqu’à ce que la tâche soit marquée comme terminée. Le flux de travail s’auto-déclenche en mettant à jour une colonne Compteur qui a été ajoutée à la liste à cet effet. Et le flux de travail a une règle qui arrête ou « court-circuite » le flux lorsqu’une certaine condition se réalise (dans ce cas, le flux de travail s’arrête sans modifier l’élément actif si l’état de la tâche est Achevée). Après SP2, ce flux de travail sera en fait cassé puisqu’il ne peut plus s’auto-déclencher.

SP2 ne bloque pas les boucles infinies, qui peuvent être utiles, mais pour recréer ce qui fonctionnait auparavant, vous devez concevoir deux (ou plus) flux de travail sur changement qui se déclenchent mutuellement. Deux flux de travail sur changement qui se déclenchent mutuellement en modifiant/mettant à jour l’élément actif constituent un scénario « corécursif » :

clip_image004

Par ailleurs, il est très courant d’implémenter un flux de travail basé sur états en utilisant plusieurs flux de travail plus courts qui se déclenchent mutuellement. Par exemple, supposons que vous ayez une liste avec un champ État et plusieurs flux de travail sur changement associés à cette liste. Tous ces flux incluent une étape finale qui met à jour le champ État. Lorsqu’un flux de travail met à jour le champ État, il déclenche plusieurs autres flux, qui examinent la valeur du champ État pour déterminer s’ils doivent continuer leur exécution ou s’arrêter. Ce flux de travail basé sur états est également un scénario « corécursif » car un flux déclenche une multitude de flux de travail sur changement en modifiant/mettant à jour l’élément actif. Le Service Pack 2 ne bloque pac ce type de flux de travail basé sur états qui s’appuie sur la corécursivité.

Récapitulation

· Avant SP2, un seul flux de travail sur changement pouvait entrer dans une boucle infinie en mettant à jour l’élément actif, s’auto-déclenchant ainsi.

· Après SP2, un flux de travail sur changement peut déclencher tout autre flux de travail sur changement en mettant à jour l’élément actif, mais un flux de travail sur changement ne peut pas s’auto-déclencher. Donc les scénarios corécursifs, y compris ceux qui implémentent un flux de travail basé sur états en utilisant plusieurs flux de travail sur changement plus courts, ne sont pas bloqués.

· En guise de rappel, il n’a jamais été possible de créer une boucle infinie avec un flux de travail sur création créant un élément dans la liste active. Chaque flux a une propriété qui contient les « flux de travail que je ne peux pas démarrer » ; cette propriété est utilisée pour empêcher le bouclage des flux qui démarrent à la création d’un élément.

· En guise de rappel supplémentaire, tous les scénarios précédents impliquent uniquement des flux de travail associés à une seule liste ou bibliothèque. Le bouclage infini dans les scénarios de listes croisées n’a jamais été bloqué ni dans les flux de travail sur changement ni dans ceux sur création.

Création de boucles avant Service Pack 2

Cette section présente un exemple de la façon dont un flux de travail sur changement unique pouvait exploiter le bouclage infini avant SP2. Après SP2, ce flux de travail ne s’auto-déclenchera plus, donc la section suivante présente un exemple de création d’une boucle en utilisant deux flux distincts.

Supposons que vous ayez une liste de tâches nommée Tâches de l’équipe et que vous vouliez concevoir un flux de travail qui envoie un rappel quotidien jusqu’à ce que la tâche soit marquée comme terminée.

Ajoutez d’abord une colonne nommée Compteur (Counter) à la liste ayant une valeur par défaut 0.

clip_image006

Vous devez masquer les colonnes Compteur des formulaires de liste (Nouvel élément, Modifier l’élément) afin que seul le flux de travail puisse accéder à cette colonne et la modifier. Tout d’abord, sur la page des paramètres de la liste, cliquez sur Paramètres avancés, puis autorisez la gestion des types de contenu.

clip_image008

Sur la page des paramètres de la liste, cliquez sur chaque type de contenu et, sur la page quivante, cliquez sur la colonne Compteur. Masquez la colonne Compteur. Effectuez ces opérations pour chaque type de contenu dans la liste.

clip_image010

Après avoir créé et masqué la colonne Compteur afin qu’elle n’apparaisse pas dans les formulaires, vous pouvez concevoir le flux de travail.

Le flux de travail avec rappel quotidien doit démarrer chaque fois qu’un élément est créé ou modifié.

clip_image012

La première étape vérifie deux choses : (1) Si la tâche est déjà marquée comme terminée, le flux de travail s’arrête. Cette règle « court-circuite » la boucle chaque fois que la tâche est finalement marquée comme terminée. (2) Si la tâche n’est pas terminée, le flux de travail vérifie si la date d’échéance est future (supérieure à aujourd’hui). Si cela est vrai, le flux de travail se met en pause jusqu’à la date d’échéance, pour éviter l’envoi de rappels jusqu’à ce que la date d’échéance soit atteinte.

clip_image014

La seconde étape vérifie à nouveau si la tâche est terminée (au cas où le flux de travail soit en pause en attendant la date d’échéance de l’étape précédente, et où la tâche ait été achevée entretemps). Si la tâche n’est toujours pas terminée, le flux de travail marque une pause d’une journée.

clip_image016

La troisième étape vérifie à nouveau si tâche a été achevée pendant la pause du flux de travail ; si cela est vrai, le flux de travail s’arrête.

Si la tâche n’a pas été achevée, le flux de travail (1) envoie le rappel par message électronique ; (2) définit la variable Décompte_actuel (CurrentCount) en effectuant une boucle sur le champ Élément en cours/Compteur ; (3) ajoute 1 au Décompte_actuel et stocke cette valeur dans une variable Nouveau_décompte (NewCount) ; (4) affecte à la colonne Compteur la valeur stockée dans la variable Nouveau_décompte.

Au fond, cette étape incrémente la colonne Compteur de 1 chaque fois que le flux de travail s’exécute, vous pouvez donc consulter cette colonne pour voir combien de rappels ont été envoyés. Et surtout, l’action « Définir le champ dans l’élément actif » à la fin de cette étape est ce qui modifie l’élément actif, provoquant ainsi l’auto-déclenchement du flux de travail et la création de la boucle.

clip_image018

Création de boucles après Service Pack 2

Après SP2, vous pouvez toujours obtenir cet effet de boucle, mais cela nécessite la création de deux flux de travail qui se déclenchent mutuellement (corécursivité) au lieu d’un flux de travail unique qui s’auto-déclenche.

Ici, vous allez utiliser (1) un flux de travail Compteur (Counter) qui incrémente le décompte et (2) un flux de travail Ouvrier (Worker) qui envoie effectivement le message électronique de rappel.

Premier flux de travail : le flux Compteur

Comme ci-dessus, vous devez créer une colonne Compteur dans la liste ayant une valeur par défaut 0, autoriser la gestion des types de contenu et masquer ce champ pour chaque type de contenu dans la liste.

clip_image006[1]

Cette conception avec deux flux de travail requiert une seconde colonne, SendMail (Envoi_message), qui servira de repère pour le flux de travail Ouvrier. La valeur par défaut doit être Non, sinon toute modification d’un élément tâche provoquerait l’envoi du message de rappel.

clip_image020

Le flux de travail Compteur démarre lorsqu’un élément est créé ou modifié.

clip_image022

La première étape vérifie l’état de la tâche : si la tâche est terminée, le flux de travail Compteur s’arrête.

clip_image024

Si la date d’échéance de la tâche est future (supérieure à aujourd’hui), la seconde étape marque une pause jusqu’à la date d’échéance, pour éviter l’envoi de rappels jusqu’à ce que la date d’échéance soit atteinte.

clip_image026

La troisième étape vérifie à nouveau si la tâche est terminée, au cas où la tâche ait été achevée pendant la pause du flux de travail de l’étape précédente. Si la tâche n’est toujours pas terminée, le flux de travail marque une pause d’une journée.

clip_image028

L’étape finale vérifie à nouveau l’état pour voir si la tâche a été achevée pendant la pause d’une journée précédente. Si ce n’est pas le cas, le flux de travail met à jour l’élément actif en (1) incrémentant la valeur de la colonne Compteur de 1 et en (2) définissant le repère Envoi_message à Oui (sa valeur par défaut est Non).

clip_image030

Second flux de travail : le flux Ouvrier

Le flux de travail Compteur ci-dessus termine en mettant à jour (modifiant) l’élément actif. Cette mise à jour déclenche le flux Ouvrier, qui est défini pour démarrer lorsqu’un élément est modifié.

clip_image032

Le flux de travail Ouvrier vérifie simplement si le repère Envoi_message est défini à Oui ; si c’est le cas, le flux de travail envoie le message de rappel et redéfinit le repère à Non.

La définition du repère Envoi_message à Non est la modification qui déclenche la flux de travail Compteur ci-dessus. Les flux de travail Compteur et Ouvrier se déclencheront mutuellement, en envoyant des rappels quotidiens jusqu’à ce que la tâche soit marquée comme terminée.

clip_image034

Vous pouvez aussi, au lieu d’une boucle infinie, faire grimper la notification de tâche par le flux de travail Ouvrier lorsque la colonne Compteur atteint une certaine valeur, disons 5 rappels. L’étape suivante exécute des branches différentes selon le décompte de rappels. Lorsque le décompte atteint 5, le flux de travail envoie un message à un responsable, dont l’adresse de messagerie peut être soit « codée en dur » dans l’action Envoyer un courrier électronique, soit récupérée dans une liste en utilisant une recherche en table.

clip_image036

Le flux de travail Ouvrier peut aussi réassigner la tâche à un autre groupe ou à une autre personne après l’envoi d’un certain nombre de rappels. Pour cela, le flux de travail réassigne la tâche à un groupe SharePoint constitué des membres de l’équipe qui sont responsables du suivi des tâches ainsi remontées.

clip_image038

Pour arrêter la boucle lorsque le décompte atteint un certain nombre, veillez également à ajouter une branche à la première étape du flux de travail Compteur (pas au flux de travail Ouvrier). Cette branche arrête la boucle lorsque la colonne Compteur atteint la valeur 6.

clip_image040

J’espère que ces exemples vous seront utiles.

—Stephen

Ce billet de blog a été traduit de l’anglais. L’article d’origine est disponible ici : Service Pack 2 prevents an on-change workflow from starting itself