【问题标题】:Sharepoint Out of the box Approval Workflow Approve/Reject comments issue when programmatically altering itSharepoint 开箱即用的批准工作流程 以编程方式更改评论时批准/拒绝评论问题
【发布时间】:2011-12-06 20:12:11
【问题描述】:

我有一个可重复使用的开箱即用 sharepoint 批准工作流 2010,并且我使用 infopath formcode (2010) 中的以下代码 sn-p 以编程方式批准/拒绝工作流。

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;

任务变更方法

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

此代码工作正常,但任务的 cmets 没有被更改,并且它也没有包含在电子邮件中。我使用的 ht["Comments"] 有什么问题吗?它不会在任务 cmets 中被更改。这是 SharePoint 2010 工作流程,我使用的 infopath 表单也是 2010。

有人遇到过类似的问题吗?

【问题讨论】:

  • 那段代码确实帮助我完成了一个非常重要的项目。现在我将研究 cmets。如果我发现任何有用的东西,我一定会让你知道。谢谢!

标签: c# sharepoint-2010 sharepoint-workflow


【解决方案1】:

如果您只需要列表的代码(而不是 DocLibs),您可以使用item.ModerationInformation.Status 属性。像下面的例子:

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

但如果你想对所有列表类型都这样做,你可以使用内部方法UpdateInternal,带有以下参数:

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

你可以使用这个俄罗斯博客Item ModerationInformation and SPListItem.UpdateInternal()中的例子

【讨论】:

  • 猜你是在谈论审核 cmets。我在审批工作流中引用任务 cmets,这也将在电子邮件中提供。
【解决方案2】:

要在批准/拒绝任务时添加评论,只需使用 AlterTask 之前的行:

ht["ows_FieldName_Comments"] = comments;

任务批准后,您可以在工作流历史列表中看到 cmets。

您还可以通过以下方式从任务中获取所有合并的 cmets:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask);

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

祝你好运!

【讨论】:

  • 您好 Gonçalo Leote,感谢您的回答。这就是我所期望的。它工作正常,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2011-11-19
  • 1970-01-01
  • 2017-04-23
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多