SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Doppelte Ausführung eines Workflows

Unbeantwortet Dieser Beitrag hat 14 Antworten

Ohne Rang
1714 Beiträge
C.Kaiser erstellt 14 Okt. 2009 17:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich teste gerade meinen Workflow auf potenzielle Fehler und stoße gerade auf einen, der mir Kopfzerbrechen bereitet, weil er ziemlich kritisch ist.

Zunächst einmal ist es eine VS2008 sequentieller Workflow. Grob gesagt geht es um einen Dokumenten-Genehmigungsworkflow in dem ich Aufgaben verteile und bearbeiten lasse.

Das Problem ist nun folgendes: Sobald ich den Workflow bei zwei Dokumenten gleichzeititg starte (was ja durchaus vorkommen soll) werden die beiden Tasks angelegt.
Bis hierher kein Problem. Nun kann ich aber nur bei einem Workflow die Aufgabe ändern und der Workflow läuft wie erwartet weiter (zweite Aufgabe wird angelegt, man kann diese bearbeiten usw.).

Bei dem zweiten Workflow kann ich zwar den Status (normaler Aufgabenlistenstatus) auf "Genehmigt" setzen, danach passiert aber nichts mehr. Sobald ich versuche den Status ein zweites Mal zu ändern, kommt die Fehlermeldung:

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

Jemand einen Hinweis was ich da falsch gemacht habe? Die beiden Aufgaben bekommen jeweils den gleichen Titel zugewiesen. Das könnte vielleicht ein Problem sein :| .

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 14 Okt. 2009 23:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich vermute eher, daß Du Dich beim Programmieren irgendwo mit statischen Methoden oder Eigenschaften verhauen hast. Die sind dann nicht mehr instanzgebunden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 08:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

hmmm ansich bin ich nach den HowTo Videos von www.sheltonblog.com und hab diese erweitert...

Eventuell liegts daran wie ich die benötigten Felder in der "OnWorkflowActivated" Methode befülle...

Mein SingleUser Feld "Freigeber":
if (WorkflowActivationProperties.Item["Freigeber"].ToString() != null)
 {
    //Fill User Login Names from SingleUser-Fields
   this.userValue = new SPFieldUserValue(WorkflowActivationProperties.Web, WorkflowActivationProperties.Item["Freigeber"].ToString());
   this.loginNameReleaser = userValue.User.LoginName.ToString();
}

Mein MultiUserFeld aus einer Collection...:
if (WorkflowActivationProperties.Item["Genehmiger"].ToString() != null)
{
   this.loginNames = WorkflowActivationProperties.Item["Genehmiger"] as IEnumerable<string>;

   //Fill User Login Names from MultiUser-Field
  this.fieldValues = new SPFieldUserValueCollection();
  this.fieldValues = WorkflowActivationProperties.Item["Genehmiger"] as SPFieldUserValueCollection;


  this.userValueApprover = new SPFieldUserValue(WorkflowActivationProperties.Web, fieldValues.ElementAt(0).ToString());
  this.loginNameFirstApprover = userValueApprover.User.LoginName.ToString();
  }

Irgendwo ein Fehler? Die Felder sind alle als "private" angelegt...

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 10:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

so...

ich nehme mal an das es in der "OnTaskChanged"-Methode ein Problem gibt. Laut Video wird das Status Feld geprüft, wenn sich was an der Aufgabe ändert. Dazu wird dieser Code genutzt

Guid statusFieldId = workflowProperties.TaskList.Fields["Status"].Id;
string taskStatus = onTaskChanged1_AfterProperties1.ExtendedProperties[statusFieldId].ToString();

Ich nehme an das der Workflow damit nicht klar kommt und sich verrennt, wenn zwei Workflows des gleichen Typs gestartet werden. Hat jemand eine Ahnung wie mand as dynamisch auf den jeweiligen task legen kann? Oder liege ich in meiner Vermutung daneben? ;)

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Okt. 2009 10:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bei Deinem eigentlichen Problem kann ich Dir auf die Schnelle leider nicht weiterhelfen, aber

