Viime viikon kirjoituksessa kävimme läpi kaksi tapaa toteuttaa muokattava taulukko (editable grid). Toiminnallisuus saatiin muilta osin kuntoon, mutta tallennuksen kesto jätti toivomisen varaa.
Ratkaisussa tallennetaan ForAll-silmukassa useita rivejä. Jokainen päivitys kestää 0,5-1,0 sekuntia. Siitä voi laskea mitä vaikka 100 rivin päivittäminen kestää.
Muokkasin kahtakymmentä riviä. Muutosten tallentaminen vei 16 sekuntia.
Se on paljon. Tehdään sille jotain.
Muutetaan ratkaisua siten, ettemme tallenna muutoksia Patch-komenolla PowerAppsissa, vaan välitämme tiedot tallennettavaksi Flow:lle.
Kokoelman muuttaminen JSON-muotoon
Jotta tämä onnistuu, tulee kokoelmaan tallennetut muutokset välittää jollain järkevällä tavalla Flow:lle. Käytännössä yhtenä JSON-muotoisena merkkijonona.
Kokoelmasta (colUpdatedItems) saa muodostettua JSON:ia ”helposti” seuraavalla tavalla (kiitos ).
Substitute( Concatenate( "[", Concat( colUpdatedItems, "{""Price"":""" & Price & """,""Index"":""" & Index & """,""Quantity"":""" & Qty & """,""Value"":""" & totalValue & """}", ","), "]"), ",]", "]")
Kuvasta näet miltä valmis JSON näyttää.
Flow:n luominen
Seuraavaksi luodaan Flow, joka käynnistetään PowerAppsista Tallenna-painikkeella.
Valitaan käynnistimeksi (trigger) PowerApps.
Lisätään ensimmäiseksi toiminnoksi ”Jäsennä JSON” (Parse JSON). Poimitaan toiminnon sisältökenttään ”Kysy PowerAppsissa” vaihtoehto.
Näin kyseinen arvo annetaan parametrina PowerAppsissa.
Jotta Flow:n Jäsennä JSON -toiminto osaa käsitellä saamansa sisällön, tulee sille kuvata missä muodossa sisältö on.
Tätä ei tarvitse tehdä käsin, vaan toiminto osaa muodostaa rakenteen kuvauksen (schema) esimerkkisyötteen avulla.
Palataan PowerAppsiin. Muokataan muutamia rivejä, jolloin tekstikenttään muodostuu JSON-muotoinen teksti.
Voimme käyttää muodostamaamme tekstiä esimerkkisyötteenä. Kopioidaan JSON leikepöydälle ja palataan Flow-työkaluun.
Painetaan ”Muodosta rakenne mallitietojen avulla”.
Ja kopioidaan PowerAppsista nappaamamme teksti mallitiedoksi.
Ja näin toiminto osaa laatia schema-kuvauksen puolestamme.
Rivien päivittäminen Flow:n avulla
Siirrytään muokattujen rivien päivittämiseen. Lisätään SharePointin ”Päivitä kohde” -toiminto.
Jäsennä JSON -toiminnon sisältöinä ovat PowerAppsista välitetyn kokoelman sarakkeet.
Poimitaan oikeat sarakket SharePoint-listan kenttiin.
Heti kun lisäämme ensimmäisen sisällön toimintoon, luo Flow automaattisesti sen ympärille ”Käytä kaikkiin” toiminnon.
Flow ymmärtää JSON-sisällön sisältävän useita tietueita, joilla kaikilla on samat kentät (Index, Price, Quantity ja Value).
Fiksua. Valmis työnkulku näyttää tältä.
Flow:n liittäminen PowerAppsin painikkeeseen
Palataan PowerAppsiin ja lisätään näytölle painike (button). Määritetään Flow käynnistymään kyseisellä painikkeella (Toiminto – > Flows -> valitaan oikea Flow).
Annetaan Flow:n parametriksi kokoelmasta muodostettu JSON-merkkijono.
Ja kokeillaan. 20 rivin tallennus kestää 8 sekuntia.
Parempi, mutta edelleen liikaa.
Rinnakkaisuuden lisääminen
Avataan Flow:sta ”Käytä kaikkiin” toiminnon asetukset (klikkaa kolmea pistettä toiminnon oikeasta yläreunasta ja valitse asetukset).
Laitetaan samanaikaisuuden hallinta päälle, sekä nostetaan rinnakkaisuuden aste 30:een.
Nyt silmukan sisällä suoritettavat toiminnot suoritetaan rinnakkain (max 30 kappaletta). Oletuksena ne suoritetaan peräkkäin.
Voimme toimia näin, koska silmukan sisällä olevat toiminnot eivät riipu toisistaan.
Kokeillaan muokata 20 riviä. Alkuperäinen 16 sekunnin tallennus on nyt kutistunut sekuntiin.
Vastaavasti 40 rivin tallennus kestää 2 sekuntia aikaisemman 30 sijaan.
Ei huono.
Helppoa mutta…
Esitetyllä tavalla saadaan usean tietueen tallennukseen huikeasti lisää nopeutta. Niin paljon, että yhdistimien (connector) rajat voivat tulla vastaan. Tällöin suoritettavia toimintoja aletaan rajoittamaan (throttle).
Yksi SharePoint-yhteys (connection) voi käsitellä 600 toimintoa minuutissa. Tämän jälkeen pyyntöjä laitetaan jonoon odottamaan. Koska samaa SharePoint-yhteyttä käyttää tyypillisesti usea PowerApps ja Flow, on riski rajan vastaantulemiseen todellinen.
Yksi tapa välttää ikävät yllätykset on luoda resursseja kuluttaville toiminnoille oma yhteys (connection). Yhteyden hyytyessä siitä kärsii vain sitä käyttävä Flow / PowerApps.
Toinen tapa on rajoittaa yksittäisen Flow:n samanaikaisten suoritusten määrää. Tämä tehdään Flow:n käynnistimen (trigger) asetuksista.
Rajan tullessa vastaan jää käynnistetty Flow kiltisti odottamaan vuoroaan ja se suoritetaan vasta kun joku aiemmin käynnistetyistä Flow:sta on suoritettu loppuun.
Yhteenveto
Usean tietueen tallentamista kerrallaan ei kannata tehdä PowerAppsissa. Se kannattaa välittää Flow:lle, jolloin tallennusta voi tehostaa huomattavasti.
Mieti kuitenkin hetki, miten
- moni käyttäjä tekee tallennuksia samaan aikaan
- monta riviä käyttäjät keskimäärin tallentavat
- moni muu PowerApps / Flow käyttää samaa yhteyttä tallennuksen kanssa (ja miten paljon ne yhteyttä käyttävät)
Mikäli 600 toimintoa minuutissa tuntuu tämän jälkeen vähältä, on syytä miettiä vielä toinen hetki miten varautua kyseisessä ratkaisussa huippukuormaan.