2011-10-13 23 views
19

Tengo un flujo de trabajo de aprobación de sharepoint 2010 reutilizable y estoy aprobando/rechazando el flujo de trabajo mediante el siguiente fragmento de código dentro de infopath formcode (2010).Sharepoint Aprobación del flujo de trabajo Aprobar/Rechazar el problema de comentarios cuando lo modifica por programació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; 

Tarea Alter método

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

Este código funciona bien, pero los comentarios de la tarea no está siendo alterada y no está incluido en el correo electrónico también. ¿Hay algo de malo con ht ["Comments"] que uso? No se altera en los comentarios de la tarea. Este es el flujo de trabajo de SharePoint 2010 y el formulario de información que estoy usando es también el 2010.

¿Alguien se enfrentó a un problema similar?

+0

Ese código definitivamente me ayudó en un proyecto realmente importante. Ahora voy a trabajar en los comentarios. Si encuentro algo útil, definitivamente te lo haré saber. ¡Gracias! – harsimranb

Respuesta

1

para añadir un comentario a una tarea cuando Aprobar/Rechazar ello, sólo tiene que utilizar la línea antes de AlterTask:

ht["ows_FieldName_Comments"] = comments; 

Después de que se haya aprobado la tarea, puede ver los comentarios en la Lista de historial de flujo de trabajo.

También puede obtener todos los comentarios consolidados a partir de una tarea con:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask); 

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

Buena suerte!

+0

Hola Gonçalo Leote, gracias por tu respuesta. eso es lo que esperaba y funciona bien, muchas gracias de nuevo! – SharePointError

2

Si necesita código solo para listas (no para DocLibs) puede usar la propiedad item.ModerationInformation.Status. Al igual que el del siguiente ejemplo:

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

Pero si quieres que lo haga por todos los tipos de lista, puede utilizar el método interno UpdateInternal, con los siguientes parámetros:

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

Puede utilizar ejemplos de esta ruso el blog Item ModerationInformation and SPListItem.UpdateInternal()

+0

Supongo que está hablando de los comentarios de moderación. Estaba refiriendo los comentarios de la tarea en un flujo de trabajo de aprobación que también estará disponible en el correo electrónico. – SharePointError

Cuestiones relacionadas