[quote user="C.Kaiser"]if (WorkflowActivationProperties.Item["Freigeber"].ToString() != null)[/quote]

Hier rennst Du in einen Fehler, wenn das Feld "Freigeber" nicht ausgefüllt ist. Der Wert ist dann null und ToString() kann dann nicht aufgerufen werden. Lasse das ToString einfach weg.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 12:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das Feld ist ein Pflichtfeld, von daher ists nicht sooooo dramtisch :D

Der Fehler liegt wahrscheinlich wirklich an der Guid der Liste in der "OnTaskChanged"-Activity.

Selbst dieses Video (von dem ich am Anfagn abgeschaut habe) http://rshelton.com/archive/2007/10/29/how-to-video-creating-a-user-task-document-workflow-in.aspx wo einfach nur ein Task erzeugt wird, funktioniert nur, wenn ein Workflow läuft. Sobald ein zweiter der gleichen Art auf einem anderen Dokument dazukommt, wird der zweite Workflow Task nicht mehr überprüft.

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 15:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok Statusmeldung mit der Hoffnung auf einen Tipp :)

Es scheitert definitv an der Nebenläufigkeit des Workflows, d.h. ich kann beide Dokumente genehmigen und kopieren lassen, sofern nicht gerade ein zweiter Workflow des gleichen Typs läuft.
Muss ich eventuell die Workflow Objekte, nachdem ein Task genehmigt wurde aus dem Cache leeren oder sowas? Irgentwie muss das doch funktionieren...

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Okt. 2009 15:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Es gibt für jedes Element eine eigene Workflowinstanz. Diese Instanzen haben ihre eigene ID und laufen unabhängig voneinander. Zu instanzübergreifenden Nebeneffekten kann es nur durch statische Methoden oder durch Verwendung von nicht instanzspezifischen IDs kommen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 15:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, was heißt nicht Instanzspezifische ID? Ich weise dem ersten Tasks jedesmal ein TaskID zu die statisch ist (das muss ich ja machen um den Workflow überhaupt ans fliegen zu bekommen), daran wirds ja wohl nicht liegen :) ansonten verwende ich nur die Sachen die ich oben beschrieben habe :(

An dem Betanken der Felder kann es nicht liegen, das läuft ja ordentlich bis zum ersten Task, also kann der Fehler nur noch bei der "TaskChanged"-Aktivität liegen. Darauf springt der Debugger beim zweiten Task aber gar nicht mehr an...

Hin und wieder ist SharePoint Teufelszeug.... :(

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Okt. 2009 16:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="C.Kaiser"]Ich weise dem ersten Tasks jedesmal ein TaskID zu die statisch ist [/quote]

Genau das dürfte das Problem sein. Wenn Du hier eine statische Variable verwendest, dann ist die in allen Workflowinstanzen gleich und die Tasks sind dann nicht unterscheidbar.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 16:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja ich habs mal durch den Debuger gejagt und die TaskIDs sind gleich... Dann ists logisch das die sich nicht mögen.

Und nun kommt die Masterfrage: Wie kann ich denen denn eine dynamische TaskID zuweisen? Bisher halt immer über den GuidGenerator und in die TaskProperties geschrieben...

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Okt. 2009 16:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

System.Guid.NewGuid

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 16:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

habs jetzt erstmal so gelöst:
createPrimaryApprovalTask.TaskId = Guid.NewGuid();

noch nicht toll aber geht scheinbar...


Edit: Vielen Dank für deine Hilfe und Geduld mit mir Anfänger :)

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Okt. 2009 17:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Kein Problem. Allerdings hättest Du da auch früher draufkommen können. Ich habe Dich schon ziemlich weit oben auf das Problem mit den statischen Feldern hingewiesen ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 15 Okt. 2009 17:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich glaub das nennt man "Problemblindheit" :P

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de