Skip to main content
Skip table of contents

Workflow scripts

Concept

Een script is een stuk code dat complexer is dan een expressie. Scripts bieden het voordeel dat ze logica kunnen bevatten zoals loops, conditionele statements, validatieregels en functies. Scripts geven ook toegang tot de volledige Java-runtime (bijv. java.util.Collections, java.util.ArrayList), wat expressies niet kunnen. Ze worden gebruikt om meer geavanceerde bewerkingen uit te voeren die niet mogelijk zijn met eenvoudige workflow expressies.

Aan workflow scripts kleven ook een aantal nadelen:

  • De uitvoering van het script gebeurt volledig binnen de scope van het proces en dus ook synchroon met het proces. Er is geen mogelijkheid tot ontkoppeling en het risico bestaat dat de uitvoering van scripts de procesthread blokkeren met performantieproblemen tot gevolg.

  • Een script haalt potentieel gevoelige dossierdata op, en slaat deze op binnen de scope van het proces. Na afloop moet je dit ook weer gaan anonymiseren.

  • Workflow scripts zitten verwerkt in je BPMN-beschrijving en zijn daardoor erg moeilijk te testen en onderhouden.

Van zodra je het gevoel hebt dat bovenstaande nadelen beginnen op te spelen, kun je maar beter gebruik maken van extensies.

Script opstellen

Scripts kunnen geschreven worden in JavaScript. Opgelet: vanaf platform versie 24.0.X maken we gebruik van de GraalJS engine. Voorheen was dat de Nashorn engine. Zie deze release note. Wie toch nog gebruik wil maken van de Nashorn engine kan dit instellen binnen de applicatie eigenschappen.

Script integreren in de workflow

Een script integreren in de workflow kan op verschillende manieren. Hieronder enkele voor de hand liggende werkwijzes.

  • Via een script task. Dit is een expliciet BPMN-element.

  • Bij het definiëren van een outputparameter voor een taak.

  • Via een listener op eender welk BPMN-element. Dit kan zowel een execution listener als een task listener zijn.

Telkens moet je het type script (bijvoorbeeld JavaScript) als verplichte parameter meegeven. Indien niet, wordt het script als string gezien en dus niet uitgevoerd.

Script voorbeelden

Eenvoudige voorbeelden

Bedrag afronden op twee decimalen

Een berekend bedrag (bv. het resultaat van een deling) wordt afgerond op twee decimalen, zoals gebruikelijk bij geldbedragen.

CODE
// Procesvariabele ophalen
var bedrag = execution.getVariable("berekendBedrag");

// Afronden op 2 decimalen
var afgerondBedrag = Math.round(bedrag * 100) / 100;

// Resultaat wegschrijven naar procesvariabele
execution.setVariable("afgerondBedrag", afgerondBedrag);

Leeftijd berekenen op basis van geboortedatum

Op basis van een geboortedatum (als string, zoals die uit een Skryv-formulierveld komt) wordt de huidige leeftijd berekend.

CODE
// Geboortedatum ophalen (verwacht formaat: "YYYY-MM-DD" of "YYYY-MM-DDTHH:mm:ss")
var geboortedatumRaw = execution.getVariable("geboortedatum");

// Datumstring inkorten tot "YYYY-MM-DD" en omzetten naar JavaScript Date
var geboortedatum = new Date(geboortedatumRaw.toString().substring(0, 10));
var vandaag = new Date();

// Leeftijd berekenen
var leeftijd = vandaag.getFullYear() - geboortedatum.getFullYear();

// Controleren of de verjaardag dit jaar al geweest is
var verjaardag = new Date(vandaag.getFullYear(), geboortedatum.getMonth(), geboortedatum.getDate());
if (vandaag < verjaardag) {
    leeftijd--;
}

// Resultaat wegschrijven naar procesvariabele
execution.setVariable("leeftijd", leeftijd);

Getal binnen bereik valideren

Een ingevoerd getal (bv. een aangevraagd aantal) wordt gecontroleerd of het binnen een toegelaten bereik valt. Zo niet, wordt een BPMN-error gegooid die je kan opvangen via een error event in de workflow.

CODE
// Procesvariabele ophalen
var aantalAangevraagd = execution.getVariable("aantalAangevraagd");

