Workflows aus einen laufenden Workflow heraus starten

Aus einer Kundenanfrage und einem sehr nützlichen Hinweisen von Paavo (Vielen Dank nach Berlin) habe ich dieses Codebeispiel zusammengebaut.

Mit der Methode StartProcess kann man innerhalb eines Server-Events weitere Workflows starten.

Wichtig, die weiteren Workflows haben als Creator einen technischen Benutzer. Daher sollte dieser bei Bedarf als Variable mitgegeben werden und dann der ActivityPerformer z.B. so gesetzt werden.

thisProcess.SetActivityPerformer thisProcess.CurrentActivity.Activityid, wfvariables.StartBenutzer.Value

Beispiel

' Parameter:
'   -> WFName (String): Name des Workflows
'
'   -> InputVariables (Scripting.Dictionary): Dict der zu übergebenen Parameter. 
'
'		Beispiel:
' 			Dim InputVariables: Set InputVariables = CreateObject("Scripting.Dictionary")
'			InputVariables.Add "VariablenName", "VariablenWert"
'
'   -> InputFiles (Array(Scripting.Dictionary)): Array aus Dict. Dict muss die Schlüssel id, typeId, inWorkspace, location (1 = Objekt bereits zugeordnet 2 = Objekt liegt in der WF-Ablage )
' 
'   	Beispiel:
'			Dim Doc: Set Doc = CreateObject("Scripting.Dictionary")
'			Doc.Add "id", 12345
'			Doc.Add "typeId", 262148
'			Doc.Add "inWorkspace", True
'			Doc.Add "location", 1
'		InputFiles = Array(Doc)

Function StartProcess(WfName, InputVariables, InputFiles)
	Dim Models: Set Models = wfsystem.getactiveworkflowmodels 
	For i = 0 To Models.Count - 1 
		Dim Model: Set Model = Models.Item(i) 
		
		' Suche nach WF Model
		If model.name = WfName then 
			' Setze Variablen 
			Dim Variables: Set Variables = Model.InputVariables 
			
			For Each VarName In InputVariables.Keys()
				Variables.item(VarName).value = InputVariables(VarName)
			Next
			
			' Setze Objekte in der Workflow Akte
	    	Dim Files: Set Files = Model.File 

			For Each CurFile In InputFiles
				Files.AddFileObject CurFile("id"),CurFile("typeId"), CurFile("inWorkspace"), CurFile("location")
			Next
			
	  		'Starte Prozess   
			StartProcess = Model.StartProcess(Files, Variables) 
			Exit Function
		 end if 
 	  Next
 	  
 	  ' Workflow nicht gefunden
 	  Err.Raise 1, "Workflowmodel " & WfName & " nicht gefunden"	  
End Function

Function Main
	If wfvariables.ElternProzess.Value = "" Then
	
		Dim InputVariables: Set InputVariables = CreateObject("Scripting.Dictionary")
		InputVariables.Add "ElternProzess", thisprocess.ProcessId
		InputVariables.Add "StartBenutzer", thisprocess.Creator
		
		Dim Doc: Set Doc = CreateObject("Scripting.Dictionary")
		Doc.Add "id", thisprocess.WFFile.FileObjects.Item(0).Id
		Doc.Add "typeId", thisprocess.WFFile.FileObjects.Item(0).ObjectType
		Doc.Add "inWorkspace", True
		Doc.Add "location", 1
		
		InputFiles = Array(Doc)
	
		StartProcess "Subprozess", InputVariables, InputFiles
		
		wfvariables.StartBenutzer.Value = thisprocess.Creator
		
	End If
End Function

Main

Ich hoffe das Beispiel hilft weiter.

Hallo,

ich möchte diese Funktion gerade bei einem unserer Workflows in der EndActivity einer bestimmten Aktivität einbauen, damit im Hintergrund ein anderer Workflow gestartet wird.

Jedoch gibt es ein Problem mit der Übergabe der InputVariables. Ich habe die gleichen Variablen benutzt wie in dem Beispiel und diese als Variablen im Quell- und Ziel Workflow eingerichtet.

Es kommt folgende Fehlermeldung:

Beim Parsen des Skriptes ist ein Fehler (0x80070057) aufgetreten (Zeile 52, Zeichen 3):
Quelle: oxjobwfm.ComDataFields.1
Beschreibung: Falscher Parameter.

Zeile: not available

Ich habe schon einiges ausprobiert aber hat nichts geholfen. Hat jemand vielleicht noch Ideen, an was es liegen könnte?

Grüße

Hallo @Dave, wäre es möglich, die Zeile 52 und ggf. etwas Umland hier zu posten oder ist das aus Datenschutz/-Eigentumsrechten schlecht?

Taucht der Fehler auch im Enterprise Manager bei der Job-Überwachung auf oder bleibt dieser dort unsichtbar (was ich annehme)?

Hallo @rk und danke für die schnelle Antwort.

