He creado un flujo de trabajo en SharePoint Designer y lo asocié con una lista. El flujo de trabajo crea un proceso de aprobación, por lo que SharePoint crea una tarea en la lista de Tareas para que el usuario pueda aprobarla o rechazarla.Aprobar una tarea de flujo de trabajo de SharePoint utilizando SharePoint Web Services/Object Model
Lo que tengo que hacer es aprobar o rechazar la tarea sin abrir la tarea en la lista de tareas. Después de algunas investigaciones, calculé que puedo usar los servicios web de SharePoint. Sin embargo, me siento perdido ya que no sé qué servicio, p. Lists.asmx, y qué método, p. UpdateListItems, para llamar.
¿Alguien me puede guiar por lo siguiente:
1- ¿Es factible aprobar una tarea de flujo de trabajo de SharePoint Web Services?
2- ¿Puede mostrarme un ejemplo de cómo aprobar una tarea, p. qué servicio y método llamar y cuáles deberían ser los parámetros?
actualización
He estado usando el siguiente código XML para establecer el flujo de trabajo para completar: elemento de la lista
batchElement.InnerXml = "<Method ID='1' Cmd='Update'>" // Also used Moderate
+ "<Field Name='ID'>115</Field>"
+ "<Field Name='Status'>Completed</Field>"
+ "<Field Name='FormData'>Completed</Field>" // Also used Approved
+ "<Field Name='WorkflowOutcome'>Approved</Field>"
+ "<Field Name='Completed'>True</Field>"
+ "<Field Name='PercentComplete'>1</Field>"
+ "<Field Name='_ModerationStatus'>0</Field>"
+ "</Method>";
La tarea se actualiza pero el WorkflowOutcome permanece vacío y el flujo de trabajo no se mueve a la próximo paso.
¿Qué más me estoy perdiendo?
Actualización # 2
Estoy sospechando los ExtendedProperties del elemento de la lista de tareas. Para un elemento que se completó utilizando la interfaz de usuario, ExtendedProperties muestra ws_TaskStatus = 'Aprobado'. Sin embargo, para un artículo que fue aprobado usando el código ws_TaskStatus no existe.
Actualización # 3
Desde un puesto de MSDN, me dijeron utilizar el Workflow.asmx en lugar de la Lists.asmx.
He utilizado el siguiente código:
WorkflowService.Workflow listProxy = new WorkflowService.Workflow();
listProxy.Url = "http://<server_name>/_vti_bin/workflow.asmx";
listProxy.UseDefaultCredentials = true;
int todoID = 118;
Guid tasklistID = new Guid("{79ABFDE7-0398-4AD7-918A-0D40204E7726}");
string itemURL = "http://<server_name>/TestLibrary/volshext.log";
XmlDocument taskData = new XmlDocument();
taskData.Load(@"..\..\TaskData.xml");
try
{
XmlNode response = listProxy.AlterToDo(itemURL, todoID, tasklistID, taskData.DocumentElement);
Console.WriteLine(response.InnerText);
}
El XML que estoy utilizando para aprobar la tarea es
<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD" >
<my:TaskStatus>#</my:TaskStatus>
<my:Comments />
<my:DelegateTo />
<my:NewDescription>Please approve Workflow Demo</my:NewDescription>
<my:NewDueDate />
<my:RequestTo />
<my:Decline>0</my:Decline>
<my:dcr>0</my:dcr>
<my:Status>Completed</my:Status>
</my:myFields>
Pero de nuevo se actualiza la tarea, pero el flujo de trabajo no se movió hacia adelante.
Actualización # 4
he hecho un último ensayo con el modelo de objetos de servidor de SharePoint sin embargo, de nuevo, la tarea se actualiza pero el flujo de trabajo no se está moviendo hacia adelante.
Aquí está mi código:
SPSite site = new SPSite("http://sitenamehere/");
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Shared Documents"];
//SPListItem item = list.GetItemById(18);
SPListItem item = list.GetItemByUniqueId(new Guid("5300d16e-94f8-4338-8206-4a57ab7c369b"));
SPWorkflow workflow = item.Workflows[0];
SPWorkflowTask task = workflow.Tasks[0];
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]);
//ht["TaskStatus"] = "#";
//ht["ows_TaskStatus"] = "Approved";
//ht["FormData"] = SPWorkflowStatus.Completed;
//ht["Outcome"] = "Approved";
//task.ModerationInformation.Status = SPModerationStatusType.Approved;
web.AllowUnsafeUpdates = true;
SPWorkflowTask.AlterTask((task as SPListItem), ht, true);
}
+1 para los enlaces útiles –