var minimum = 1;
var maximum = 100;

// Validatie: getal moet binnen het bereik liggen
if (aantalAangevraagd < minimum || aantalAangevraagd > maximum) {
    throw new org.camunda.bpm.engine.delegate.BpmnError(
        "AANTAL_BUITEN_BEREIK",
        "Het aangevraagde aantal (" + aantalAangevraagd + ") ligt buiten het toegelaten bereik van " + minimum + " tot " + maximum + "."
    );
}

// Resultaat bevestigen als procesvariabele
execution.setVariable("aantalGevalideerd", aantalAangevraagd);

Getal check indien even of oneven

Eenvoudig script dat checkt of een getal even dan wel oneven is.

CODE
var getal = execution.getVariable("getal");
var rest = getal % 2;
execution.setVariable("isEven", rest == 0);

Tekst formatteren zodat elk woord begint met hoofdletter

We vragen naar een volledige naam. Hierbij moeten we het scenario opvangen dat mensen de tradionele casing regels niet respecteren. Zo moet “jan de grote” omgezet worden naar “Jan De Grote”; “MARIE VAN DEN BERGH” naar “Marie Van Den Bergh”; of “luc DE smedt” naar “Luc De Smedt”.

CODE
// Procesvariabele ophalen
var tekst = execution.getVariable("tekst"); // bv. "jan de grote"

// Elk woord met hoofdletter laten beginnen (title case)
var geformatteerd = tekst
  .toLowerCase()
  .split(" ")
  .map(function(woord) {
    return woord.substring(0, 1).toUpperCase() + woord.substring(1);
  })
  .join(" ");

// Resultaat wegschrijven naar procesvariabele
execution.setVariable("tekstGeformatteerd", geformatteerd);

Het script werkt in drie stappen via method chaining:

  1. .toLowerCase() — zet de volledige string eerst om naar kleine letters, zodat ook bestaande hoofdletters correct behandeld worden

  2. .split(" ") — knipt de string op in een array van losse woorden

  3. .map(...) — loopt over elk woord en plakt de eerste letter (.substring(0,1).toUpperCase()) samen met de rest (.substring(1))

  4. .join(" ") — lijmt de woorden terug samen met spaties

Tekst omzetten naar hoofdletters

Een ingevoerde naam of waarde wordt omgezet naar hoofdletters, bijvoorbeeld voor gebruik in een officieel document of referentiecode.

CODE
// Procesvariabele ophalen
var tekst = execution.getVariable("organisatieNaam");

// Omzetten naar hoofdletters
var tekstHoofdletters = tekst.toUpperCase();

// Resultaat wegschrijven naar procesvariabele
execution.setVariable("organisatieNaamHoofdletters", tekstHoofdletters);

Unieke referentiecode aanmaken

Een unieke referentiecode wordt samengesteld op basis van een dossiernummer en de huidige datum, bijvoorbeeld voor gebruik als kenmerk in briefwisseling.

CODE
// Procesvariabele ophalen
var dossiernummer = execution.getVariable("dossiernummer");

// Huidige datum opmaken als "YYYYMMDD"
var vandaag = new Date();
var jaar = vandaag.getFullYear();
var maand = String(vandaag.getMonth() + 1).padStart(2, "0");
var dag = String(vandaag.getDate()).padStart(2, "0");
var datumString = jaar + maand + dag;

// Referentiecode samenstellen
var referentiecode = "DOS-" + dossiernummer + "-" + datumString;

// Resultaat wegschrijven naar procesvariabele
execution.setVariable("referentiecode", referentiecode);

Verschil tussen twee datums bepalen

Input variabelen zijn twee datums.

CODE
{
  "datumA":"2026-01-01",
  "datumB":"2023-01-01"
}

De twee waarden ("2026-01-01" en "2023-01-01") zijn strings. Het script zet ze om naar LocalDate en berekent het verschil via ChronoUnit.DAYS.

CODE
// Datumstrings ophalen als procesvariabele
var datumAStr = execution.getVariable("datumA"); // "2026-01-01"
var datumBStr = execution.getVariable("datumB"); // "2023-01-01"

// Omzetten naar LocalDate (Java)
var datumA = java.time.LocalDate.parse(datumAStr);
var datumB = java.time.LocalDate.parse(datumBStr);

