2011-10-13 7 views
19

Tôi có thể sử dụng lại quy trình phê duyệt hộp sharepoint 2010 và tôi đang phê duyệt/từ chối lập trình công việc bằng cách sử dụng đoạn mã bên dưới mã biểu mẫu infopath (2010).Sharepoint Trong hộp phê duyệt Quy trình làm việc Phê duyệt/Từ chối vấn đề nhận xét khi lập trình thay đổi nó

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; 

công tác Alter phương pháp

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

Mã này hoạt động tốt, nhưng các ý kiến ​​của nhiệm vụ là không nhận được thay đổi và nó không được bao gồm trong e-mail là tốt. Có gì sai với ht ["Bình luận"] mà tôi sử dụng? Nó không bị thay đổi trong các bình luận nhiệm vụ. Đây là quy trình công việc SharePoint 2010 và biểu mẫu infopath tôi đang sử dụng cũng là năm 2010.

Bất kỳ ai gặp phải sự cố tương tự?

+0

Mã đó chắc chắn đã giúp tôi trong một dự án thực sự quan trọng. Bây giờ tôi sẽ làm việc trên ý kiến. Nếu tôi tìm thấy bất cứ điều gì hữu ích, tôi chắc chắn sẽ cho bạn biết. Cảm ơn! – harsimranb

Trả lời

1

để thêm một bình luận cho một nhiệm vụ khi bạn Phê duyệt/Từ chối nó, bạn chỉ cần sử dụng dòng trước AlterTask:

ht["ows_FieldName_Comments"] = comments; 

Sau khi tác vụ được chấp thuận, bạn có thể xem các nhận xét trong Danh sách lịch sử luồng công việc.

Bạn cũng có thể nhận được tất cả những ý kiến ​​hợp nhất từ ​​một nhiệm vụ với:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask); 

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

Chúc may mắn!

+0

Hi Gonçalo Leote, cảm ơn bạn đã trả lời. đó là những gì tôi đã mong đợi. và nó hoạt động tốt, cảm ơn rất nhiều lần nữa! – SharePointError

2

Nếu bạn chỉ cần mã cho Danh sách (không dành cho DocLibs), bạn có thể sử dụng thuộc tính item.ModerationInformation.Status. Giống như ví dụ sau:

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

Nhưng nếu bạn muốn làm điều đó cho tất cả các loại danh sách, bạn có thể sử dụng phương pháp nội UpdateInternal, với các thông số sau:

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

Bạn có thể sử dụng các ví dụ từ này Nga viết blog Item ModerationInformation and SPListItem.UpdateInternal()

+0

Đoán bạn đang nói về các bình luận kiểm duyệt .. tôi đã được reffering ý kiến ​​công việc trong một công việc phê duyệt mà sẽ có sẵn trong email là tốt. – SharePointError