2011-10-13 11 views
19

Ho un flusso di lavoro di approvazione condivisa expo riutilizzabile 2010 e approvo/rigetto programmaticamente il flusso di lavoro utilizzando lo snippet di codice riportato di seguito all'interno del formcode infopath (2010).Sharepoint Fuori dalla scatola Flusso di lavoro approvazione Approvare/Rifiutare il problema dei commenti quando lo si modifica a livello di programmazione

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; 

Task Alter metodo

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

Questo codice funziona bene, ma i commenti del compito non è sempre alterato e non è incluso nella e-mail pure. C'è qualcosa di sbagliato in ht ["Comments"] che uso? Non viene modificato nei commenti delle attività. Questo è il flusso di lavoro di SharePoint 2010 e il modulo infopath che sto usando è anche 2010.

Chiunque ha riscontrato problemi simili?

+0

Questo codice mi ha sicuramente aiutato in un progetto davvero importante. Ora lavorerò sui commenti. Se trovo qualcosa di utile, ti farò sicuramente sapere. Grazie! – harsimranb

risposta

1

per aggiungere un commento a un'attività quando si approva/Rifiuta esso, è sufficiente utilizzare la linea prima AlterTask:

ht["ows_FieldName_Comments"] = comments; 

Dopo l'approvazione dell'attività è possibile visualizzare i commenti nell'elenco della cronologia del flusso di lavoro.

è anche possibile ottenere tutti i commenti consolidati da un'attività con:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask); 

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

Buona fortuna!

+0

Ciao Gonçalo Leote, grazie per la risposta. questo è quello che mi aspettavo. e funziona bene, grazie mille ancora! – SharePointError

2

Se è necessario il codice solo per elenchi (non per DocLibs), è possibile utilizzare la proprietà item.ModerationInformation.Status. Come il seguente esempio:

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

Ma se si vuole farlo per tutti i tipi di elenco, è possibile utilizzare il metodo interno UpdateInternal, con i seguenti parametri:

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

È possibile utilizzare gli esempi di questo russo blog Item ModerationInformation and SPListItem.UpdateInternal()

+0

Indovina che stai parlando dei commenti di moderazione. Stavo rifacendo i commenti delle attività in un flusso di lavoro di approvazione che sarà disponibile anche nell'e-mail. – SharePointError

Problemi correlati