Beren.it

All that you can leave behind

Home Sweet Home

Vado a vivere da solo

Habemus Domus! Mah, non so se direbbe così un latino o forse sarebbe ciò che direbbe Totti nella pubblicità... in ogni caso il significato resta lo stesso. Dopo lungo cercare, mica vero, un paio di mesi, ho finalmente trovato la casa del mio prossimo futuro. Una casettina carina, niente di più: un bilocale di (abbastanza) nuova generazione, ma soprattutto qualcosa di mio da cima a fondo. Sinceramente la mia prima casa non mi aspettavo di cercarmela proprio da solo in tutto e per tutto. In ogni caso aspettare cose e situazioni che non esistono avrebbe soltanto ritardato la scelta e mi avrebbero solamente dato la scusa per non farlo. Alla fine ritengo giusto ed opportuno invece in questo momento fare una scelta faticosa che porterà, e lo sta già facendo, un sacco di rotture di scatole, ma certamente anche un sacco si cose positive. Insomma per adesso si fanno grandi progetti che speriamo di concretizzare nella maniera migliore.

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;
      }
   }
}