Menü der Dokumentation

Arbeiten mit Prozessvariablen

In diesem Thema erfahren Sie, wie Sie Ihre Prozesse mithilfe von Variablen dynamisch erstellen.

Wissenswertes zu Prozessvariablen

Prozessvariablen sind Daten, die Informationen zu einer Prozessinstanz enthalten. Folgende Prozessvariablen sind in jeder Prozessinstanz vorhanden:

  • dv_initiator: Eine Prozessvariable vom Datentyp Identity. Die Prozessvariable verweist auf die Identität des Benutzers, der die Prozessinstanz gestartet hat.

  • dv_start_time: Eine Prozessvariable vom Datentyp String. Die Prozessvariable enthält den UTC-String des Zeitpunktes, in dem die Prozessinstanz aus Sicht der Anwendung gestartet wurde. Es gilt der Zeitpunkt, in dem die Anwendung beauftragt wurde, die Prozessinstanz zu starten. Da der eigentliche (technische) Start der Instanz asynchron durchgeführt wird, kann der in der Variable enthaltene Zeitpunkt möglicherweise abweichen.

Verwenden weiterer Prozessvariablen

Diese Variablen können Sie für spezielle Zwecke verwenden:

  • dv_sender: Eine Prozessvariable vom Datentyp Identity. Die Prozessvariable verweist auf die Identität des Benutzers, der als Absender von Benutzeraktivitäten verwendet wird.

  • dv_attachment: Eine Prozessvariable vom Datentyp DmsObject oder abweichend. Die Prozessvariable enthält eine Verknüpfung, die allen Benutzeraktivitäten als Anhang hinzugefügt wird.

  • dv_decision: Eine Prozessvariable vom Typ String. Dieser Text wird im Prozessprotokoll bei einer Aufgabe als Entscheidung hervorgehoben.

  • dv_comment: Eine Prozessvariable vom Typ String. Dieser Text wird im Prozessprotokoll bei einer Aufgabe als Kommentar hervorgehoben.

Warnung

Die Prozessvariable dv_attachment ist mit dem Datentyp DmsObject vordefiniert. Möchten Sie eine andere URI als die zu einem Objekt der DMS-App verwenden, müssen Sie den Wert des Datentyps auf String ändern.

Definieren von Prozessvariablen

Definieren Sie in der Prozessdefinition Variablen, die innerhalb eines Prozesses genutzt werden. Definierte Variablen können an den entsprechenden Schnittstellen der Anwendung automatisch validiert und ggf. konvertiert werden.

Innerhalb eines Prozesses können Sie folgende Variablen definieren:

  • Allgemeine Prozessvariable: Eine Variable, die im gesamten Prozess Gültigkeit hat. Sie können festlegen, ob es sich um eine Startvariable handelt.

  • Lokale Prozessvariable: Eine Variable, deren Gültigkeitsbereich auf eine einzelne Prozessaktivität beschränkt ist.

  • Servicevariablen: Ein- oder Ausgabevariablen eines Prozessservices.

Eine Variablendefinition beinhaltet folgende Informationen:

Eigenschaft

Mögliche Werte

Beispiel

Name

[A-Za-z][A-Za-z0-9_]*

myVariable (name-Eigenschaft)

Startvariable

myStartVariable* (name-Eigenschaft)

Datentyp

  • String

  • Number

  • Boolean

  • Identity

  • DmsObject

  • URL

  • Object

  • File

String (value-Eigenschaft)

Einzel- oder Mehrfachwert

Einzelwert: String (value-Eigenschaft)

Mehrfachwert: [String] (value-Eigenschaft)

Pflichtvariable

Einzelwert: String! (value-Eigenschaft)

Mehrfachwert: [String]! (value-Eigenschaft)

Anmerkung

Besonderheiten des Datentyps Object:

  • Sie können in einem Prozess nur eine Variable vom Typ Object definieren.

  • Eine Variable vom Typ Object darf keinen Mehrfachwert enthalten.

  • Variablen vom Typ Object werden nicht protokolliert.

Anmerkung

