Power Platform: App Maker Challenge, deel 26

Ingediend door Dirk Hornstra op 10-jun-2022 23:27

Het zesentwintigste deel, verwachte tijd: een uur.
Dit deel gaat over programmeertechnieken voor canvas apps. De titel verwijst naar "imperatieve technieken". Als ik het woord opzoek, geeft dat iets als "gebiedende wijs", dus het lijkt erop dat we strak en gemodelleerd gaan werken. We zullen zien.

Er zijn 2 manieren om te programmeren, imperatief en declaratief. Imperatief, daarbij focus je "hoe" je het doel gaat bereiken. Deze methode is flexibeler, omdat je elke stap in het proces uitgewerkt hebt. Maar daardoor heb je meer code en is de complexiteit groter. Bij de declaratieve methode ligt de focus op het verkrijgen van het resultaat. Gebruik is simpeler en meer rechtuit-rechtaan, maar je hebt minder controle over wat er gebeurt.

De verschillen worden getoond met een voorbeeld. Als je een broodje voor de lunch wil gaat het op de imperatieve manier via: ga-naar-keuken, pak-de-ingredienten, smeer-boter-op-de-boterham, doe-beleg-op-de-boterham, neem-deze-mee-naar-de-tafel. Bij de declaratieve manier roep je de functie GetBroodje(Keuken, Tafel) aan en heb je dus minder invloed op wat er gebeurt (wil je geen echte boter, maar margarine, dat kun je hier waarschijnlijk niet instellen).

Power Apps ondersteunen beide types. Focus in dit hoofdstuk is imperatief. En het gebruik van variabelen hierbij.

In Power Apps heb je 3 soorten variabelen.

  • Globale variabelen: gebruik Set om de waarde in te stellen. Bijvoorbeeld DisplayName van de ingelogde gebruiker, overal beschikbaar.
  • Context variabelen: alleen beschikbaar in het scherm waar je zit, via UpdateContext.
  • Collections: een speciaal type voor opslag van een tabel met data. Via Collect en ClearCollect aan te maken, werken vergelijkbaar als globale variabelen.


Je hoeft variabelen niet te declareren, initialiseren. Power Apps bepaalt aan de hand van de inhoud het type. Ze zijn alleen beschikbaar bij de huidige gebruiker in de huidige sessie. Na afsluiten applicatie "zijn ze weg".

Als je "normale" applicaties maakt, dan zijn globale variabelen eigenlijk "uit den boze". Maar hier kun je ze prima gebruiken. We zien een welkom-melding met de naam van de ingelogde gebruiker: User().FullName

Het voorbeeld van een waarschuwings-icoon (als de gebruiker al 3 openstaande facturen heeft) wordt genoemd. Dat kun je koppelen met een CountRows(Filter(InvoiceEntity, CustomerNumber = ThisCustomersNumber And Status = "Outstanding")) > 3
maar omdat die controle ook ergens anders nog nodig is, dit wel een redelijk "zware" actie is, is het advies om deze controle 1x in een variabele te stoppen:
Set(varOutStandingExceeded, CountRows(Filter..... > 3)

We zien een voorbeeld van contextuele variabelen. Zo wil je soms een pop-up tonen als iemand op een delete-knop drukt, met UpdateContext({varShowPopUp: true}) kan dat. Maar die varShowPopUp kan dus ook in een ander scherm gebruikt worden (en heeft dan geen relatie met deze variabele).

Met Set kun je maar 1 variabele zetten, UpdateContext kan er meer in 1 keer doen: UpdateContext({varCount: 1, varActive: true, varName: User().FullName})

Dan krijgen we de collecties. Als je een grote tabel met projecten hebt en  in je app regelmatig projecten "query-acties" uitvoert, maar die hebben bijvoorbeeld alleen betrekking op jouw projecten, dan is het slimmer om een eigen collectie met die projecten te vullen:
Collect(collectProjects, Projects)

Collect functie is niet "delegable", standaard worden alleen de eerste 500 records opgevraagd en in jouw collectie opgeslagen. Meer info over delegation: link.

Er is geen link met de bron. Wijzigingen gebeuren dus alleen in je lokale collectie, niet in de bron-tabel. Hiervoor zul je zelf formules moeten bouwen.
Collecties zijn tijdelijk, dus afsluiten app: het is verdwenen. Als je spullen wilt/moet opslaan, moet je dat dus afhandelen voor het sluiten van de app.

Collecties hoeven niet uit een "data bron" te komen, je kunt zelf ook een dynamische collectie opzetten:


Collect(collectColors, {Name: "Shane", FavoriteColor: "Orange"})

Het enige verschil is dat je dit niet in de Form-control kunt gebruiken.
Meer informatie over collecties en data: link.

Standaard waardes voor variabelen zijn: tekst = "", nummer = 0, boolean = false.

Je kunt in een globale en context variabele een record opslaan.
Set(varUser, User())
En met de . notatie kun je bij de velden: varUser.Email

En zoals duidelijk mag zijn, als je variabelen OnStart op hun waarde zet, dan worden ze niet "magisch" bijgewerkt als er wat gebeurt. Dat type event moet je zelf afhandelen.

Hierna volgt nog een oefening.
We zien hoe je een lijst met facturen kunt tonen en per stuk een prullenbak-icoon. En hoe je de variabele set voor de pop-up, zodat als je er op klikt, een pop-up zichtbaar wordt met een Delete en Cancel knop.

Alle vragen goed, hierna nog 2 linkjes, performance en optimalisatie tips: link en tips en trucks om je app minder complex te maken: link.