// Verschil berekenen in aantal dagen (altijd positief via Math.abs)
var verschilDagen = Math.abs(
  java.time.temporal.ChronoUnit.DAYS.between(datumA, datumB)
);

// Resultaat wegschrijven als procesvariabele
execution.setVariable("verschilDagen", verschilDagen);

Wil je het verschil in andere eenheden? Dan wissel je DAYS simpelweg uit.

Eenheid

Code

Dagen

ChronoUnit.DAYS.between(datumB, datumA)

Weken

ChronoUnit.WEEKS.between(datumB, datumA)

Maanden

ChronoUnit.MONTHS.between(datumB, datumA)

Jaren

ChronoUnit.YEARS.between(datumB, datumA)

Vierkantswortel berekenen

Eenvoudig JavaScript script dat een getal (bv. 81) neemt en de vierkantswortel (bv. 9) teruggeeft.

CODE
// Procesvariabele 'getal' ophalen en toewijzen aan script variabele 'number'
var number = execution.getVariable("getal");

// Vierkantswortel nemen en resultaat toewijzen aan script variabele 'sqrtValue'
var sqrtValue = Math.sqrt(number);

// Script variabele 'sqrtValue' wegschrijven naar procesvariabele 'vierkantsWortel'
execution.setVariable("vierkantsWortel", sqrtValue);

Volledige naam samenstellen

Een voornaam en achternaam uit twee afzonderlijke procesvariabelen worden samengevoegd tot één nieuwe variabele.

CODE
// Procesvariabelen ophalen
var voornaam = execution.getVariable("voornaam");
var achternaam = execution.getVariable("achternaam");

// Samenvoegen met een spatie
var volledigeNaam = voornaam + " " + achternaam;

// Resultaat wegschrijven naar procesvariabele
execution.setVariable("volledigeNaam", volledigeNaam);

Omgaan met lijsten, maps en lijst-maps

Via workflow expressies zijn de mogelijkheden hier erg beperkt. Vandaar dat JavaScript scripts de betere manier zijn om deze complexere structuren te manipuleren binnen de context van de workflow.

Extra eigenschap toevoegen aan alle entries in een lijst-map

Een lijst-map die je opbouwt binnen de context van een formulier kan je als variabele vrijgeven in het proces, en daar via een script gaan bewerken. Hier willen we voor elke entry een extra eigenschap toevoegen (extraKey en extraValue).

CODE
// Procesvariabele 'mijnFormulierLijst' ophalen en toewijzen aan variabele 'myList'
var myList = execution.getVariable("mijnFormulierLijst");  

// Nieuwe lijst aanmaken
var newList = new java.util.ArrayList();  // Initialize a new ArrayList

// Iteraten over de originele lijst
for (var i = 0; i < myList.size(); i++) {
    var item = myList.get(i);  // Elke map in de oorspronkelijke lijst ophalen
    
    // Kopie maken van de huidig opgehaalde map
    var newItem = new java.util.LinkedHashMap(item);  // Kopie maken
    
    // Nieuwe entry (key-value) toevoegen aan de gekopieerde map, "extraValue" is hier een hard-coded string.
    newItem.put("extraKey", "extraValue");
    
    // Gekopieerde en gemanipuleerde map toevoegen aan de nieuwe lijst
    newList.add(newItem);
}

// Nieuwe lijst wegschrijven naar procesvariabele 'mijnNieuweFormulierLijst'
execution.setVariable("mijnNieuweFormulierLijst", newList);

Gegevens valideren met foutafhandeling, logging en tijdelijke variabelen

Een lijst van subsidieaanvragen wordt verwerkt. Per aanvraag berekenen we een tussentijds bedrag (opgeslagen als transient variable zodat het niet wordt gepersisteerd), loggen we de voortgang, en vangen we onverwachte fouten netjes op. Bij een overschrijding van het maximumbedrag gooien we een BPMN-error.

CODE
// Logger initialiseren — org.slf4j.LoggerFactory is beschikbaar in de Camunda engine context.
// De logberichten verschijnen in de applicatielogs en zijn nuttig bij troubleshooting.
var logger = org.slf4j.LoggerFactory.getLogger("workflow.subsidieValidatie");