Besonderheiten des Datentyps File:

  • Eine Datei darf maximal 100 MB groß sein.

  • Die Gesamtgröße aller Dateien einer Prozessinstanz darf 500 MB nicht überschreiten.

  • Dateien werden nach Prozessende gelöscht.

  • Variablen vom Typ File werden nicht protokolliert.

Warnung

Beachten Sie beim Verwenden von Prozessvariablen folgende wichtige Hinweise:

  • Namenspräfix "dv_": Sie dürfen für Variablen das Namenspräfix dv_ nicht verwenden. Diese Variablen sind für interne Variablen reserviert. Sie dürfen das Namenspräfix dv_ lediglich beim Überschreiben der Variablendefinition dv_attachment verwenden.

  • Ändern von Variablendefinitionen beim Versionswechsel: Wenn Sie zwischen verschiedenen Versionen eines Prozesses den Datentypen einer Variablen ändern oder zwischen Einzelwert und Mehrfachwert wechseln, kann es nach der Migration zu Fehlern in der Prozessausführung kommen. Die Fehler treten auf, wenn bestehende Prozessinstanzen für die entsprechende Variable bereits Werte der bisherigen Definition beinhalten. Nach einer Migration in die neue Version verlieren diese Werte ihre Gültigkeit. Stellen Sie bei Änderungen der Variablendefinitionen immer sicher, dass keine zu migrierende Prozessinstanz betroffen ist.

Anmerkung

Sie können eine Variable, die als Pflichtvariable definiert ist, mit der Schnittstelle zum Ändern von Variablen nicht löschen. Handelt es sich bei der Pflichtvariable zusätzlich um eine Startvariable, muss ein Anwender beim Start einer Prozessinstanz immer einen gültigen Wert für die Variable übergeben. Wenn er keinen gültigen Wert übergibt, wird die Anfrage mit dem Fehlercode 400 abgelehnt.

Für den Datentypen Number gelten diese Einschränkungen:

Minimum

Maximum

Nachkommastellen

Genauigkeit

-1e16

1e16

5

15 Stellen

Die nicht-primitiven Datentypen verwenden die folgende Notation:

Datentyp

Notation

Identity 

Für Benutzer: identity:///identityprovider/scim/users/<someUserId>

Für Gruppen: identity:///identityprovider/scim/groups/<someGroupId>

DmsObject 

dmsObject:///dms/r/<repositoryId>/o2/<dmsObjectId>

URL 

https://www.d-velop.de (max. 2000 Zeichen) 

Object 

{ "myKey" : "myValue"} (JSON-String, max. 50 KB) 

File

Variablen vom Typ File können im BPMN nicht gesetzt werden. Dies ist nur über die API möglich.

Variablen werden als BPMN-Erweiterung in Form von Camunda-Properties definiert. Allgemeine Prozess- und Servicevariablen definieren Sie innerhalb des BPMN-Modells direkt im Prozessknoten. Lokale Prozessvariablen definieren Sie im Knoten der Aktivität, in der sie gültig sein sollen.

Allgemeine Prozess- und Servicevariablen 

 <process id="myProcess" name="Process with variable declaration" isExecutable="true">
    <extensionElements>
        <camunda:properties>
            <camunda:property name="variable:myVariable" value="[String]!" /> <!-- Name: "myVariable", Type: "String", Multiple: true, Mandatory: true, Startvariable: false -->
            <camunda:property name="variable:myStartVariable*" value="String" /> <!-- Name: "myStartVariable", Type: "String", Multiple: false, Mandatory: false, Startvariable: true-->
            <camunda:property name="variable:someUserTaskOutput" value="String" /> <!-- Name: "someUserTaskOutput", Type: "String", Multiple: false, Mandatory: false, Startvariable: false -->
            <camunda:property name="service:/myservice:in:input" value="String!" /> <!-- Name: "input", Type: "String", Multiple: false, Mandatory: true -->
            <camunda:property name="service:/myservice:out:output" value="Number!" /> <!-- Name: "output", Type: "Number", Multiple: false, Mandatory: true -->
        </camunda:properties>
    </extensionElements>
