2009-06-26 14 views
7

All'interno di un flusso di lavoro che desidero gestire e un errore come non essere in grado di cercare un nome utente a cui desidero assegnare un'attività. Quindi il nome utente non esiste, ho intenzione di avvisare un amministratore via e-mail di questo, registrarlo nella cronologia del flusso di lavoro e quindi terminare il flusso di lavoro.Annulla automaticamente un flusso di lavoro di SharePoint

La domanda è, come faccio a terminare il flusso di lavoro, dall'interno del flusso di lavoro come se stessi facendo clic sul pulsante "Termina flusso di lavoro" nella pagina Web di SharePoint.

[Aggiornamento] Ho provato SPWorkflowManager.CancelWorkflow() che annulla effettivamente il flusso di lavoro ma non immediatamente. Quello che succede è il codice da cancellare, ma poi il mio flusso di lavoro continua per creare l'attività successiva e poi va in stop quando si verificano le attività suTaskChanged successive. Solo una volta che è andato a dormire il flusso di lavoro viene terminato, non quando viene chiamato CancelWorkflow.

Ciò causa l'ovvio problema che non desidero che venga creata la prossima attività. Sto chiamando CancelWorkflow perché voglio cancellarlo allora e lì.

+0

Hai mai trovato la risposta a questa domanda? –

+0

Afriad no. Puoi contrassegnarlo per annullare metà del flusso di lavoro, ma non fermarlo lì e là. –

risposta

9

Ci sono alcuni suggerimenti in questo MSDN Discussione:

Terminating a SharePoint Workflow Programatically

Ecco un blog-post che contiene sinteticamente esattamente le stesse informazioni: Cancelling a SharePoint Workflow

Infine, e più specificamente , è necessario utilizzare il metodo statico: SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstanceToBeCancelled)

EDIT

CancelWorkflow è una classe statica, quindi ho modificato la chiamata.

+0

Ho provato questo ma non ha risolto il mio problema. Ho aggiornato il post principale per riflettere questo. –

+0

Se qualcun altro prova SPWorkflowManager.CancelWorkflow() potresti non vederlo per la prima volta. Il metodo è statico, quindi è necessario chiamarlo sulla classe stessa e non sull'oggetto del gestore del flusso di lavoro che può essere ottenuto dal SPSite come ho provato. –

+2

Ma funziona correttamente quando lo chiamate correttamente, giusto? Cioè, quando lo chiami sulla classe stessa SPWorkflowManager.CancelWorkflow (SPWorkflow workflowInstance); quindi fa quello che dovrebbe fare. – DevinB

0

Non sono sicuro che questo sia il modo migliore, ma prendo solo l'errore, lo registro e poi lo rilancio. Ciò provoca uno stato "Errore occorso" nell'elenco e interrompe immediatamente il flusso di lavoro.

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

    return ActivityExecutionStatus.Closed; 
} 
0

Questo è abbastanza vecchia questione, ma per cancellare il flusso di lavoro da sé subito è facile con questo pezzo di codice:

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

workflowProperties in questo esempio è il metodo

public SPWorkflowActivationProperties workflowProperties = 
      new SPWorkflowActivationProperties(); 

CancelWorkflow contrassegnerà il flusso di lavoro come "annullamento", ma non lo interromperà fino alla pausa (come in attesa dell'evento ontaskchanged) o all'eccezione nel flusso di lavoro. Quindi la prossima dichiarazione di lancio della nuova eccezione() interromperà il flusso di lavoro e imposterà lo stato "Annullato".

Problemi correlati