// Lijst met aanvragen ophalen
var aanvragen = execution.getVariable("subsidieAanvragen");

if (aanvragen == null) {
    logger.warn("Procesvariabele 'subsidieAanvragen' is null. Script wordt overgeslagen.");
    execution.setVariable("totaalSubsidiebedrag", 0);
} else {
    var totaal = 0;

    try {
        for (var i = 0; i < aanvragen.size(); i++) {
            var aanvraag = aanvragen.get(i);
            var bedrag = aanvraag.get("bedrag");

            if (bedrag == null) {
                // Ontbrekend bedrag loggen en entry overslaan
                logger.warn("Aanvraag op index {} heeft geen 'bedrag'. Entry wordt overgeslagen.", i);
                continue;
            }

            // Tussentijds bedrag opslaan als transient variable.
            // Transient variables worden NIET gepersisteerd in de database en
            // zijn enkel beschikbaar binnen de huidige executiestap.
            // Nuttig voor gevoelige tussenresultaten of performantie-optimalisatie.
            execution.setVariableTransient("huidigBedrag", bedrag);

            logger.info("Aanvraag {}: bedrag = {}", i, bedrag);

            totaal += bedrag;
        }

        logger.info("Validatie afgerond. Totaal subsidiebedrag: {}", totaal);

        // Validatie: totaal mag niet hoger zijn dan 5000
        if (totaal > 5000) {
            logger.warn("Totaal {} overschrijdt de limiet van 5000. BPMN-error wordt gegooid.", totaal);
            throw new org.camunda.bpm.engine.delegate.BpmnError(
                "TE_HOOG_SUBSIDIEBEDRAG",
                "Totaal subsidiebedrag overschrijdt de limiet van 5000 euro."
            );
        }

        // Definitief totaal persisteren als gewone procesvariabele
        execution.setVariable("totaalSubsidiebedrag", totaal);

    } catch (e) {
        // Onverwachte (niet-BPMN) fouten opvangen en loggen.
        // De fout wordt opnieuw gegooid zodat de engine de instantie
        // als mislukt markeert en zichtbaar is in de Camunda cockpit.
        if (e instanceof org.camunda.bpm.engine.delegate.BpmnError) {
            throw e; // BpmnError altijd doorsturen — deze wordt afgehandeld via een error event
        }
        logger.error("Onverwachte fout tijdens verwerking van subsidieAanvragen: {}", e.message);
        throw e;
    }
}

Itereren over entries in een lijst-map

Een lijst-map die je opbouwt binnen de context van een formulier kan je als variabele vrijgeven in het proces, en daar via een script gaan bewerken. Hier willen we itereren over elke entry en bijvoorbeeld het gemiddelde nemen van de getalwaarde binnen het specifieke key-value pair “leeftijd”.

CODE
// Haal de inputlijst op (met null-check)
var lijst = execution.getVariable("personenLijst");

if (lijst == null) {
    execution.setVariable("gemiddeldeLeeftijd", 0);
} else {
    var totaalLeeftijd = 0;
    var aantalMetLeeftijd = 0;
    var aantal = lijst.size();

    // Itereer over elke persoon in de lijst
    for (var i = 0; i < aantal; i++) {
        var persoon = lijst.get(i);
        var leeftijdWaarde = persoon.get("leeftijd");

        // Enkel optellen als de waarde aanwezig en numeriek is
        if (leeftijdWaarde != null) {
            totaalLeeftijd += leeftijdWaarde;
            aantalMetLeeftijd++;
        }
    }

    // Bereken het gemiddelde op basis van entries mét leeftijd
    var gemiddelde = aantalMetLeeftijd > 0 ? totaalLeeftijd / aantalMetLeeftijd : 0;

    // Sla het resultaat op als procesvariabele
    execution.setVariable("gemiddeldeLeeftijd", gemiddelde);
}

Summary per item in een lijst-map

Gegeven een lijst-map waarbij elk item informatie bevat over een specifieke opleiding.

CODE
[
  { "naam": "java programmeren", "niveau": "gevorderd", "jaar": 2024 },
  { "naam": "projectmanagement", "niveau": "basis", "jaar": 2023 }
]

Onderstaand script geeft per item een summary.