</userTask>

Lokale Prozessvariable 

<userTask id="userTask" name="User Task">
    <extensionElements>
        <camunda:inputOutput>
            <camunda:inputParameter name="someInput">user task input which is only available within this user task scope</camunda:inputParameter>
            <camunda:outputParameter name="someUserTaskOutput">user task output which will be written to process scope</camunda:outputParameter>
        </camunda:inputOutput>
        <camunda:properties>
            <camunda:property name="variable:someInput" value="String" />
        </camunda:properties>
    </extensionElements>
</userTask>
Verwenden von Prozessvariablen

Beim Modellieren eigener Prozesse können Sie Prozessvariablen verwenden, um dynamische Prozesse zu erstellen. Zum Einstieg in das Arbeiten mit Prozessvariablen ist es hilfreich, wenn Sie zunächst einen einfachen Prozess mit einer Benutzeraktivität erstellen. Dieser Prozess sieht beispielsweise so aus:

UUID-29a68643-6daa-4474-268b-46da5579f615.png

Das BPMN-Modell dieses beispielhaften Prozesses ist folgendermaßen aufgebaut. Zur Vereinfachung sind die grafischen Informationen zum BPMN-Diagramm in dieser BPMN-Beispieldatei nicht enthalten.

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" targetNamespace="" exporter="d.velop process modeler">
  <process id="GettingStarted" name="Beispiel: Einstieg" isExecutable="true">
    <startEvent id="start"/>
    <userTask id='task_hello_world' name='Hello World' camunda:candidateUsers="${variables.get('dv_initiator')}" />
    <sequenceFlow id="s1" sourceRef="start" targetRef="task_hello_world" />
        <sequenceFlow id="s2" sourceRef="task_hello_world" targetRef="end" />
    <endEvent id="end"/>        
  </process>  
</definitions>

Dieser Prozessdefinition fügen Sie nun eine neue Variablendefinition hinzu.

Hinzufügen einer Variablendefinition 

Um eine Prozessvariable verwenden zu können, müssen Sie diese der Prozessdefinition hinzufügen. In der Prozessdefinition fügen Sie die BPMN-Elemente extensionElements und camunda:properties zum BPMN-Element process hinzu. Zum Definieren der Prozessvariable fügen Sie dem BPMN-Element camunda:properties noch das Element camunda:property hinzu.

Dieses Beispiel zeigt, wie Sie die Variable message vom Datentyp String hinzufügen:

<process id="GettingStarted" name="Beispiel: Einstieg" isExecutable="true">
        <extensionElements>
      <camunda:properties>
        <camunda:property name="variable:message" value="String" />
      </camunda:properties>
    </extensionElements>
        ...
</process>

Erläuterung der Eigenschaften 

  • name: Die Eigenschaft definiert den Namen der Prozessvariable. Vor dem Wert steht immer das Präfix variable:.

  • value: Die Eigenschaft definiert den Datentypen der Prozessvariable.

Verwenden der Prozessvariable 

Sie können die Variable message nun für den Namen der Benutzeraktivität verwenden, damit dieser Name dem Anwender in der Aufgabenliste angezeigt wird. Hierzu ersetzen Sie den vorhandenen Text in der Eigenschaft name der Benutzeraktivität durch die Methode für den Zugriff auf die Variable message:

<process id="GettingStarted" name="Beispiel: Einstieg" isExecutable="true">
        ...
        <userTask id="task_hello_world" name="${variables.get('message')}" camunda:candidateUsers="${variables.get('dv_initiator')}" />
        ...

Sie können den Wert der Variablen nun zum Beispiel beim Start des Prozesses belegen.

Weitere Informationen zur Definition von Prozessvariablen finden Sie im Kapitel Definieren von Prozessvariablen.

Ermitteln von Prozessvariablen

Mit dem Objekt variables können Sie auf die Prozessvariablen zugreifen. Der Aufruf erfolgt jeweils in der Notation variables.<methodName>( <Parameter>).

Sie können die Methoden nicht auf Prozessvariablen vom Typ File anwenden.

get( String variableName) 

