De basis van Loops in Flows

Met loops in Flow Builder kun je veel interessante dingen doen, maar het kost misschien even wat tijd om te begrijpen wat wel en niet werkt. Laten we eerst even met de basis beginnen.

Er bestaan in Flow Builder enkelvoudige variabelen en verzamelingsvariabelen. Dat kan om records gaan, maar ook eenvoudigere variabelen zoals getallen en tekst kunnen in een verzameling worden gezet.

Om de flow iets te laten doen voor elke enkelvoudige variabele in zo’n verzameling, gebruik je een loop. Binnen de loop kun je dingen doen met één van de variabelen in de verzameling. Na die stappen, keer je terug naar het loop element om voor de volgende variabele uit de verzameling dezelfde stappen weer uit te voeren, tot de hele verzameling behandeld is.

Op deze manier klinkt het misschien wat abstract, dus laten we het aan de hand van voorbeelden uitleggen. Je hebt een Account die van naam verandert. Daarmee veranderen ook het website domein en email adressen van de medewerkers. Dit Account heeft 50 contacten, waar alleen het domein van het email adres maar aangepast hoeft te worden. Hiervoor gebruiken we in dit voorbeeld een flow met een loop.

Het begint meestal met een Get records element voor de verzameling waarvoor je de loop wilt uitvoeren, dus laten we die Contacten ophalen.

Hierna komt het loop element.

Binnen de loop moet voor elk Contact iets gebeuren. Get, Create, Update of Delete elementen gebruik je niet binnen loop. Het is niet alleen inefficiënt om dit soort acties 1 voor 1 uit te voeren, maar je veroorzaakt ook een risico dat je flow niet werkt, omdat in een flow transactie (die begonnen kan zijn vóór jouw flow en door kan gaan na jouw flow, door andere flows die erop reageren) maar maximaal 100 queries (informatie opvragen uit de database) en 150 DMLs (schrijven naar de database om records te maken, bewerken of verwijderen; DML staat voor Data Manipulation Language) mogen worden uitgevoerd. Dus die Contact records updaten moet op een andere manier.

Daarom werken we binnen de loop alleen met de gele elementen zoals Assignments, Decisions en Collection Filters. Het voorbeeld hier is eenvoudig, dus hebben we alleen twee assignments nodig.

In de eerste Assignment brengen we de wijziging aan op één van de Contacten

newEmail is hier een SUBSTITUTE formule waarin ik de oude domeinnaam vervang door de nieuwe. We hebben nu het emailadres op één van de Contacten aangepast in de Contact recordvariabele, maar er is nog niets gebeurd in de database.

Om de wijzigingen op te slaan hebben we een nieuwe record verzameling voor Contacten nodig. We kunnen niet de Get_Contacts collectie gebruiken. Die bevat namelijk alleen ongewijzigde Contacten.

Zou ik nu Get_Contacts gebruiken voor het Update Records element, dan zou er niets veranderen, want de Contact variabelen in die collectie, hebben nog precies dezelfde waarden als toen we ze ophaalden.

De gewijzigde Contacten toevoegen aan Get_Contacts, zal een foutmelding geven. We voegen dan namelijk een record met dezelfde record Id toe als een record dat al in de verzameling voorkomt. Dat betekent twee verschillende opdrachten om hetzelfde record te updaten binnen één opdracht voor de database.

Daarom voeg je het gewijzigde Contact toe aan een nieuwe verzameling.

De Contact record collection variable om de update mee uit te voeren
De Assignment waarin je de gewijzigde enkelvoudige Contactveriabele aan de collection variable toevoegt

Dit gebeurt voor elk Contact. Als er in Get Contacts 5 contact records gevonden zijn, doet de loop zijn kunstje voor alle 5 de contacten en heb je een collectie van 5 contact records met andere email adressen dan de contacten in de oorspronkelijke collectie.

Deze updateContacts collectie gebruiken we na het laatste element van de loop en dus buiten de loop om in één opdracht alle vijf de Contacten te updaten.

De flow als geheel ziet er dan zo uit.

Uiteraard is dit maar de basis en is er veel meer interessants te leren over hoe je slim met loops werkt.