CODE
// Lijst ophalen uit procesvariabele
var opleidingen = execution.getVariable("opleidingen");

// Hulpfunctie: title case
function titleCase(str) {
  return str
    .toLowerCase()
    .split(" ")
    .map(function(woord) {
      return woord.substring(0, 1).toUpperCase() + woord.substring(1);
    })
    .join(" ");
}

// Nieuwe lijst aanmaken
var verrijkteLijst = new java.util.ArrayList();

// Itereren over elk item
for (var i = 0; i < opleidingen.size(); i++) {
  var item = opleidingen.get(i);

  // Velden ophalen
  var naam   = item.get("naam")   ? item.get("naam")   : "Onbekend";
  var niveau = item.get("niveau") ? item.get("niveau") : "";
  var jaar   = item.get("jaar")   ? item.get("jaar")   : "";

  // Titel samenstellen
  // Resultaat bv.: "Java Programmeren — Gevorderd (2024)"
  var titel = titleCase(naam)
    .concat(" \u2014 ")
    .concat(titleCase(niveau))
    .concat(" (")
    .concat(jaar.toString())
    .concat(")");

  // Kopie van item maken en titel toevoegen
  var verrijktItem = new java.util.LinkedHashMap(item);
  verrijktItem.put("titel", titel);

  verrijkteLijst.add(verrijktItem);
}

// Resultaat wegschrijven
execution.setVariable("opleidingenVerrijkt", verrijkteLijst);

In de nieuwe lijst is er nu per item het extra veld “titel”.

CODE
[
  {
    "naam": "java programmeren",
    "niveau": "gevorderd",
    "jaar": 2024,
    "titel": "Java Programmeren — Gevorderd (2024)"
  },
  {
    "naam": "projectmanagement",
    "niveau": "basis",
    "jaar": 2023,
    "titel": "Projectmanagement — Basis (2023)"
  }
]

Twee lijsten samenvoegen en sorteren

Twee groepen personen — opgebouwd als lijst-map in twee afzonderlijke variabelen “personenLijst1” en “personenLijst2” — worden samengevoegd tot één nieuwe lijst “samengevoegdeLijst”, alfabetisch gesorteerd op de eigenschap "naam".

CODE
// Originele lijst-maps ophalen
var lijst1 = execution.getVariable("personenLijst1");
var lijst2 = execution.getVariable("personenLijst2");

// Nieuwe lege lijst aanmaken
var samengevoegd = new java.util.ArrayList();

// Inhoud kopiëren (niet verwijzen naar de originelen)
if (lijst1 != null) samengevoegd.addAll(lijst1);
if (lijst2 != null) samengevoegd.addAll(lijst2);

// Alfabetisch sorteren op eigenschap "naam" (A > Z, hoofdletterongevoelig)
java.util.Collections.sort(samengevoegd, function(a, b) {
    var naamA = a.get("naam");
    var naamB = b.get("naam");

    // Entries zonder "naam" naar het einde verplaatsen
    if (naamA == null && naamB == null) return 0;
    if (naamA == null) return 1;
    if (naamB == null) return -1;

    return naamA.compareToIgnoreCase(naamB);
});

// Resultaat opslaan als procesvariabele
execution.setVariable("samengevoegdeLijst", samengevoegd);

Twee lijst-maps samenvoegen, sorteren, totaal berekenen, validatie op totaal

Een lijst-map die je opbouwt binnen de context van een formulier kan je als variabele vrijgeven in het proces, en daar via een script gaan bewerken. Hier voegen we twee lijst-maps samen tot één nieuwe lijst-map, sorteren we alfabetisch op de eigenschap “naam”, berekenen we het totaal van waardes onder de eigenschap “subsidiebedrag” en stellen we een validatieregel in die zegt dat het totaal niet hoger mag zijn dan 5000. Indien hoger dan 5000, creëren we een BPMN-error die je vervolgens kan opvangen via een error event in de workflow.

CODE
// Haal de twee lijst-maps op
var lijst1 = execution.getVariable("mijnLijstMap1");
var lijst2 = execution.getVariable("mijnLijstMap2");

