none
[API SP]Récupérer le SPWorkflowTaskProperties en cours dans un Generic Handler (.ashx) RRS feed

Réponses

  • Bonjour,

    Si vous voulez modifier des propriétés des Taches de workflow, la bonne façon de faire est la suivante :

    Hashtable taskHash = new Hashtable();
    taskHash["FileOverwriteOptions"] = RadioButtonList1.SelectedValue;          
    taskHash["TaskStatus"] = "Complete";      
    taskHash["PercentComplete"] = "1";
    SPWorkflowTask.AlterTask(this._TaskListItem, taskHash, true);    
    Le seul pré-requis est donc de connaitre l'élement de la liste de tâche en question. Vous pourrer le récupèrer via le Guid que vous passerez en paramètre de votre ASHX.
    Philippe - MVP SharePoint - http://blogs.developpeur.org/phil
    mercredi 18 novembre 2009 13:21
    Modérateur
  • Hum,

    en passant par la liste de tache et la méthode GetItemById(). Normalement vous devriez avoir l'ID de l'item en question non ?

    this._TaskListItem = this._TaskListAttachedTo.GetItemById(System.Convert.ToInt16(this._paramTaskListItemID));


    Philippe - MVP SharePoint - http://blogs.developpeur.org/phil
    mercredi 18 novembre 2009 17:00
    Modérateur
  • Bonjour,

    en effet il faut gérer le cas où la tâche est modifiée sans avoir été complétée. En général on utilise une activité while qui encapsule l'activité OnTaskChanged et on fait en sorte de ne sortir du while que lorsque le statut de la tâche est "Completed".

    Voici un exemple d'un projet sur lequel je travaille :



    La boucle While continue si la variable TaskNotCompleted est à true.

    Sur l'événement OnTaskChanged, le code suivant est invoqué :

            private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e)
            {
                // chek task status and fall through loop is marked complete
                if (taskAfterProperties.ExtendedProperties[TaskProperties.TASK_STATUS] != null)
                {
                    TaskStatus = taskAfterProperties.ExtendedProperties[TaskProperties.TASK_STATUS].ToString();
                    if (TaskStatus.Equals("Completed"))
                    {
                        // update variable to break out of while loop
                        TaskNotCompleted = false;
                        // update WorkflowOutcome feild
                        if (taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_OUTCOME] != null)
                            WorkflowOutcome = taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_OUTCOME].ToString();
    
                        if (taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_COMMENTS] != null)
                            WorkflowComments = taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_COMMENTS].ToString();
                    }
                    // debug message
                    HistoryOutcome = this.DumpHashtable(taskAfterProperties.ExtendedProperties);
                }
                // update userID field to reflect user who updated task
                userID = GetUserIdFromName(workflowProperties.Web, ExecutingUser);
            }
    Ainsi le workflow sort du while quand la tâche est complétée, et pas avant.

    Est-ce que cela répond à votre question ?

    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Proposé comme réponse Arnault Nouvel jeudi 19 novembre 2009 13:05
    • Marqué comme réponse OminiuS jeudi 19 novembre 2009 13:40
    jeudi 19 novembre 2009 13:05
  • La réponse de Arnaud Nouvel correspond a mon problème!

    Lorsque j'effectue ma modification, j'envoie la hashtable de mon SPWorkflowTask.AlterTask()
    Hashtable taskHash = new Hashtable();
    taskHash[SPBuiltInFieldId.TaskStatus] = "En cours";// Sending/Updating a Built in Value
    taskHash[SPBuiltInFieldId.PercentComplete] = "0.5";// The value 1 for PercentComplete = 100%.  .9 = 90%
    Et lorsque je fini ma tache, j'envoie la hashtable :
    Hashtable taskHash = new Hashtable();
    taskHash[SPBuiltInFieldId.TaskStatus] = "Terminée";// Sending/Updating a Built in Value
    taskHash[SPBuiltInFieldId.PercentComplete] = "1";// The value 1 for PercentComplete = 100%.  .9 = 90%
    Etant dans un workflow StateMachine, je ne peut mettre de boucle while en premier élément de mon EventDriven.
    Alors, dans mon event driven, juste après le onTaskChanged, j'ai mis un if qui teste :
    this.onTaskChangedEnCours_AfterProperties.ExtendedProperties
                    [Microsoft.SharePoint.SPBuiltInFieldId.PercentComplete].ToString() == "1"
    tant que c'est différent de 1, on reste la car c'est ma modification qui est en cours, sinon la tâche est finie et on continu vers mon SetState!
    Ce qui fait une espère de boucle.

    Merci a ceux qui mon permis d'y arriver!
    • Marqué comme réponse OminiuS jeudi 19 novembre 2009 13:40
    jeudi 19 novembre 2009 13:40