Die Methode ermittelt den Wert für die Variable mit dem eingegebenen Variablennamen. Bei Variablen mit einem Mehrfachwert werden die Werte in einer Liste (collection) zurückgegeben.

getDisplayValue( String variableName) 

Die Methode ermittelt den Wert für die Variable mit dem eingegebenen Variablennamen. Je nach Datentyp findet hierbei automatisch eine entsprechende Konvertierung statt.

Bei Variablen mit einem Mehrfachwert werden die konvertierten Werte in einem String mit Kommas getrennt zurückgegeben. Sind die Variablen vom Datentyp Number, werden die konvertierten Werte in einem String mit Semikolons getrennt zurückgegeben.

Datentyp

Tatsächlicher Wert

Rückgabewert

String

"some value"

"some value"

Number

1.23

"1.23"

Boolean

true

"true"

Identity

identity:///identityprovider/scim/users/userIdOfMaxMustermann

"Max Mustermann" (displayName-Eigenschaft des Benutzers,

name-Eigenschaft bei Gruppen im d.ecs identity provider)

DmsObject

dmsObject:///dms/r/someRepo/o2/T000000001

"/dms/r/someRepo/o2/T000000001"

Object

{"myKey":"myValue"}

"{\"myKey\":\"myValue\"}" (JSON-String)

getObjectValue( String variableName, String objectPath) 

Diese Methode kann nur für Variablen vom Typ Object verwendet werden. Sie ermöglicht es, auf einzelne Teile des Objekts zuzugreifen.

Beispiel:

Angenommen, es gibt eine Variable vom Typ Object mit dem Namen "myObjectVariable" und folgendem Wert:

{
  "my" : {
    "object" : {
      "path" : 123
    }
  }
}

Dann können mit der Methode getObjectValue z. B. die folgenden Teile des Objekts ermittelt werden:

Methodenaufruf

Rückgabewert

getObjectValue("myObjectVariable", "my.object.path")

123

getObjectValue("myObjectVariable", "my.object")

{"path":123}

Erzeugen von Mehrfachwerten

Mit dem Objekt collections können Sie aus Einzelwerten eine Liste (collection) erzeugen, z.B. um einer Variablen einen Mehrfachwert zuzuweisen. Das Erzeugen einer Liste aus Einzelwerten ist beispielsweise hilfreich, wenn Sie in einer Benutzeraktivität mehrere Empfänger als Konstante hinterlegen wollen.

Beispiel

${collections.from( "identity:///identityprovider/scim/users/user1", "identity:///identityprovider/scim/users/user")}

from( Object...objects)

Die Methode erzeugt eine Liste (collection) mit den übergebenen Einzelwerten.

Wissenswertes zum Geltungsbereich von Prozessvariablen

Prozessvariablen haben innerhalb einer Prozessinstanz immer einen bestimmten Geltungsbereich. Je nach Geltungsbereich sind lesende und schreibende Zugriffe möglich.

In jeder Prozessinstanz gibt es einen universellen Geltungsbereich, der den gesamten Prozess umfasst. Alle weiteren Geltungsbereiche, wie zum Beispiel Benutzer- oder Serviceaktivitäten, können lesend auf die Variablen im universellen Geltungsbereich zugreifen.

Zusätzliche Geltungsbereiche werden an folgenden Stellen erzeugt:

  • Verzweigungen mit parallelen Pfaden

  • Multi-Instanz-Konstrukte

  • Subprozesse

  • Input-/Output-Mapping oder Timer-Ereignis bei Benutzeraktivitäten

  • Serviceaktivitäten

Lesende Zugriffe 

Lesende Zugriffe auf Prozessvariablen (z.B. die Verwendung in einem Ausdruck) sind unabhängig vom Geltungsbereich möglich. Wird im aktuellen Geltungsbereich kein Wert gefunden, so wird der darüber liegende Bereich durchsucht, bis ein Wert gefunden wurde.

Schreibende Zugriffe 