// Maak een nieuwe lijst aan (kopie, geen verwijzing)
var gecombineerdeLijst = new java.util.ArrayList();
if (lijst1 != null) gecombineerdeLijst.addAll(lijst1);
if (lijst2 != null) gecombineerdeLijst.addAll(lijst2);

// Initialiseer totaalbedrag
var totaal = 0;

// Itereer en tel subsidiebedragen op
for (var i = 0; i < gecombineerdeLijst.size(); i++) {
    var item = gecombineerdeLijst.get(i);
    if (item.containsKey("subsidiebedrag")) {
        var bedrag = item.get("subsidiebedrag");
        if (bedrag != null) {
            totaal += bedrag;
        }
    }
}

// Validatie eerst: totaal mag niet hoger zijn dan 5000.
// De sortering gebeurt pas ná de validatie: bij een fout wordt de
// BpmnError gegooid vóór verdere verwerking, wat performanter is.
if (totaal > 5000) {
    throw new org.camunda.bpm.engine.delegate.BpmnError(
        "TE_HOOG_SUBSIDIEBEDRAG",
        "Totaal subsidiebedrag overschrijdt de limiet van 5000 euro."
    );
}

// Sortering op naam (A > Z, hoofdletterongevoelig)
// Gebruik anonymous function als comparator — GraalJS-compatibele aanpak.
// Vermijd new java.util.Comparator({compare: ...}), dat is Nashorn-specifiek.
java.util.Collections.sort(gecombineerdeLijst, function(a, b) {
    var naamA = a.get("naam");
    var naamB = b.get("naam");

    // Entries zonder "naam" naar het einde verplaatsen
    if (naamA == null && naamB == null) return 0;
    if (naamA == null) return 1;
    if (naamB == null) return -1;

    return naamA.compareToIgnoreCase(naamB);
});

// Zet resultaten als procesvariabelen
execution.setVariable("gecombineerdeLijstGesorteerd", gecombineerdeLijst);
execution.setVariable("totaalSubsidiebedrag", totaal);

XML-formattering

Onderstaande voorbeelden tonen hoe scripts ingebouwd zitten in BPMN-definities.

Voorbeeld 1

Via een script task.

CODE
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_10ft502" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
  <bpmn:process id="mijnWorkflow" name="Mijn workflow" isExecutable="true">
    <bpmn:extensionElements>
      <camunda:properties>
        <camunda:property name="description" value="" />
      </camunda:properties>
    </bpmn:extensionElements>
    <bpmn:startEvent id="StartEvent_1" name="Opgestart via backoffice">
      <bpmn:outgoing>Flow_0mwmxok</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:endEvent id="Event_1lxig2d" name="Dossier afgerond">
      <bpmn:incoming>Flow_1gufcbm</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0mwmxok" sourceRef="StartEvent_1" targetRef="Activity_1bc4jmp" />
    <bpmn:sequenceFlow id="Flow_1gufcbm" sourceRef="Activity_1bc4jmp" targetRef="Event_1lxig2d" />
    <bpmn:scriptTask id="Activity_1bc4jmp" name="Voer dit script uit" scriptFormat="JavaScript">
      <bpmn:extensionElements>
        <camunda:inputOutput>
          <camunda:inputParameter name="getal">${5}</camunda:inputParameter>
        </camunda:inputOutput>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_0mwmxok</bpmn:incoming>
      <bpmn:outgoing>Flow_1gufcbm</bpmn:outgoing>
      <bpmn:script>// Procesvariabele 'getal' ophalen en toewijzen aan script variabele 'number'
var number = execution.getVariable("getal");

// Vierkantswortel nemen en resultaat toewijzen aan script variabele 'sqrtValue'
var sqrtValue = Math.sqrt(number);

// Script variabele 'sqrtValue' wegschrijven naar procesvariabele 'vierkantsWortel'
execution.setVariable("vierkantsWortel", sqrtValue);</bpmn:script>
    </bpmn:scriptTask>
  </bpmn:process>
  <bpmn:message id="Message_1ocn301" name="mijnWorkflowViaFO" />
  <bpmn:escalation id="Escalation_15nluny" name="Escalation_1v7t1ot" escalationCode="100" />
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mijnWorkflow">
      <bpmndi:BPMNEdge id="Flow_1gufcbm_di" bpmnElement="Flow_1gufcbm">
        <di:waypoint x="70" y="97" />
        <di:waypoint x="152" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0mwmxok_di" bpmnElement="Flow_0mwmxok">
        <di:waypoint x="-112" y="97" />
        <di:waypoint x="-30" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="-148" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="-163" y="122" width="66" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1lxig2d_di" bpmnElement="Event_1lxig2d">
        <dc:Bounds x="152" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="128" y="122" width="85" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1z0wvgs_di" bpmnElement="Activity_1bc4jmp">
        <dc:Bounds x="-30" y="57" width="100" height="80" />
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Voorbeeld 2

