tutorial trabajo online office microsoft flujos flujo ejemplos ejemplo crear como aprobaciones aprobacion c# sharepoint-2010 sharepoint-workflow

c# - office - flujo de trabajo de aprobacion sharepoint online



Sharepoint Fuera de la caja Flujo de trabajo de aprobaciĆ³n Aprobar/Rechazar el problema de los comentarios al modificarlo mediante programaciĆ³n (2)

Tengo un flujo de trabajo de aprobación 2010 para uso compartido de SharePoint, y estoy programado para aprobar / rechazar el flujo de trabajo utilizando el siguiente fragmento de código dentro de infopath formcode (2010).

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;

Método de alterar la tarea

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 se modifican y tampoco se incluyen en el correo electrónico. ¿Hay algo malo con ht ["Comentarios"] que uso? No se está alterando en los comentarios de la tarea. Este es el flujo de trabajo de SharePoint 2010 y el formulario de información que estoy usando también es 2010.

¿Alguien enfrentó un problema similar?


Para agregar un comentario a una tarea cuando lo apruebe / rechace, solo necesita usar la línea antes de AlterTask:

ht["ows_FieldName_Comments"] = comments;

Una vez aprobada la tarea, puede ver los comentarios en la Lista de historial de flujo de trabajo.

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

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask); string consolidatedComments = extProperties["FieldName_ConsolidatedComments"].ToString();

¡Buena suerte!


Si necesita código solo para Listas (no para DocLibs) puede usar la propiedad item.ModerationInformation.Status . Como el 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 desea hacerlo para todos los tipos de lista, puede usar 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 usar ejemplos de este blog ruso Item ModerationInformation y SPListItem.UpdateInternal ()