Hier ist das Skript der ganzen EndActivity. Wenn eine bestimmte Option ausgewählt wird, soll der Workflow im Hintergrund gestartet werden:

If wfvariables.iantragsauswahl.Value = antrag_benutzer then 
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_end_sdurchfuehrung
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Benutzer wurde vom Antragsteller gewählt - IT-Benutzeranträge wird im Hintergrund gestartet"

Function StartProcess(WfName, InputVariables, InputFiles)
	Dim Models: Set Models = wfsystem.getactiveworkflowmodels 
	For i = 0 To Models.Count - 1 
		Dim Model: Set Model = Models.Item(i) 
		
		' Suche nach WF Model
		If model.name = WfName then 
			' Setze Variablen 
			Dim Variables: Set Variables = Model.InputVariables 
			
			For Each key In InputVariables.Keys()
				Variables.item(key).value = InputVariables(key)
			Next
			
			' Setze Objekte in der Workflow Akte
	    	Dim Files: Set Files = Model.File 
			
	  		'Starte Prozess   
			StartProcess = Model.StartProcess(Files, Variables) 
			Exit Function
		 end if 
 	  Next
 	  
 	  ' Workflow nicht gefunden
 	  Err.Raise 1, "Workflowmodel " & WfName & " nicht gefunden"	  
End Function

Function Main
	'If wfvariables.ElternProzess.Value = "" Then
	
		Dim InputVariables: Set InputVariables = CreateObject("Scripting.Dictionary")
		InputVariables.Add "ElternProzess", thisprocess.ProcessId
		InputVariables.Add "StartBenutzer", thisprocess.Creator
		
		InputFiles = 0
	
		StartProcess "IT-Benutzeranträge 2.0", InputVariables, InputFiles
		
		wfvariables.StartBenutzer.Value = thisprocess.Creator
		
	'End If
End Function

Main

elseif wfvariables.iantragsauswahl.Value = antrag_verzeichnisberechtigung then 
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_antragstellen
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Verzeichnisberechtigung wurde vom Antragsteller gewählt"
elseif wfvariables.iantragsauswahl.Value = antrag_inetantrag then
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_inetantrag
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Internetfreigabe wurde vom Antragsteller gewählt"
end if

Die betroffene Zeile laut Fehler ist diese:

For Each key In InputVariables.Keys()

In der Job Überwachung habe ich keinen Fehler gefunden.

Kann es sein, dass da etwas durcheinander gekommen ist und der Block „zerrissen“ ist:

If wfvariables.iantragsauswahl.Value = antrag_benutzer then 
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_end_sdurchfuehrung
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Benutzer wurde vom Antragsteller gewählt - IT-Benutzeranträge wird im Hintergrund gestartet"
elseif wfvariables.iantragsauswahl.Value = antrag_verzeichnisberechtigung then 
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_antragstellen
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Verzeichnisberechtigung wurde vom Antragsteller gewählt"
elseif wfvariables.iantragsauswahl.Value = antrag_inetantrag then
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_inetantrag
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Internetfreigabe wurde vom Antragsteller gewählt"
end if

Auf jeden Fall wirken die Zeilen 4 und 49 auf mich so, als würden da If-Blöcke falsch geschlossen/geöffnet:

Ich habe die Functions jetzt mal ausgelagert und nochmals kontrolliert:

If wfvariables.iantragsauswahl.Value = antrag_benutzer then
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_end_sdurchfuehrung
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Benutzer wurde vom Antragsteller gewählt - IT-Benutzeranträge wird im Hintergrund gestartet"
	Main
elseif wfvariables.iantragsauswahl.Value = antrag_verzeichnisberechtigung then 
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_antragstellen
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Verzeichnisberechtigung wurde vom Antragsteller gewählt"
elseif wfvariables.iantragsauswahl.Value = antrag_inetantrag then
	wfvariables.inaechsteAktivitaet.Value = Aktivitaet_inetantrag
	AddProtocolItem wfvariables.santragsteller.Value, "Antrag für Internetfreigabe wurde vom Antragsteller gewählt"
end if

Allerdings ist der Fehler der gleiche geblieben. Selbst wenn ich die Inputvariables nicht in ein Dictionary schreibe, sondern direkt angebe, bringt er denselben Fehler.

Grüße

Ich habe gerade nochmal die Job Überwachung nebenher laufen lassen. So wie es aussieht, existieren die Parameter und haben auch Werte:

image

Da das ursprüngliche Event (ohne es im Editor selbst getestet zu haben) syntaktisch eine Fehlermeldung hätte melden sollte, überrascht mich das. Die Syntaxprüfung ist mit der Stelle bzw. dem ganzen Event glücklich, oder?

Eventuell löst der Aufruf einen weiteren Event aus, aber das ist ohne mehr Kontext vermutlich nicht zu sagen.

Guten Morgen,

zum Test habe ich einen neuen Workflow erstellt, der nur eine Aktivität besitzt. In der EndActivity dieser Aktivität wird nur das oben genannte Script zum Starten eines neuen Prozesses ausgeführt. Syntaxprüfung passt auch. Leider immer noch der besagte Fehler.