Via een listener.

CODE
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_10ft502" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
  <bpmn:process id="mijnWorkflow" name="Mijn workflow" isExecutable="true">
    <bpmn:extensionElements>
      <camunda:properties>
        <camunda:property name="description" value="" />
      </camunda:properties>
    </bpmn:extensionElements>
    <bpmn:startEvent id="StartEvent_1" name="Opgestart via backoffice">
      <bpmn:outgoing>Flow_0mwmxok</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:endEvent id="Event_1lxig2d" name="Dossier afgerond">
      <bpmn:incoming>Flow_1oz6hfl</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0mwmxok" sourceRef="StartEvent_1" targetRef="Activity_1bc4jmp" />
    <bpmn:sequenceFlow id="Flow_1gufcbm" sourceRef="Activity_1bc4jmp" targetRef="Event_13dfh8a" />
    <bpmn:sequenceFlow id="Flow_1oz6hfl" sourceRef="Activity_03ezwkt" targetRef="Event_1lxig2d" />
    <bpmn:manualTask id="Activity_03ezwkt" name="Manual task 2">
      <bpmn:incoming>Flow_06lgz26</bpmn:incoming>
      <bpmn:outgoing>Flow_1oz6hfl</bpmn:outgoing>
    </bpmn:manualTask>
    <bpmn:intermediateThrowEvent id="Event_13dfh8a" name="Eerste stap uitgevoerd">
      <bpmn:extensionElements>
        <camunda:executionListener event="start">
          <camunda:script scriptFormat="JavaScript">// Procesvariabele 'getal' ophalen en toewijzen aan script variabele 'number'
var number = execution.getVariable("getal");

// Vierkantswortel nemen en resultaat toewijzen aan script variabele 'sqrtValue'
var sqrtValue = Math.sqrt(number);

// Script variabele 'sqrtValue' wegschrijven naar procesvariabele 'vierkantsWortel'
execution.setVariable("vierkantsWortel", sqrtValue);</camunda:script>
        </camunda:executionListener>
        <camunda:inputOutput>
          <camunda:inputParameter name="getal">${25}</camunda:inputParameter>
        </camunda:inputOutput>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_1gufcbm</bpmn:incoming>
      <bpmn:outgoing>Flow_06lgz26</bpmn:outgoing>
    </bpmn:intermediateThrowEvent>
    <bpmn:sequenceFlow id="Flow_06lgz26" sourceRef="Event_13dfh8a" targetRef="Activity_03ezwkt" />
    <bpmn:manualTask id="Activity_1bc4jmp" name="Manual task 1">
      <bpmn:incoming>Flow_0mwmxok</bpmn:incoming>
      <bpmn:outgoing>Flow_1gufcbm</bpmn:outgoing>
    </bpmn:manualTask>
  </bpmn:process>
  <bpmn:message id="Message_1ocn301" name="mijnWorkflowViaFO" />
  <bpmn:escalation id="Escalation_15nluny" name="Escalation_1v7t1ot" escalationCode="100" />
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mijnWorkflow">
      <bpmndi:BPMNEdge id="Flow_1gufcbm_di" bpmnElement="Flow_1gufcbm">
        <di:waypoint x="-100" y="97" />
        <di:waypoint x="-18" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1oz6hfl_di" bpmnElement="Flow_1oz6hfl">
        <di:waypoint x="230" y="97" />
        <di:waypoint x="322" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0mwmxok_di" bpmnElement="Flow_0mwmxok">
        <di:waypoint x="-282" y="97" />
        <di:waypoint x="-200" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_06lgz26_di" bpmnElement="Flow_06lgz26">
        <di:waypoint x="18" y="97" />
        <di:waypoint x="130" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Event_1lxig2d_di" bpmnElement="Event_1lxig2d">
        <dc:Bounds x="322" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="298" y="122" width="85" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_0t124o4_di" bpmnElement="Activity_03ezwkt">
        <dc:Bounds x="130" y="57" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="-318" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="-333" y="122" width="66" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_13dfh8a_di" bpmnElement="Event_13dfh8a">
        <dc:Bounds x="-18" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="-26" y="122" width="56" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1lnp5th_di" bpmnElement="Activity_1bc4jmp">
        <dc:Bounds x="-200" y="57" width="100" height="80" />
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Voorbeeld 3

