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ää.

Näyttökuva 2019-4-10 kello 19.14.56.png

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 jamiewr).

Substitute(
   Concatenate(
      "[",
         Concat(
            colUpdatedItems,
            "{""Price"":""" & Price & """,""Index"":""" & 
            Index & """,""Quantity"":""" & Qty & 
            """,""Value"":""" & totalValue & """}", ","),
       "]"),
   ",]",
   "]")

Kuvasta näet miltä valmis JSON näyttää.

Näyttökuva 2019-4-10 kello 19.26.43.png

Flow:n luominen

Seuraavaksi luodaan Flow, joka käynnistetään PowerAppsista Tallenna-painikkeella.

Valitaan käynnistimeksi (trigger) PowerApps.

Näyttökuva 2019-4-10 kello 19.38.29.png

Lisätään ensimmäiseksi toiminnoksi ”Jäsennä JSON” (Parse JSON). Poimitaan toiminnon sisältökenttään ”Kysy PowerAppsissa” vaihtoehto.

Näyttökuva 2019-4-10 kello 19.39.52

Näin kyseinen arvo annetaan parametrina PowerAppsissa.

Näyttökuva 2019-4-10 kello 19.41.36.png

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.

Näyttökuva 2019-4-10 kello 19.42.41.png

Voimme käyttää muodostamaamme tekstiä esimerkkisyötteenä. Kopioidaan JSON leikepöydälle ja palataan Flow-työkaluun.

Painetaan ”Muodosta rakenne mallitietojen avulla”.

Näyttökuva 2019-4-10 kello 19.44.26

Ja kopioidaan PowerAppsista nappaamamme teksti mallitiedoksi.Näyttökuva 2019-4-10 kello 19.45.26

Ja näin toiminto osaa laatia schema-kuvauksen puolestamme.Näyttökuva 2019-4-10 kello 19.45.39

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.

Näyttökuva 2019-4-10 kello 19.53.08.png

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ä.Näyttökuva 2019-4-10 kello 19.51.54.png

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).

Näyttökuva 2019-4-10 kello 19.58.30.png

Annetaan Flow:n parametriksi kokoelmasta muodostettu JSON-merkkijono.

Näyttökuva 2019-4-10 kello 20.03.41.png

Ja kokeillaan. 20 rivin tallennus kestää 8 sekuntia.

Näyttökuva 2019-4-10 kello 20.05.41.png

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).

Näyttökuva 2019-4-10 kello 20.08.10

Laitetaan samanaikaisuuden hallinta päälle, sekä nostetaan rinnakkaisuuden aste 30:een.

Näyttökuva 2019-4-10 kello 20.09.40.png

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.

Näyttökuva 2019-4-10 kello 20.13.14.png

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.

Näyttökuva 2019-4-17 kello 18.15.51.png

Näyttökuva 2019-4-17 kello 18.14.30.png

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.