Il Service Pack 2 impedisce l'avvio autonomo di un flusso di lavoro che viene avviato da un'operazione di modifica

Salve a tutti. Sono di nuovo Stephen e vi scrivo a proposito di SharePoint Designer. Voglio infatti illustrarvi una correzione inclusa nel Service Pack 2 per Office SharePoint Server 2007 e Windows SharePoint Services 3.0. Tale correzione interessa i flussi di lavoro progettati in SharePoint Designer 2007. Vi mostrerò quindi come creare intenzionalmente un ciclo di flusso di lavoro utilizzando due flussi di lavoro anziché uno.

Prima del Service Pack 2, era molto facile progettare inavvertitamente un flusso di lavoro che attivava se stesso creando un ciclo infinito. Si consideri ad esempio lo scenario seguente:

1) Un flusso di lavoro si avvia quando viene modificato un elemento.

2) Il flusso di lavoro aggiorna o modifica l'elemento corrente, ad esempio utilizzando l'azione Imposta campo in elemento corrente.

3) Poiché il flusso di lavoro modifica l'elemento, attiva se stesso.

Se pertanto si dispone di un flusso di lavoro che viene avviato da un'operazione di modifica e che invia un messaggio di posta elettronica e quindi aggiorna l'elemento corrente, si corre il rischio di ricevere in breve tempo centinaia di messaggi nella propria cartella Posta in arrivo.

Installando il Service Pack 2 nel server, un flusso di lavoro che si avvia quando un elemento viene modificato non potrà più attivare se stesso modificando o aggiornando l'elemento corrente. Questo scenario con un ciclo infinito non sarà possibile:

clip_image002

Molti hanno tuttavia progettato flussi di lavoro effettivamente basati su un ciclo infinito. È ad esempio possibile progettare un flusso di lavoro che viene avviato da un'operazione di modifica che esegua all'infinito un ciclo per un'attività e che invii giornalmente un promemoria finché tale attività non viene contrassegnata come completata. Il flusso di lavoro attiva se stesso aggiornando una colonna Contatore (Counter) aggiunta all'elenco esclusivamente a tale scopo. È inoltre prevista una regola che interrompe o "manda in corto circuito" il flusso di lavoro se viene soddisfatta una particolare condizione. In questo caso il flusso di lavoro si arresterà senza modificare l'elemento corrente se Stato attività = Completata. Dopo il Service Pack 2, questo flusso di lavoro verrebbe effettivamente interrotto perché non può attivare se stesso.

Il Service Pack 2 non blocca i cicli infiniti perché possono essere utili ma, per riprodurre i comportamenti che in passato funzionavano, ora è necessario progettare due o più flussi di lavoro che vengono avviati da un'operazione di modifica che si attivano reciprocamente. Due flussi di lavoro di questo tipo che si attivano l'un l'altro aggiornando o modificando l'elemento corrente danno luogo a uno scenario di "coricorsione":

clip_image004

È inoltre pratica comune implementare un flusso di lavoro basato sullo stato utilizzando diversi flussi di lavoro più brevi che si attivano reciprocamente. È ad esempio possibile disporre di un elenco con un campo Stato a cui sono associati numerosi flussi di lavoro che vengono avviati da un'operazione di modifica. In tutti questi flussi di lavoro alla fine è incluso un passaggio che aggiorna il campo Stato. Un flusso di lavoro pertanto ne attiva diversi altri aggiornando lo stato e quindi tali flussi di lavoro esaminano il valore del campo Stato per stabilire se devono proseguire l'esecuzione o se devono interrompersi. Anche questo flusso di lavoro basato sullo stato rappresenta uno scenario di "coricorsione" perché un solo flusso di lavoro avvia molti altri flussi di lavoro che vengono avviati da un'operazione di modifica modificando o aggiornando l'elemento corrente. Il Service Pack 2 non blocca questo tipo di flusso di lavoro basato sullo stato che si avvale della coricorsione.

Riepilogo

· Prima del Service Pack 2, un flusso di lavoro che viene avviato da un'operazione di modifica può diventare un ciclo infinito aggiornando l'elemento corrente e quindi attivando se stesso.

· Dopo il Service Pack 2, un flusso di lavoro che viene avviato da un'operazione di modifica può attivare qualsiasi altro flusso di lavoro dello stesso tipo aggiornando l'elemento corrente, ma un tale flusso di lavoro non può attivare se stesso. Gli scenari di coricorsione, inclusi quelli in cui viene implementato un flusso di lavoro basato sullo stato mediante l'utilizzo di molti flussi di lavoro più piccoli che vengono avviati da un'operazione di modifica, non vengono pertanto bloccati.