Via een output parameter. Opgelet: hier werken we niet met de expressie execution.setVariable(). De laatste regel in het script herhaalt de waarde die in de outputparameter geïnjecteerd wordt (in dit geval sqrtValue).

CODE
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_10ft502" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
  <bpmn:process id="mijnWorkflow" name="Mijn workflow" isExecutable="true">
    <bpmn:extensionElements>
      <camunda:properties>
        <camunda:property name="description" value="" />
      </camunda:properties>
    </bpmn:extensionElements>
    <bpmn:startEvent id="StartEvent_1" name="Opgestart via backoffice">
      <bpmn:outgoing>Flow_0mwmxok</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:endEvent id="Event_1lxig2d" name="Dossier afgerond">
      <bpmn:incoming>Flow_1oz6hfl</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0mwmxok" sourceRef="StartEvent_1" targetRef="Activity_1bc4jmp" />
    <bpmn:sequenceFlow id="Flow_1gufcbm" sourceRef="Activity_1bc4jmp" targetRef="Activity_03ezwkt" />
    <bpmn:sequenceFlow id="Flow_1oz6hfl" sourceRef="Activity_03ezwkt" targetRef="Event_1lxig2d" />
    <bpmn:manualTask id="Activity_03ezwkt" name="Manual task 2">
      <bpmn:extensionElements>
        <camunda:inputOutput>
          <camunda:inputParameter name="getal">${100}</camunda:inputParameter>
          <camunda:outputParameter name="vierkantsWortel">
            <camunda:script scriptFormat="javascript">// Procesvariabele 'getal' ophalen en toewijzen aan script variabele 'number'
var number = execution.getVariable("getal");

// Vierkantswortel nemen en resultaat toewijzen aan script variabele 'sqrtValue'
var sqrtValue = Math.sqrt(number);
sqrtValue;</camunda:script>
          </camunda:outputParameter>
        </camunda:inputOutput>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_1gufcbm</bpmn:incoming>
      <bpmn:outgoing>Flow_1oz6hfl</bpmn:outgoing>
    </bpmn:manualTask>
    <bpmn:manualTask id="Activity_1bc4jmp" name="Manual task 1">
      <bpmn:incoming>Flow_0mwmxok</bpmn:incoming>
      <bpmn:outgoing>Flow_1gufcbm</bpmn:outgoing>
    </bpmn:manualTask>
  </bpmn:process>
  <bpmn:message id="Message_1ocn301" name="mijnWorkflowViaFO" />
  <bpmn:escalation id="Escalation_15nluny" name="Escalation_1v7t1ot" escalationCode="100" />
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mijnWorkflow">
      <bpmndi:BPMNEdge id="Flow_1gufcbm_di" bpmnElement="Flow_1gufcbm">
        <di:waypoint x="-100" y="97" />
        <di:waypoint x="-20" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1oz6hfl_di" bpmnElement="Flow_1oz6hfl">
        <di:waypoint x="80" y="97" />
        <di:waypoint x="172" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0mwmxok_di" bpmnElement="Flow_0mwmxok">
        <di:waypoint x="-282" y="97" />
        <di:waypoint x="-200" y="97" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="-318" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="-333" y="122" width="66" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1lnp5th_di" bpmnElement="Activity_1bc4jmp">
        <dc:Bounds x="-200" y="57" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_0t124o4_di" bpmnElement="Activity_03ezwkt">
        <dc:Bounds x="-20" y="57" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1lxig2d_di" bpmnElement="Event_1lxig2d">
        <dc:Bounds x="172" y="79" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="148" y="122" width="85" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.