Automatisch datum berekenen in Mendix.
Hoe kan je automatisch een datum laten berekenen door je Mendix applicatie, terwijl deze datum nog niet in de database staat?
Als eerste waarom staat deze datum dan niet in de database? Nou als je een nieuwe entry maakt in je database zoals het invoeren van een nieuw boek wat iemand kan lenen is deze entry nog niet ge-commit in de database, kortom niet opgeslagen.
Dus moet de berekening gebeuren in memory van de applicatie en als iemand het invulveld van de start datum verlaat. Binnen Mendix heet dit een Event..
Wat zijn Events?
Je hebt verschillende Events zoals de On change event, dit betekend dat je een actie wilt starten als het veld veranderd. Dan is er de On enter event, dit houdt in dat als iemand het veld “binnenkomt” zowel met de ‘tab’ als via de muis. Dit is dus een potentiële optie voor ons om de berekening uit te voeren maar wat zou hier het probleem kunnen zijn denk je?
Wat als iemand de startdatum niet invult en meteen met de muis naar de einddatum gaat? Nu zal de berekening uitgevoerd gaan worden maar resulteert in de error omdat er geen startdatum is ingevuld. Dus dit is niet onze beste optie.
Dan is er nog de On leave event. Dus als het startdatumveld is geactiveerd en wordt verlaten dan moet onze actie uitgevoerd worden. Dit kan nog steeds in een error eindigen als iemand geen start datum invult maar waarom zou die iemand dan dat veld activeren en anders kunnen we dit met een error bericht prima afhandelen.
Oke we hebben besloten dat de On leave event voor deze use case de beste optie is. Wat kunnen we dan allemaal doen met dit event?
- Do nothing (default)
- Show a page
- Call a microflow
- Call a nanoflow
- Open link
- Create object
- Save changes
- Cancel changes
- Close page
- Delete (object)
- Synchronize
- Sign out
- Call workflow
- Show user task page
- Show workflow admin page
- Complete user task
Dit is de lijst met actie, wat deze precies inhouden kan je hier lezen in de Mendix docs. Wij zijn nu geïnteresseerd in call a microflow of call a nanoflow. Het verschil tussen een microflow en nanoflow gaan we nu niet uitdiepen maar in de basis kan je uitgaan van het volgende, een nanoflow heeft geen verbinding met de database en een microflow wel. Uiteraard kan je microflows maken die geen verbinding naar de database opzetten maar dat gaat het nu even niet om.
Doel van deze nanoflow?
Wat we willen bereiken, in dit voorbeeld, is als het geel gearceerde veld invult is en het veld wordt “verlaten” middels de ‘tab’ of muisklik dan moet er een event getriggerd worden. Dit doen we door de propertjes van het veld te openen en dat op het tabblad Events te klikken.
Hier zien we direct de 3 opties On change, On enter en On leave, we openen de dropdown van de On leave en selecteren hier call a nanoflow.
Hier kiezen we voor new zodat we deze nanoflow kunnen gaan aanmaken.
Als je de naming convention van Mendix volgt gaan we de nanoflow als volgt noemen
Mendix Naming Convention
OLE staat voor On Leave Event, micro- en nanoflows beginnen altijd met een prefix die de wijze van activeren aangeeft {PREFIX}_{Entity}_{Operation}. Onze nanoflow zou dus OLE_Document_CalculateReturnDate moeten heten volgens de naming convention van Mendix. In mijn voorbeeld heb ik het dus niet volgens de naming convention gedaan en heb ik de flow OLE_Calculate_ReturnDate genoemd.
Omdat we de nanoflow gemaakt hebben vanuit de invoerpagina van een document zal Mendix automatisch de Document parameter meegeven aan de nieuw te maken nanoflow. Als dit niet het geval is dat moet je deze even zelf toevoegen door het gele parameter logootje op je werkblad te slepen, dan via de properties kan je het object eraan koppelen in ons geval het document object.
Als je wilt weten wat die parameter nu precies doet dan kan je dit artikel ook eens lezen.
Bring the action.
Nu de vraag welke actie moet deze nanoflow gaan uitvoeren? Laten we eens afpellen wat we hier precies van plan waren te doen? We willen dat iets in de invulvelden van een object automatisch aangepast gaat worden. Kortom we willen een object veranderen met deze nanoflow. Dus kiezen we hier voor het actie change object, en zetten deze change object op de nanoflow lijn tussen start en end duh…
Open de actie… Deze actie vraag om een input, die komt van die parameter, namelijk het document. Vervolgens vraag de actie om een actie. Hier kiezen we new en selecteren we uit de dropdown een “member”. Wat is een member, nou dit zijn alle attributen die het object document heeft, incl. de associaties. Hier kiezen we de ReturnDate omdat dat het veld is wat we willen “zetten”, lees set.
Ga nu in het veld staan en schrijf: addMonths ($Document/Borrowdate, (6))
Wat hebben we hier gedaan? De addMonths is een ingebouwde functie die maanden toevoegt aan een datum. $Document/BorrowDate is de verwijzing waar we deze actie op uitvoeren en 6 is het aantal maanden dat erbij geteld moeten gaan worden. Dus hier komen 6 maanden bij de BorrowDate en dat “zetten” we op de ReturnDate
Nu zal de nanoflow uitgevoerd worden als iemand het invulveld Borrowdate verlaat en zal er automatisch 6 maanden bij de BorrowDate opgeteld worden en ingevuld bij de ReturnDate.
Als laatste kan je ervoor kiezen dat het veld ReturnDate niet editable is zodat men niet de datum hiervan alsnog kan aanpassen of maak dit Conditionaly zodat bijvoorbeeld dit alleen door iemand met de juiste rechten gedaan kan worden.
So now you know…
Vergeet niet regelmatig deze site te bezoeken voor meer tutorials en als je op zoek bent naar een eigen zakelijke applicatie laten we dan contact zoeken.