· Come promemoria, non è mai stato possibile creare un ciclo infinito facendo in modo che un flusso di lavoro che viene avviato da un'operazione di creazione creasse un elemento nell'elenco corrente. Ogni flusso di lavoro dispone di una proprietà contenente i "flussi di lavoro che non è possibile avviare". Tale proprietà viene utilizzata per impedire che venga generato un ciclo per i flussi di lavoro che si avviano al momento della creazione di un elemento.

· Come ulteriore promemoria, tutti gli scenari precedenti riguardano solo flussi di lavoro associati a un singolo elenco o a una singola raccolta. I cicli infiniti negli scenari con più elenchi non sono mai stati bloccati per i flussi di lavoro che vengono avviati da un'operazione di modifica o di creazione.

Creazione di cicli prima del Service Pack 2

In questa sezione viene presentato un esempio di come un flusso di lavoro che viene avviato da un'operazione di modifica può avvalersi dei cicli infiniti prima del Service Pack 2. Dopo il Service Pack 2, tale flusso di lavoro non può attivare se stesso, pertanto nella sezione successiva viene presentato un esempio di come creare un ciclo utilizzando due flussi di lavoro distinti.

Si supponga di disporre di un elenco di attività denominato Attività del team (Team Tasks) e di voler progettare un flusso di lavoro in grado di inviare ogni giorno un promemoria finché l'attività non viene contrassegnata come completata.

Aggiungere innanzitutto all'elenco una colonna denominata Contatore (Counter) con un valore predefinito (Default value) uguale a 0.

clip_image006

È necessario nascondere le colonne Contatore nei moduli elenco (Nuovo elemento, Modifica elemento), in modo che solo il flusso di lavoro possa accedervi e aggiornarle. Nella pagina Impostazioni elenco innanzitutto fare clic su Impostazioni avanzate e quindi consentire la gestione dei tipi di contenuto.

clip_image008

Nella pagina Impostazioni elenco fare clic su ogni tipo di contenuto e nella pagina successiva fare clic sulla colonna Contatore (Counter). Verificare che tale colonna sia nascosta (Hidden). Procedere in questo modo per tutti i tipi di contenuto dell'elenco.

clip_image010

Dopo avere creato e nascosto la colonna Contatore (Counter) in modo che non venga visualizzata nei moduli, si è pronti per progettare il flusso di lavoro.

Il flusso di lavoro Promemoria giornaliero (Daily Reminder) deve avviarsi ogni volta che un elemento viene creato o modificato.

clip_image012

Durante il primo passaggio vengono effettuate due verifiche. (1) Se l'attività è già stata contrassegnata come completata, il flusso di lavoro si interrompe. Tale regola crea un "corto circuito" nel ciclo ogni volta che l'attività alla fine viene contrassegnata come completata. (2) Se l'attività non è stata completata, il flusso di lavoro controlla se la data di scadenza è futura, ovvero successiva alla data odierna. Se tale condizione è vera, il flusso di lavoro viene sospeso fino alla data di scadenza perché non si desidera che vengano inviati promemoria fino alla data di scadenza.

clip_image014

Durante il secondo passaggio viene di nuovo verificato se l'attività è stata completata (nel caso il flusso di lavoro sia stato sospeso fino a una data di scadenza nel passaggio precedente e nel frattempo l'attività sia stata completata). Se l'attività non è ancora stata completata, il flusso di lavoro rimane sospeso per un giorno.

clip_image016

Durante il terzo passaggio viene verificato ancora una volta se l'attività è stata completata mentre il flusso di lavoro era sospeso. Se tale condizione è vera, il flusso di lavoro si interrompe.

Se l'attività non è stata completata, il flusso di lavoro (1) invia il promemoria tramite posta elettronica, (2) imposta la variabile CurrentCount eseguendo una ricerca per il campo Elemento corrente/Contatore (Current Item/Counter), (3) aggiunge 1 a CurrentCount e archivia tale valore in una variabile NewCount e infine (4) imposta la colonna Contatore (Counter) sul valore archiviato nella variabile NewCount.

In questo passaggio fondamentalmente il valore della colonna Contatore (Counter) viene incrementato di 1 a ogni esecuzione del flusso di lavoro. È pertanto possibile osservare tale colonna per vedere quanti promemoria sono stati inviati. L'aspetto ancora più importante è che a "modificare" l'elemento corrente è l'azione "Imposta campo in elemento corrente" alla fine di questo passaggio. In questo modo il flusso di lavoro attiva se stesso e quindi crea il ciclo.

clip_image018

Creazione di cicli dopo il Service Pack 2

Dopo il Service Pack 2, è ancora possibile ottenere questo effetto ciclo, ma è necessario progettare due flussi di lavoro che si attivano reciprocamente (coricorsione) invece di un singolo flusso di lavoro che attiva se stesso.

