2009-06-26 20 views
7

Dentro de un flujo de trabajo que deseo manejar y un error como no poder buscar un nombre de usuario al que desee asignarle una tarea. Entonces, el nombre de usuario no existe, voy a notificar a un administrador por correo electrónico de esto, iniciar sesión en el historial del flujo de trabajo y luego finalizar el flujo de trabajo.Cancelar mediante programación un flujo de trabajo de SharePoint

La pregunta es, ¿cómo termino el flujo de trabajo, desde dentro del flujo de trabajo como si estuviera haciendo clic en el botón 'finalizar el flujo de trabajo' en la página web de SharePoint.

[Actualización] He intentado SPWorkflowManager.CancelWorkflow() que cancela el flujo de trabajo pero no de inmediato. Lo que sucede es que el código cancela las ejecuciones, pero luego mi flujo de trabajo continúa para crear la siguiente tarea y luego se va a dormir cuando llega a las siguientes tareas en la actividad CambiosTask. Solo cuando se queda dormido, el flujo de trabajo finaliza, no cuando se llama a CancelWorkflow.

Esto causa el problema obvio de que no quiero que se cree la próxima tarea. Llamaré a CancelWorkflow porque quiero que se cancele en ese momento.

+0

¿Alguna vez encontró la respuesta a esta pregunta? –

+0

Afriad no. Puede marcarlo para cancelar el flujo de trabajo intermedio pero no detenerlo en ese momento. –

Respuesta

9

Hay bastantes sugerencias en este hilo de MSDN:

Terminating a SharePoint Workflow Programatically

Aquí es un blog-post que contiene sucintamente exactamente la misma información: Cancelling a SharePoint Workflow

último, y más específicamente , necesita utilizar el método estático: SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstanceToBeCancelled)

EDIT

CancelWorkflow es una clase estática, por lo que he modificado la llamada.

+0

Lo he intentado pero no ha resuelto mi problema. Actualicé la publicación principal para reflejar esto. –

+0

Si alguien más prueba SPWorkflowManager.CancelWorkflow(), es posible que no lo vea la primera vez. El método es estático, por lo que desea llamarlo a la clase en sí y no al objeto administrador de flujo de trabajo que se puede obtener de SPSite como lo intenté. –

+2

Pero funciona correctamente cuando lo llamas correctamente, ¿verdad? Es decir, cuando lo llamas a la clase en sí SPWorkflowManager.CancelWorkflow (SPWorkflow workflowInstance); entonces hace lo que se supone que debe hacer. – DevinB

0

No estoy seguro de si esta es la mejor manera, pero solo capto el error, lo registro y lo vuelvo a lanzar. Esto produce un estado "Error" en la lista e inmediatamente detiene el flujo de trabajo.

protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider) 
{ 
    try 
    { 
     // do work 
     // ... 
    } 
    catch (Exception e) 
    { 
     // log the error to the history list 
     // ... 
     throw; 
    } 

    return ActivityExecutionStatus.Closed; 
} 
0

Esto es bastante vieja pregunta, pero para cancelar el flujo de trabajo de la propia inmediato es fácil de utilizar este trozo de código:

SPWorkflowManager.CancelWorkflow(workflowProperties.Workflow); 
throw new Exception(); 

workflowProperties en este ejemplo es el método

public SPWorkflowActivationProperties workflowProperties = 
      new SPWorkflowActivationProperties(); 

CancelWorkflow marcará el flujo de trabajo como "cancelando", pero no lo detendrá hasta la pausa (como esperar el evento entaskchanged) o la excepción en el flujo de trabajo. Así que la siguiente declaración de throw new Exception() detendrá el flujo de trabajo y establecerá su estado "Cancelado".

Cuestiones relacionadas