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.
' 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 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?
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.
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.
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.
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?
'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.
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):
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?
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?