Koostesarakkeet (rollup) ovat aivan mahtavia. Paitsi etteivät ne ole. Niiden arvot päivittyvät kerran tunnissa, joten ne ovat sellaisenaan usein hyödyttömiä.
Otetaan esimerkiksi työkaverien kanssa käyttämämme alkoholittomien oluiden arvostelusovellus.
Kunkin käyttäjän tekemien arvostelujen (checkins) lukumäärä lasketaan koostesarakkeen avulla käyttäjän (user) tietoihin. Näin sitä ei tarvitse laskea sovelluksessa.

Kentän arvo on kyseisen käyttäjän luomien (Created by) arvostelujen (Beer rating) lukumäärä (count).

Ajatuksena mainio. Sovelluksen käyttäjiä tämä kuitenkin hämmentää. Käyttäjän sijoitus ei päivity olutarvostelun lisäämisen jälkeen. Tai päivittyy se. Viimeistään tunnin kuluttua, kun laskennallisten kenttien arvot taas päivitetään.
Käyttäjä haluaa tietenkin nähdä sijoituksensa heti. Voimmeko pakottaa laskennallisen kentän päivittymään ohjelmallisesti jollain helpolla tavalla?
Voimme.
Web API ja CalculateRollupField -funktio
Laskennallisen kentän voi päivittää Dataversen Web API:sta löytyvällä CalculateRollupField-funktiolla. Dokumentaatio on asiaan vihkiytymättömälle turhan karsittu, joten tässä vaiheet tempun tekemiseen.
Tehdään Power Automatella työnkulku, joka käynnistyy kun uusi olutarvostelu lisätään.

Seuraavaksi teemme http-kutsun, jolla pakotamme laskennallisen kentän päivittymään. Elaiza Benitez:in blogissa on tähän mainio ohje.
Käytettävä URL on seuraavanlainen.
https://**myEnvUrlHere**/api/data/v9.2/CalculateRollupField(Target=@EntitySetName,FieldName=@FieldName)?@EntitySetName={'@odata.id':'**EntitySetName(GUID)**'}&@FieldName='**FieldNameValue**'
Meidän tarvitsee muuttaa siitä tähdellä merkityt osuudet:
- Ympäristön osoite (myEnvUrlHere)
- Taulun, jossa laskennallinen kenttä on (EntitySetName)
- Päivitettävän tietueen tunniste (GUID)
- Laskennallisen kentän nimi (FieldNameValue)
Tarvittavat tiedot löytyvät esimerkiksi seuraavista paikoista.
Ympäristön osoite Power Platform admin centeristä.

Taulun EntitySetName Tools-valikon takaa löytyvästä ”Copy set name” -valinnasta.

Kentän FieldNameValue on sama kuin kentän ominaisuuksista löytyvä Logical name.

Käytettävä osoite on melkein valmis.
https://ffdemo1.crm4.dynamics.com/api/data/v9.2/CalculateRollupField(Target=@EntitySetName,FieldName=@FieldName)?@EntitySetName={'@odata.id':'systemusers(**GUIDHERE**)'}&@FieldName='ff_checkins'
Teemme kutsun HTTP with Microsoft Entra ID (preauthorized) -yhdistimen Invoke an HTTP-request -toiminnolla. Näin flow ei sisällä mitään tunnuksia ja salasanoja. Ne ovat tallessa käyttäjäkohtaisissa yhteyksissä (connections).

Mutta mitä Base Resource URL ja Azure AD Resource URI -parametreihin laitetaan?

Dataversen API:a käytettäessä, niihen laitetaan käytettävän ympäristön URL. Eli sama osoite, kuin varsinaisessa kutsussakin. Se sama jonka juuri haimme Power Platform admin centeristä.

Kutsussa käytetään GET-metodia. URL:issa olevan guid:in vaihdamme rivin luoneen käyttäjän tunnisteeksi.

Ja siinä se!
Päivityksen käynnistäminen suoraan Power Appsista
Tekemässämme ratkaisussa laskennallinen kenttä päivitetään, kun joku lisää uuden olutarvostelun. Tarkalleen ottaen silloin kun flow’n triggeri (When a row is added, modified or deleted) suvaitsee käynnistyä. Se ei ole synkroninen, joten pientä viivettä voi esiintyä.
Flow’n voi käynnistää myös Power Appsista. Tästä on kaksi etua.
- Flow käynnistyy heti
- Flow’n aiheuttamat API-kutsut menevät sovelluksen käyttäjän, ei flow’n omistajan, piikistä. Tällä on merkitystä mikäli arvosteluja on todella paljon
Toiminnon (actions) hyödyntäminen
Tuoreena mahdollisuutena päivityksen voi käynnistää Power Appsista toiminnon (actions) avulla.

Tehdään toiminto (Force recalculate user rollups), joka saa parametrina käyttäjän tunnisteen (CreatedByGuid).

Tämän jälkeen teemme flow’n, joka käynnistyy kun toiminto suoritetaan (When an action is performed). Flow päivittää parametrina saamansa käyttäjän rollup-kentän.

Lisätään sovellukseen tietolähteeksi Environments. Sieltä löytyvät ympäristön toiminnot.

Käynnistämme toiminnon sovelluksessa arvostelun lisäämiseen jälkeen. Toiminnon käynnistys puolestaan käynnistää flow’n.
Environment.ff_Forcecalculateuserrollups({CreatedByGuid:constDVUser.User})

Toiminnon hyödyntäminen tällä tapaa ei kuitenkaan tuo mitään lisäarvoa.
- Varsinainen flow käynnistyy jopa hitaammin, kuin jos se käynnistyisi Dataversen rivin päivityksestä (kuten alunperin teimme)
- API-kutsut menevät edelleen flow’n omistajan piikkiin
Mikäli käyttötapaus edellyttää laskennallisen kentän päivittämistä ennen muutoksen kohteena olevan rivin muokkausta/poistoa, voi tämän toteuttaa siististi mukautettujen toimintojen avulla. Tosin tällöin toiminto käynnistetään perinteisestä työnkulusta, ei Power Appsista.

