2011-10-13 15 views
19

Mam możliwość wielokrotnego użytku poza schematem zatwierdzania sharepoint 2010, a programowo zatwierdzam/odrzucam przepływ pracy za pomocą poniższego fragmentu kodu wewnątrz kodu wynikowego Infopath (2010).Sharepoint po wyjęciu z pudełka Zatwierdzenie przepływu pracy Zatwierdzenie/odrzucenie komentarza przy jego programowej zmianie

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; 

Zadanie Alter metoda

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

Ten kod działa poprawnie, ale komentarze zadania nie jest uzyskiwanie zmieniane i nie jest zawarte w wiadomości e-mail, jak również. Czy jest coś nie tak z ht ["Komentarze"], którego używam? Nie zmienia się w komentarzach do zadań. To są przepływy pracy SharePoint 2010 i formularz informacyjny, którego używam jest również 2010.

Ktoś borykał się z podobnym problemem?

+0

Ten kod zdecydowanie pomógł mi w realizacji naprawdę ważnego projektu. Teraz będę pracował nad komentarzami. Jeśli znajdę coś przydatnego, na pewno dam ci znać. Dzięki! – harsimranb

Odpowiedz

1

aby dodać komentarz do zadania podczas Zatwierdź/Odrzuć go, wystarczy użyć wiersza przed AlterTask:

ht["ows_FieldName_Comments"] = comments; 

Po zatwierdzeniu zadania można zobaczyć komentarze na liście historii przepływów pracy.

Można również uzyskać wszelkie skonsolidowane komentarze zadania z:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask); 

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

Powodzenia!

+0

Witaj Gonçalo Leote, dziękuję ci za odpowiedź. tego właśnie się spodziewałem. i działa dobrze, jeszcze raz dziękuję! – SharePointError

2

Jeśli potrzebujesz kodu tylko dla list (nie dla DocLibs), możesz użyć właściwości item.ModerationInformation.Status. Podobnie jak w poniższym przykładzie:

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

Ale jeśli chcesz to zrobić dla wszystkich typów list można użyć metody wewnętrznej UpdateInternal, o następujących parametrach:

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

można użyć przykładów z tego rosyjski blog Item ModerationInformation and SPListItem.UpdateInternal()

+0

Zgadnij, że mówisz o komentarzach moderowania ... W odpowiedzi sprawdzałem informacje o zadaniach w przepływie zatwierdzania, który będzie również dostępny w wiadomości e-mail. – SharePointError

Powiązane problemy