Toutes les réponses

  • Bonjour,

    Si vous voulez modifier des propriétés des Taches de workflow, la bonne façon de faire est la suivante :

    Hashtable taskHash = new Hashtable();
    taskHash["FileOverwriteOptions"] = RadioButtonList1.SelectedValue;          
    taskHash["TaskStatus"] = "Complete";      
    taskHash["PercentComplete"] = "1";
    SPWorkflowTask.AlterTask(this._TaskListItem, taskHash, true);    
    Le seul pré-requis est donc de connaitre l'élement de la liste de tâche en question. Vous pourrer le récupèrer via le Guid que vous passerez en paramètre de votre ASHX.
    Philippe - MVP SharePoint - http://blogs.developpeur.org/phil
    mercredi 18 novembre 2009 13:21
    Modérateur
  • Merci de votre réponse, encore une question :

    comment je récupère le taskListItem?

    Merci d'avance.
    mercredi 18 novembre 2009 16:57
  • Hum,

    en passant par la liste de tache et la méthode GetItemById(). Normalement vous devriez avoir l'ID de l'item en question non ?

    this._TaskListItem = this._TaskListAttachedTo.GetItemById(System.Convert.ToInt16(this._paramTaskListItemID));


    Philippe - MVP SharePoint - http://blogs.developpeur.org/phil
    mercredi 18 novembre 2009 17:00
    Modérateur
  • Alors, j'ai bien passer l'id de la tache via l'url,
    le problème, c'est que ma tache est validée et mon workflow passe à l'état suivant (je travaille sur un workflow), alors que je veux juste modifier une property de la tâche sans la valider!

    Voici mon code :
            //info contentType
            Hashtable taskHash = new Hashtable();
            taskHash["StatutID"] = "3En cours";
            taskHash["Statut"] = "En cours";
    
            // Récupère l'item créé par le WF
            // ID de la fiche
            string paramTaskListItemID = context.Request["idTask"];
            SPListItem taskListItem = spWeb.Lists["Taches"].GetItemById(System.Convert.ToInt16(paramTaskListItemID));
    
            //autorise les updates en GET
            spWeb.AllowUnsafeUpdates = true;
            // Envoie des données à la liste des tâches
            SPWorkflowTask.AlterTask(taskListItem, taskHash, true);
            spWeb.AllowUnsafeUpdates = false;

    mercredi 18 novembre 2009 17:28
  • Dois-je faire un test dans mon workflow qui vérifie que le status de la tache est différent de "complete"?
    Ou y-a-t'il une autre alternative via l'API SP?

    Merci d'avance.
    jeudi 19 novembre 2009 09:23
  • le problème, c'est que ma tache est validée et mon workflow passe à l'état suivant (je travaille sur un workflow), alors que je veux juste modifier une property de la tâche sans la valider!

    Bonjour,

    Pardon mais je ne vois pas le lien avec la question initiale.

    Que faites vous au exactement ? (en partant du début)


    Philippe - MVP SharePoint - http://blogs.developpeur.org/phil
    jeudi 19 novembre 2009 10:50
    Modérateur
  • Bonjour,

    en effet il faut gérer le cas où la tâche est modifiée sans avoir été complétée. En général on utilise une activité while qui encapsule l'activité OnTaskChanged et on fait en sorte de ne sortir du while que lorsque le statut de la tâche est "Completed".

    Voici un exemple d'un projet sur lequel je travaille :



    La boucle While continue si la variable TaskNotCompleted est à true.

    Sur l'événement OnTaskChanged, le code suivant est invoqué :

            private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e)
            {
                // chek task status and fall through loop is marked complete
                if (taskAfterProperties.ExtendedProperties[TaskProperties.TASK_STATUS] != null)
                {
                    TaskStatus = taskAfterProperties.ExtendedProperties[TaskProperties.TASK_STATUS].ToString();
                    if (TaskStatus.Equals("Completed"))
                    {
                        // update variable to break out of while loop
                        TaskNotCompleted = false;
                        // update WorkflowOutcome feild
                        if (taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_OUTCOME] != null)
                            WorkflowOutcome = taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_OUTCOME].ToString();
    
                        if (taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_COMMENTS] != null)
                            WorkflowComments = taskAfterProperties.ExtendedProperties[TaskProperties.DIFFUSAL_COMMENTS].ToString();
                    }
                    // debug message
                    HistoryOutcome = this.DumpHashtable(taskAfterProperties.ExtendedProperties);
                }
                // update userID field to reflect user who updated task
                userID = GetUserIdFromName(workflowProperties.Web, ExecutingUser);
            }
    Ainsi le workflow sort du while quand la tâche est complétée, et pas avant.

    Est-ce que cela répond à votre question ?

    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Proposé comme réponse Arnault Nouvel jeudi 19 novembre 2009 13:05
    • Marqué comme réponse OminiuS jeudi 19 novembre 2009 13:40
    jeudi 19 novembre 2009 13:05
  • La réponse de Arnaud Nouvel correspond a mon problème!

    Lorsque j'effectue ma modification, j'envoie la hashtable de mon SPWorkflowTask.AlterTask()
    Hashtable taskHash = new Hashtable();
    taskHash[SPBuiltInFieldId.TaskStatus] = "En cours";// Sending/Updating a Built in Value
    taskHash[SPBuiltInFieldId.PercentComplete] = "0.5";// The value 1 for PercentComplete = 100%.  .9 = 90%
    Et lorsque je fini ma tache, j'envoie la hashtable :
    Hashtable taskHash = new Hashtable();
    taskHash[SPBuiltInFieldId.TaskStatus] = "Terminée";// Sending/Updating a Built in Value
    taskHash[SPBuiltInFieldId.PercentComplete] = "1";// The value 1 for PercentComplete = 100%.  .9 = 90%
    Etant dans un workflow StateMachine, je ne peut mettre de boucle while en premier élément de mon EventDriven.
    Alors, dans mon event driven, juste après le onTaskChanged, j'ai mis un if qui teste :
    this.onTaskChangedEnCours_AfterProperties.ExtendedProperties
                    [Microsoft.SharePoint.SPBuiltInFieldId.PercentComplete].ToString() == "1"
    tant que c'est différent de 1, on reste la car c'est ma modification qui est en cours, sinon la tâche est finie et on continu vers mon SetState!
    Ce qui fait une espère de boucle.

    Merci a ceux qui mon permis d'y arriver!
    • Marqué comme réponse OminiuS jeudi 19 novembre 2009 13:40
    jeudi 19 novembre 2009 13:40