Programatically Approve/Reject workflows and add comments

harsimranb picture harsimranb · Jul 18, 2012 · Viewed 8.7k times · Source

I'm trying to programatically approve/reject workflows in SharePoint. I can successfully do this, but I cannot add comments. I got my code from a year old question, which hasn't been answered either, so I thought I'd start a new question.

My code:

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 (param == "Approved")
{
    ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
    ht["TaskStatus"] = "Approved";
    if (!string.IsNullOrEmpty(comments))
    {
        ht[SPBuiltInFieldId.Comments] = comments;
        ht["Comments"] = comments;
        ht[SPBuiltInFieldId.Comment] = comments;
    }
}
else
{

    ht[SPBuiltInFieldId.WorkflowOutcome] = "Rejected";
    ht["TaskStatus"] = "Rejected";
    if (!string.IsNullOrEmpty(comments))
    {
        ht[SPBuiltInFieldId.Comments] = comments;
        ht["Comments"] = comments;
        ht[SPBuiltInFieldId.Comment] = comments;
    }
}
ht["FormData"] = SPWorkflowStatus.Completed;
bool isApproveReject = AlterTask(task, ht, true, 5, 100);

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

Answer

Gon&#231;alo Leote picture Gonçalo Leote · Sep 6, 2012

To add a comment to a task when you Approve/Reject it, you just need to use the line before AlterTask:

ht["ows_FieldName_Comments"] = comments;

After the task is approved you can see the comments in the Workflow History List.

You can also get all the consolidated comments from a task with:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask);

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