2011-10-13 85 views
19

我有一個可重複使用的開箱即用共享點批准工作流程2010,並且我使用以下代碼片段內部的infopath表單代碼以編程方式批准/拒絕工作流(2010年)。Sharepoint開箱即用批准工作流通過編程方式批准/拒絕註釋問題

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

此代碼工作正常,但任務的意見是沒有得到改變,這是不包含在電子郵件以及。 ht [「評論」]有什麼問題嗎?它在任務評論中沒有改變。這是我2010年使用的SharePoint 2010工作流和infopath表單也是2010.

任何人都面臨類似的問題?

+0

這段代碼確實幫助我完成了一個非常重要的項目。現在我將處理評論。如果我找到有用的東西,我一定會讓你知道的。謝謝! – harsimranb

回答

1

添加註釋,當你批准/拒絕它,你只需要使用AlterTask前行任務:

ht["ows_FieldName_Comments"] = comments; 

任務獲得批准後,您可以在工作流歷史列表中看到註釋。

您也可以從任務中的所有的綜合意見有:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask); 

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

祝你好運!

+0

嗨GonçaloLeote,謝謝你的回答。這是我所期望的。它工作正常,再次感謝! – SharePointError

2

如果您只需要列表的代碼(不適用於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()

+0

猜你在談論評論意見..我在審批工作流程中的任務評論,這也將在電子郵件中提供。 – SharePointError

相關問題