none
Workflow wartet auf onWorkflowItemChanged-Event, aber Item kann nicht geändert werden RRS feed

  • Frage

  • Hallo zusammen,

    dies ist mein erster Post hier im Forum, also bitte ich um Nachsicht, falls ich gegen irgendwelche mir noch nicht bekannten Regeln verstoße. Über die Suche habe ich keine Antwort auf meine Frage finden können. Ich habe folgenden Anwendungsfall:

    Der Benutzer soll in einer Liste ein neues Element (einen Auftrag) erstellen können und hierbei verschiedene Daten erfassen (beauftragte Leistungen, Kostenstelle usw.). Vor dem Speichern kann er entscheiden, ob bereits alle nötigen Daten vorliegen und daraus ein PDF erzeugt und per Mail versandt werden soll. Falls nicht, erfolgt noch kein Versand, sondern die bislang eingegebenen Daten werden lediglich gespeichert. Zu einem späteren Zeitpunkt kann er die fehlenden Daten ergänzen und dann den Versand anstoßen.

    Irgendwann kommt dann eine Mail zurück, aus der hervorgeht, ob der Auftrag so abgerechnet werden kann. Falls nicht, müssen evtl. Daten geändert werden, und der Prozess beginnt wieder beim Versand wie oben. Falls die Genehmigung vorliegt, wird der Vorgang abgeschlossen.

    Mein Lösungsentwurf sieht wie folgt aus: Für den Auftrag habe ich einen eigenen SharePoint-Listen-Inhaltstyp erstellt. Den Prozess möchte ich über einen Zustandsautomaten-Workflow abbilden. Im initialen Zustand wird geprüft, ob die Checkbox "Fertig zum Versand" angehakt ist; wenn nicht, so erfolgt ein Übergang in den Zustand "Versendet". Andernfalls geht der Workflow zunächst in den Zustand "Erfasst". Dort soll bei jeder weiteren Änderung des Items geprüft werden, ob nun das Häkchen gesetzt ist; wenn nicht, passiert gar nichts, außer, dass die Änderungen gespeichert werden; ist es dann gesetzt, erfolgt der Versand der E-Mail, und der Zustand wechselt in "Versendet".

    Ich dachte, dass ich das lösen kann, indem ich im Erfasst-Zustand eine ereignisgesteuerte Aktivität einfüge, die auf "OnWorkflowItemChanged" reagiert. Was aber passiert, ist, dass mein Item im Zustand "Erfasst" hängenbleibt, und wenn ich versuche, es in der SharePoint-Liste zu editieren und den Haken zu setzen, erhalte ich beim Speichern folgende Fehlermeldung:

    "Diese Aufgabe ist zurzeit durch einen ausgeführten Workflow gesperrt und kann nicht bearbeitet werden."

    Wie kann ich das verhindern? Wenn ein Workflow auf das Ereignis "OnWorkflowItemChanged" reagieren soll, bleibt er ja grundsätzlich aktiv; wenn er dann eine exklusive Sperre auf das Item hält, auf dessen Änderung hin er weiterlaufen soll, würde das ja immer einen Deadlock erzeugen, das wäre also widersinnig. Mir ist daher nicht klar, wie ich die Fehlermeldung interpretieren soll, bzw. wie ich sie verhindere.

    In der Initialisierungsphase des Zustands "Erfasst" habe ich eine InitializeWorkflow-Aktivität eingefügt, die ein neues Korrelationstoken für den Zustand erzeugt. Ich habe im OnWorkflowItemChanged-Event sowohl versucht, dieses Token zu verwenden, als auch das WorkflowToken - beides hat nicht funktioniert. Die Rolle von Korrelationstokens ist mir noch nicht ganz klar.

    Kann mir jemand helfen? Danke schon mal fürs Lesen und Mitdenken bis hier. :)

    Freitag, 23. November 2018 10:37