In questo caso verranno utilizzati (1) un flusso di lavoro Contatore (Counter) che incrementa il conteggio e (2) un flusso di lavoro Compito (Worker) che invia effettivamente il promemoria tramite posta elettronica.

Primo flusso di lavoro - Flusso di lavoro Contatore (Counter)

Come descritto in precedenza, è necessario creare nell'elenco una colonna Contatore (Counter) con un valore predefinito (Default value) pari a 0, consentire la gestione dei tipi di contenuto e impostare tale campo come nascosto (Hidden) per tutti i tipi di contenuto dell'elenco.

clip_image006[1]

Questa progettazione con due flussi di lavoro richiede una seconda colonna, InviaPosta (SendMail), che fungerà da flag per il flusso di lavoro Compito (Worker). Il valore predefinito (Default value) deve essere No, altrimenti qualsiasi modifica apportata a un'attività determinerà l'invio del promemoria tramite posta elettronica.

clip_image020

Il flusso di lavoro Contatore (Counter) si avvierà quando un elemento viene creato o modificato.

clip_image022

Durante il primo passaggio viene verificato lo stato dell'attività. Se questa è stata completata, il flusso di lavoro Contatore (Counter) si interromperà.

clip_image024

Se la data di scadenza è futura, ovvero è successiva alla data odierna, il secondo passaggio rimane sospeso fino alla data di scadenza perché non si desidera che vengano inviati promemoria finché l'attività non è scaduta.

clip_image026

Durante il terzo passaggio viene di nuovo verificato il completamento dell'attività, nel caso l'attività sia stata completata mentre il flusso di lavoro era sospeso nel passaggio precedente. Se l'attività non è ancora stata completata, il flusso di lavoro rimane sospeso per un giorno.

clip_image028

Durante il passaggio finale viene verificato ancora una volta lo stato per vedere se l'attività è stata completata durante la pausa durata tutto il giorno precedente. In caso contrario, il flusso di lavoro aggiorna l'elemento corrente (1) incrementando di uno il valore della colonna Contatore (Counter) e (2) impostando il flag InviaPosta (SendMail) su Sì (Yes). Il valore predefinito è No.

clip_image030

Secondo flusso di lavoro - Flusso di lavoro Compito (Worker)

Il flusso di lavoro Contatore (Counter) sopra descritto termina aggiornando (modificando) l'elemento corrente. Tali aggiornamenti attivano il flusso di lavoro Compito (Worker), che è impostato per avviarsi quando un elemento viene modificato.

clip_image032

Il flusso di lavoro Compito (Worker) verifica semplicemente se il flag InviaPosta (SendMail) è impostato su Sì (Yes). In caso affermativo, il flusso di lavoro invia il promemoria tramite posta elettronica e imposta di nuovo il flag su No.

L'impostazione del flag InviaPosta (SendMail) su No è la modifica che attiva il flusso di lavoro Contatore (Counter) precedente. I flussi di lavoro Contatore (Counter) e Compito (Worker) si attiveranno reciprocamente, inviando promemoria giornalieri finché l'attività non viene contrassegnata come completata.

clip_image034

In alternativa, invece di avere un ciclo infinito, è possibile fare in modo che il flusso di lavoro Compito (Worker) riassegni tramite escalation la notifica dell'attività quando la colonna Contatore (Counter) raggiunge un determinato valore, ad esempio cinque promemoria. Nel passaggio successivo vengono eseguite diramazioni diverse a seconda del conteggio dei promemoria. Quando tale conteggio arriva a 5, il flusso di lavoro invia un messaggio a un responsabile il cui indirizzo di posta elettronica può essere specificato a livello di codice (hard-coded) nell'azione Invia un messaggio oppure essere recuperato da un elenco tramite una ricerca del flusso di lavoro.

clip_image036

È inoltre possibile fare in modo che il flusso di lavoro Compito (Worker) riassegni l'attività a un altro individuo o gruppo dopo l'invio di un determinato numero di promemoria. Per questo passaggio, il flusso di lavoro riassegna l'attività a un gruppo di SharePoint costituito dai membri del team responsabili di seguire lo svolgimento di tali attività riassegnate tramite escalation.

clip_image038

Se si desidera che il ciclo termini quando il conteggio raggiunge un determinato numero, ricordarsi inoltre di aggiungere una diramazione al primo passaggio del flusso di lavoro Contatore (Counter), non al flusso di lavoro Compito (Worker). Tale diramazione interrompe il ciclo quando la colonna Contatore (Counter) raggiunge il valore 6.

clip_image040

Spero che tutte queste informazioni vi siano utili.

-Stephen

Questo è un post di blog localizzato. L'articolo originale è disponibile in Service Pack 2 prevents an on-change workflow from starting itself.