Sharepoint Out of the box approbation Workflow approuver/rejeter comments issue when programmatically modifying it

j'ai un flux de travail d'approbation sharepoint réutilisable en 2010, et j'approuve/rejette programmatiquement le flux de travail en utilisant l'extrait de code ci-dessous à l'intérieur du formcode infopath (2010).

Hashtable ht = new Hashtable();
ht[SPBuiltInFieldId.Completed] = "TRUE";
ht["Completed"] = "TRUE";
ht[SPBuiltInFieldId.PercentComplete] = 1.0f;
ht["PercentComplete"] = 1.0f;
ht["Status"] = "Completed";
ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString
    (new CultureInfo((int)task.Web.Language, false),
    Strings.WorkflowStatusCompleted, new object[0]);
if (isApprove)
{
    ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
    ht["TaskStatus"] = "Approved";
    ht[SPBuiltInFieldId.Comments] = "Approved by Manager";
    ht["Comments"] = "Approved by Manager";
}
else
{
    XPathNavigator navigatorRejectComments
        = this.MainDataSource.CreateNavigator().SelectSingleNode
           (XPATH_REJECT_COMMENTS, this.NamespaceManager);

    ht[SPBuiltInFieldId.WorkflowOutcome] = "Rejected";
    ht["TaskStatus"] = "Rejected";
    ht[SPBuiltInFieldId.Comments] = navigatorRejectComments.Value.Trim();
    ht["Comments"] = navigatorRejectComments.Value.Trim();
}
ht["FormData"] = SPWorkflowStatus.Completed;
web.AllowUnsafeUpdates = true;                                                            
isApproveReject = AlterTask(task, ht, true, 5, 100);                           
web.AllowUnsafeUpdates = false;

méthode de modification des tâches

private static bool AlterTask(SPListItem task, Hashtable htData, bool fSynchronous, int attempts, int  millisecondsTimeout)
{
if ((int)task[SPBuiltInFieldId.WorkflowVersion] != 1)
    {
        SPList parentList = task.ParentList.ParentWeb.Lists[new Guid(task[SPBuiltInFieldId.WorkflowListId].ToString())];
        SPListItem parentItem = parentList.Items.GetItemById((int)task[SPBuiltInFieldId.WorkflowItemId]);
        for (int i = 0; i < attempts; i++)
        {
            SPWorkflow workflow = parentItem.Workflows[new Guid(task[SPBuiltInFieldId.WorkflowInstanceID].ToString())];
            if (!workflow.IsLocked)
            {
                task[SPBuiltInFieldId.WorkflowVersion] = 1;
                task.SystemUpdate();
                break;
            }
            if (i != attempts - 1)
                Thread.Sleep(millisecondsTimeout);
        }
    }
    return SPWorkflowTask.AlterTask(task, htData, fSynchronous);
}

Ce code fonctionne très bien, mais les commentaires de la tâche n'est pas modifié et il n'est pas inclus dans l'e-mail ainsi. Y a-t-il quelque chose de mal avec ht["commentaires"] que j'utilise? Il n'est pas modifié dans la tâche de commentaires. C'est SharePoint 2010 workflows et le formulaire infopath que j'utilise sont aussi 2010.

Quelqu'un a fait face à un problème similaire ?

19
demandé sur pyrocumulus 2011-10-13 14:09:31

2 réponses

pour ajouter un commentaire À une tâche lorsque vous Approuver/Rejeter, vous avez juste besoin d'utiliser la ligne avant AlterTask:

ht["ows_FieldName_Comments"] = comments;

une fois la tâche approuvée, vous pouvez voir les commentaires dans la liste historique du flux de travail.

Vous pouvez également obtenir tous les commentaires consolidés à partir d'une tâche avec:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask);

string consolidatedComments = extProperties["FieldName_ConsolidatedComments"].ToString();

Bonne chance!

1
répondu Gonçalo Leote 2012-09-06 13:33:54

si vous avez besoin de code seulement pour les listes (pas pour DocLibs) vous pouvez utiliser item.ModerationInformation.Status propriété. Comme l'exemple suivant:

var url = @"http://server/Lists/ContentApList";
var web = new SPSite(url).OpenWeb();
var list = web.GetList(url);
var item = list.GetItemById(1);
item["MyCheck"] = "test23";
item.ModerationInformation.Status = SPModerationStatusType.Pending;
item.ModerationInformation.Comment = "my coment";
item.SystemUpdate();

Mais si vous voulez le faire pour tous les types de liste, vous pouvez utiliser la méthode interne UpdateInternal, avec les paramètres suivants:

static void UpdateMigrate(SPListItem item)
{
  UpdateInternal(item, true, false, Guid.Empty, true, false,false, false, false, false);
}

static void CheckList5()
{
    var url = @"http://server/Lists/ContentApList";
    var web = new SPSite(url).OpenWeb();
    var file = web.GetFile("CheckDocLib/logo.gif");
    var item = file.ListItemAllFields;
    item["MyComments"] = "test23ddd";
    item.ModerationInformation.Status = SPModerationStatusType.Approved;
    item.ModerationInformation.Comment = "my coment";
    UpdateMigrate(item);
}

vous pouvez utiliser des exemples de ce blog russe point ModerationInformation et SPListItem.UpdateInternal ()

2
répondu Eduard Kibort 2011-10-23 14:25:28