1

J'ai une liste sharepoint personnalisée (2007) (nommé testlist) sur lequel je joint un flux de travail de test (construit avec le designer sharepoint 2007 et testwf nommé), qui seule tâche définie dans la section «Actions à « Étape 1 » est d'attendre jusqu'en avril 2014. quand j'ajouter un nouvel élément à la testlist la testwf démarre et, quand je passe à la vue de la grille, l'élément a le champ « testwf » en cours d'exécution.SPListItem.Tasks toujours vides

Maintenant, j'ai besoin d'accéder au flux de travail associé à l'élément, puis "terminer" cette tâche via le code en changeant son statut, mais en utilisant le code suivant, je reçois toujours l'élément. la variable interne m_allTaskListTasks a 1 élément).

 using (SPSite site = new SPSite("http://mysp")) 
     { 
      site.AllowUnsafeUpdates = true; 
      SPWeb web = site.OpenWeb(); 
      web.AllowUnsafeUpdates = true; 

      foreach (SPList list in web.Lists) 
      { 
       if (list.Title != "testlist") continue; 
       foreach (SPListItem item in list.Items) 
       { 
        item.Web.AllowUnsafeUpdates = true; 
        if(item.Tasks.Count > 0) 
         //do work 
       } 
      } 
     } 

Peut-être que je manque quelque chose ...

Répondre

0

Vous devez aller différemment à ce sujet. Vous devez obtenir la liste des tâches de workflow et récupérer votre tâche à partir de là et la terminer. Vous devez d'abord vérifier si un workflow est en cours d'exécution sur votre article: if (item.Workflows > 0) à partir de là vous pouvez parcourir toutes les instances de workflow de l'élément de liste, obtenir l'association SPWorkflowAssociation et la liste des tâches et de l'historique associées. À partir de là, vous n'aurez plus qu'à trouver la tâche que vous recherchez dans la liste des tâches associées.

+0

merci pour votre réponse, j'ai essayé en mettant en œuvre vos conseils dans mon prochain code de réponse mais toujours pas de chance ... – petauro

0

Merci moontear, suivant vos conseils, je viens d'essayer de modifier mon code pour ce

using (SPSite site = new SPSite("http://mysp")) 
    { 
     site.AllowUnsafeUpdates = true; 
     SPWeb web = site.OpenWeb(); 
     web.AllowUnsafeUpdates = true; 

     foreach (SPList list in web.Lists) 
     { 
      if (list.Title != "testlist") continue; 
      foreach (SPListItem item in list.Items) 
      { 
       item.Web.AllowUnsafeUpdates = true; 
       foreach (SPWorkflow workflow in item.Workflows) 
       { 
        var t = site.WorkflowManager.GetWorkflowTasks(item, workflow.InstanceId); 
        if(item.Tasks.Count > 0) // always empty 
        if(t.Count > 0) // always empty 
        if(workflow.Tasks.Count > 0) // always empty 
       } 
      } 
     } 
    } 

mais toujours pas de chance, tasklist est encore vide ...

1

J'utiliser ce code pour accéder à mes workflowtasks :

Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString()); 
SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID]; 
// now you can access the workflows tasks 
SPTask task = workflow.Tasks[item.UniqueId]; 
1

Cross-posted question.

@petauro, avez-vous fait des progrès à ce sujet? Je peux confirmer le code basé sur la réponse de @ moontear suivant que je l'ai utilisé avec succès dans le passé:

... 
// get workflow tasks for SPListItem object item 
if (item != null && item.Workflows != null && item.Workflows.Count > 0) 
{ 
    try 
    { 
     var workflows = site.WorkflowManager.GetItemActiveWorkflows(item); 
     foreach (SPWorkflow workflow in workflows) 
     { 
      // match on some indentifiable attribute of your custom workflow 
      // the history list title is used below as an example 

      if (workflow.ParentAssociation.HistoryListTitle.Equals(Constants.WORKFLOW_HISTORY_LIST_TITLE)) 
      { 
       var workflowTasks = workflow.Tasks; 
       if (workflowTasks != null && workflowTasks.Count > 0) 
       { 
        // do work on the tasks 
       } 
      } 
     } 
    } 
    catch 
    { 
     // handle error 
    } 
} 
... 

Bien que légèrement différent du code affiché dans votre dernier commentaire, voir si ça aide.

Un autre point mineur: y at-il plusieurs instances de listes titrées "testlist" au sein de votre SPWeb? Si non, pourquoi itérer sur web.Lists? Juste obtenir la liste une directement et éviter des cycles de processeur superflus: SPWeb.GetList()

+0

item.Workflows.Count> 0 est toujours 0 pour moi. est-ce que tu sais pourquoi? – Muhammedh

Questions connexes