Beren.it

All that you can leave behind

Cambiare l'assegnatario di una task in Sharepoint

L'errore "The task is currently locked by a running workflow and cannot be edited" può venire alzato quando si cerca di cambiare una task.

Con i Workflow in Sharepoint può capitare di voler modificare l'owner di una task. Cambiare semplicemente il campo "Assigned To" del Task Item però non è sufficiente, infatti così facendo la prossima volta che il workflow accederà alla task, ad esempio quando il nuovo owner effettuerà un accesso ad essa, verrà alzato l'errore "The task is currently locked by a running workflow and cannot be edited". Dopo lungo penare mi è arrivata la soffiata corretta: infatti è sufficiente agire su un campo particolare del task item per violare il lock. Tale campo si chiama "WorkflowVersion": quando esso ha valore diverso da 1 (inteso come intero) l'applicazione alza l'eccezzione e viene settato ad un valore diverso da 1 ogni volta che viene fatto l'update della task. 

Di conseguenza il trucco è:

  1. Verificare se tale campo è diverso da 1, se lo è allora lo si setta ad uno e si fà l'update della task
  2. Si modifica il campo "Assigned To" mettendo il nuovo valore (naturalmente si possono modificare altri campi della task) e si fà l'update. Il framework a questo punto setterà nuovamente il valore di "WorkflowVersion" a qualcosa di diverso da 1.
  3. Per evitare che il prossimo accesso trovi il lock settiamo nuovamente il campo "WorkflowVersion" ad 1 e facciamo l'update

 

Qua sotto riporto un breve esempio sul come eseguire l'operazione:

[C#]

public static void UpdateTask(Guid guid,string _url)
{
   using(SPSite site = new SPSite(_url))
   {
      using(SPWeb web = site.OpenWeb())
      {
         web.AllowUnsafeUpdates = true;

         // TaskList is the list where the task are stored
         SPList lib = web.Lists["TaskList"];

         // retrieve the item
         SPListItem item = lib.Items[guid];

         //if the item is locked-> unlock and update
         if ((int)item["WorkflowVersion"] != 1)
         {
            item["WorkflowVersion"] = 1;
            item.Update();
         }
         
         //update your field, in this case the "assigned to" value :)
         item["Assigned To"] = "Bill Gates";
         item.Update();
         
         item["WorkflowVersion"] = 1;
         item.Update();
         
         web.AllowUnsafeUpdates = false;
      }
   }
}