Ich habe parallel ein Ticket bei OS aufgemacht, dort kam leider noch keine Rückmeldung.

@rk Ich bin etwas überrascht, aber man darf in VBS innerhalb von If Blöcken Funktionen definieren.

Ich habe dies kurz getestet.

If true Then
    Function Test()
        msgbox "Funktioniert"
    End Function
    Test
End If

In sofern ist es kein Syntax Problem.

Guten Morgen @Dave,

Kann es sein, dass der Fehler eigentlich im zu startenden Workflow IT-Benutzeranträge 2.0 passiert?

Können Sie prüfen ob alle Variablen die sie im Aufruf des StartProcess Aufrufs mitsenden im Prozess Workflow IT-Benutzeranträge 2.0 existieren und die Datentypen übereinstimmen?

Mfg Uli

Verrückt, habe ich noch nie gesehen, aber cool zu wissen. Danke auch an @Dave für die Info.

Hallo @uw ,

folgende Variablen sind in dem Quell- und Ziel Workflow mit dem gleichen Datentyp angelegt:
image

image

Und dann auch jeweils in den Anwendungen als Parameter hinterlegt und der entsprechenden Aktivität zugeordnet.

Quellworkflow:
image

Ziel Workflow:
image

@Dave Wie sieht der Code der StartActivity in Workflow IT-Benutzeranträge 2.0 aus?
Könnte dort der eigentliche Fehler auftreten?

Sehen Sie im Workflow Administrator gescheiterte Workflow IT-Benutzeranträge 2.0 Instanzen?

Das ist der Code in der StartActivity:

'Antragsart auswählen|StartActivity
Dim RCHelper: Set RCHelper = New RCHelperClass
Dim RC: Set RC = RunningContext
RCHelper.SetUsername TECHNICALUSER

'Prozessersteller bekommt die Aktivität
thisProcess.SetActivityPerformer thisProcess.CurrentActivity.Activityid, wfvariables.StartBenutzer.Value

'Vorbelegung
wfvariables.iAntragsart.Value = DEFAULT

Da passiert eigentlich nicht so viel, außer dass ich den Performer mit dem übergebenen Parameter setzen möchte.

Ich habe zum Test auch mal die Function zum Prozess starten ohne zu übergebene Parameter ausgeführt und da hat es funktioniert. Es hat eine Instanz des Workflows erstellt und gestartet (war sichtbar im Workflow Administrator), aber halt keinem Benutzer zugeordnet, da ich es nicht mitgeliefert habe.

Gescheiterte Instanzen des Workflows IT-Benutzeranträge 2.0 sehe ich nicht, es scheint so, dass er gar nicht so weit kommt.

Sind StartBenutzer und ElternProzess im Zielprozess nur als Eingabeparamter einer Anwendung hinterlegt oder auch als Eingabeparameter des Modells?

Hier ein Beispiel eines Workflows, den ich erfolgreich aus dem DMS mit Eingabeparametern starten kann (ein Start aus einem anderen Workflow habe ich noch nicht getestet):

image

3 „Gefällt mir“

Hallo @tordeu ,

danke für die Nachricht. Das war tatsächlich noch das Problem, ich hatte die Parameter für das Modell noch nicht hinterlegt.

Nachdem ich diese dort entsprechend eingefügt habe, hat es funktioniert.

Danke für die Unterstützung!

Grüße

2 „Gefällt mir“

Guten Morgen zusammen,

ich hätte nochmal eine Frage, welche dieses Thema streift, vielleicht kann mir ja jemand weiterhelfen.

Und zwar starte ich über ein Server-Event einen Workflow aus einem anderen Workflow heraus.

Als Ersteller wird dann automatisch ein Server User gesetzt (WF-System3). Der Nachteil ist natürlich jetzt, dass die Person, die den ursprünglichen Workflow gestartet hat, den Workflow nicht unter „Laufende Workflows“ sieht, da er nicht der Creator ist.

Jetzt wollte ich in dem Workflow den tatsächlichen Starter als Prozessverantwortlichen hinzufügen.

Allerdings kommt bei dem Versuch immer dieser Fehler:

Vor dem Hinzufügen des Prozessverantwortlichen möchte er die aktuellen immer auslesen und das Server-Objekt, das den Workflow erstellt hat, gibt es nicht. Dabei läuft er auf Fehler.

Hat zufällig jemand damit Erfahrung oder eventuell einen anderen Lösungsansatz für das Problem?

Viele Grüße
Dave

1 „Gefällt mir“

Hallo @Dave, ich finde vor allem die Meldung Das Objekt '000...000003' ist ... nicht vorhanden total überraschend, woher kommt den diese GUID (?) mit diesem sehr konkreten Wert 3?

Wie muss ich mir den Code vorstellen, wird da thisProcess.Creator direkt gesetzt?