Alle Antworten

  • Hi,
    erst einmal: die Regeln sind so weit formuliert, dass es wirklich schwer ist, dagegen zu verstoßen. Du hast nicht dagegen verstoßen und hast die Frage auch in einem passenden Forum gestellt.

    Zusätzlich solltest Du auch die Technologie benennen: 2010-Workflow, 2013-Workflow oder Nintex-Workflow.

    Ob der Workflow an einem Inhaltstyp oder direkt an der Liste bzw. Bibliothek hängt, ist für dieses Problem ohne Bedeutung. Ein besseres Design ist immer, mit Inhaltstypen zu arbeiten und daran die Workflows zu binden.

    Es ist schwierig, einen Workflow zu starten, wenn noch ein Workflow zum gleichen Element in Arbeit ist. Das solltest Du im Workflow durch entsprechende Abfragen berücksichtigen, d.h. nach Start prüfen und ggf. beenden. Das funktioniert, da Du nur lesend zugreifst. Zusätzlich solltest Du überlegen, ob Auschecken sinnvoll ist, da damit Änderungen blockiert werden. Von Bedeutung können auch Rechteänderungen sein. Der Workflow läuft unter dem Konto dessen, der ihn gestartet hat, d.h. der neu erfasst oder geändert hat. Wenn im Workflow Rechte geändert werden, kann der folgende Workflow u.U. in einen Fehler laufen.

    Bei der Nutzung eines Zustandsautomaten muss man sicherstellen, dass dieser auch mal wieder beendet wird.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Freitag, 23. November 2018 13:17
  • Hi,

    vielen Dank für deine Antwort. Ja, ich hätte erwähnen sollen, dass es um einen SharePoint 2010-Workflow geht, den ich mit Visual Studio 2010 entwickle.

    Wie ich den Workflow an den Inhaltstyp statt an die Liste binde, ist mir nicht klar.

    Aber zum eigentlichen Problem: Ich möchte keinen neuen Workflow starten. Der Workflow, den ich beschrieben habe, wird beim Erstellen eines neuen Elements in der Liste automatisch gestartet; zwischendurch soll er eben auf eine bestimmte Änderung am Listenelement reagieren (über OnWorkflowItemChanged und eine If-Bedingung) und dann weiterlaufen.

    Mir ist nicht klar, wie das OnWorkflowItemChanged-Event überhaupt funktionieren soll, wenn während der Laufzeit des Workflow gar keine Änderungen erlaubt sind. Muss ich das Element irgendwie explizit für Änderungen freigeben? Habe ich das OnWorkflowItemChanged-Element falsch konfiguriert?

    Gibt es irgendwo eine ausführliche Dokumentation aller SharePoint-Aktivitäten, die man im Visual Studio in der Toolbox findet, inkl. einer Erklärung sämtlicher relevanten Eigenschaften wie Korrelationstoken, Before- und AfterProperties usw.?

    Viele Grüße

    Freitag, 23. November 2018 14:11
  • Hi,
    wie bindest Du das OnWorkflowItemChanged-Ereignis ein und warum wartest Du nicht mit der WaitForActivity Action?

    In der Dokumentation (MSDN) ist eigentlich alles enthalten. Da es aber so viel ist, gibt es kein 1000-seitiges "Kochbuch".

    Mit der SPWorkflowAssociation.CreateListContentTypeAssociation Methode kann man in der Aktivierung einer WebsiteCollection Feature den Workflow binden. Üblicherweise macht man das in dem Projekt, welches auch den Workflow bereitstellt.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks



    Freitag, 23. November 2018 15:48
  • Eigentlich wollte ich ja Screenshots einfügen, aber das geht noch nicht, solange mein Account nicht überprüft wurde. Also muss ich es beschreiben.

    Im initialen Status wird am Ende über ein IfElse-Element entschieden, ob in den Status Versendet oder Erfasst gewechselt wird.

    Im Erfasst-Status wird nun in der Initialisierungsphase ein Eintrag ins Log geschrieben, und anschließend folgt eine InitializeWorkflow-Aktivität. In der nachfolgenden EventDriven-Aktivität steht als erstes ganz oben die OnWorkflowItemChanged-Aktivität, dann erfolgt wieder ein Log-Eintrag, dann eine IfElse-Unterscheidung. Wenn das Häkchen "Fertig zum Versenden" gesetzt wurde (und somit das entsprechende Boolean-Feld des Inhaltstyps auf "true" steht), erfolgt ein Statuswechsel in "Versendet"; andernfalls passiert gar nichts. Nach meinem Verständnis sollte der Workflow so im Status "Erfasst" bleiben und auf das nächste Event vom Typ WorkflowItemChanged lauschen.

    Eine WaitForActivity-Action finde ich nicht in der Toolbox.

    Sollte ich es mit CheckOutItem- und CheckInItem-Activities versuchen? Also vor dem OnWorkflowItemChanged das Item erstmal wieder einchecken?

    Edit: Hat sich erledigt, da Ein- und Auschecken nur bei Dokumentenbibliotheken funktioniert, nicht bei Listen.

    Danke schon einmal für deine Hilfe, und ein schönes Wochenende!


    • Bearbeitet Jay-Dev Montag, 26. November 2018 08:25
    Freitag, 23. November 2018 16:22
  • Hat jemand einen Tipp für mich, wie ich hier weiterkomme?
    Montag, 26. November 2018 11:53