Wenn Sie Werte ändern möchten (z.B. in einer Benutzeraktivität mit Output-Mapping), so wird der Wert immer zunächst in den aktuellen Geltungsbereich der Aktivität übernommen. Andere Geltungsbereiche, z.B. entlang anderer Zweige im Prozess, werden dadurch bis zum Ende dieses Geltungsbereiches nicht beeinflusst. Erst am Ende des aktuellen Wertebereichs werden die Änderungen auch in alle anderen Geltungsbereiche übernommen.

Beginn von Geltungsbereichen nach Verzweigungen mit parallelen Pfaden 

Wenn ein Prozesspfad durch eine Verzweigung mit mehreren aktiven Ausgängen geteilt wird (parallele oder inklusive Verzweigung), erhält jeder ausgehende Pfad einen eigenen Geltungsbereich. Standardmäßig übernimmt nur der erste Ausgang die lokalen Variablen aus dem Geltungsbereich des eingehenden Pfads. Dieses Verhalten kann je nach Komplexität der Parallelität des Prozesses zu unerwarteten lokalen Variablen in den entsprechenden Geltungsbereichen führen. Aufgrund der Abwärtskompatibilität muss dieses Verhalten jedoch von d.velop process standardmäßig fortgeführt werden.

Damit bei den entsprechenden Verzweigungen alle aktiven Ausgänge immer auch die lokalen Variablen aus dem Geltungsbereich des eingehenden Pfades enthalten, können Sie die Einstellungen direkt für die Verzweigung festlegen. Fügen Sie der Verzweigung ein Element vom Typ camunda:property mit dem Namen gateway:keepLocalVariables und dem Wert true hinzu.

...
<bpmn:parallelGateway id="myGateway">
  <bpmn:extensionElements>
    <camunda:properties>
      <camunda:property name="gateway:keepLocalVariables" value="true" />
    </camunda:properties>
  </bpmn:extensionElements>
  <bpmn:incoming>...</bpmn:incoming>
  <bpmn:outgoing>...</bpmn:outgoing>
  <bpmn:outgoing>...</bpmn:outgoing>
  ...
</bpmn:parallelGateway>
...

Ende von Geltungsbereichen 

Am Ende eines Geltungsbereichs (z.B. bei der Zusammenführung paralleler Zweige oder am Ende eines Subprozesses) werden die Variablen dieses Geltungsbereichs verworfen. Um Variablen in einen darüber liegenden Geltungsbereich zu übernehmen, müssen Sie ein Output-Mapping konfigurieren. Dabei wird die Aufrufhierarchie vom aktuellen Element ausgehend so lange nach oben durchlaufen, bis ein Geltungsbereich gefunden wird, in dem diese Variable bereits existiert. In diesen wird der neue Wert dann übernommen. Für den Fall, dass es sich um eine komplett neue Variable handelt, wird diese dann in den Geltungsbereich des Gesamtprozesses geschrieben.

Warnung

Bitte beachten Sie, dass ein Timer-Ereignis bei Benutzeraktivitäten einen eigenen Geltungsbereich erzeugt. Wenn Sie kein dediziertes Input-/Output-Mapping für die Benutzeraktivität definieren, werden bei Abschluss der Aktivität alle Variablen dieses Geltungsbereiches in den höheren Geltungsbereich übernommen.

Auswirkungen in der Prozessüberwachung 

Bei der Ansicht eines Tokens werden immer die Variablen des aktuellen Geltungsbereichs angezeigt. Änderungen an den Variablen werden nur in diesen Geltungsbereich übernommen.

Die meisten Tokens besitzen einen eigenen Geltungsbereich. Die einzige Ausnahme bilden Benutzeraktivitäten, für die kein Input-/Output-Mapping konfiguriert wurde und die nicht parallel zu anderen Aktivitäten ausgeführt werden. Diese Tokens besitzen denselben Geltungsbereich wie das direkt darüber liegende Token.

In der Ansicht des Tokens ohne eigenen Geltungsbereich finden Sie eine Verknüpfung zum Token aus dem darüber liegenden Bereich. Wenn Sie diese Verknüpfung auswählen, können Sie die Variablen des verknüpften Geltungsbereichs anzeigen.