Canvas Power Appsissa on jo pitkään ollut natiivi tuki offline käytölle. Tietyissä käyttökohteissa aivan huikea ominaisuus. Offlinena käytettävän sovelluksen tekeminen on teoriassa todella yksinkertaista. Käytännössä ei aina niinkään.

Olen kevään aikana päivittänyt yhden laajaan sovelluksen toimimaan offline-tilassa. Tässä jutussa käyn läpi mitä haasteita olen projektin aikana kohdannut.

Mikäli Power Appsin offline-käyttö ei ole entuudestaan tuttua, kannataa aloittaa lukemalla kolme aikaisempaa aiheeseen liittyvää kirjoitustani.

Esimerkki – Kenttätyöntekijän mobiilisovellus

Muutoksen kohteena on laaja Canvas Power Apps -toteutus, jolla käyttäjä mm. kirjaa tunteja, suorittaa riskiarvioita sekä päivittää tehtyjä tarkastus- ja huoltotoimenpiteitä.

Sovellus käyttää ~40 Dataverse-taulua ja se koostuu ~30 näytöstä.

Tämä kaikki tulisi saada toimimaan ilman nettiyhteyttä.

Offline-käytön rajoitukset

Aivan ensimmäiseksi kannattaa tutustua offline-käytön rajoituksiin.

  • Toimii ainoastaan Dataversen kanssa. Unohda SharePoint ja SQL
  • Virtuaalitaulut eivät ole tuettuja. Unohda Entra ID Users (AAD Users) -taulun käyttö.
  • Elastiset taulut eivät ole tuettuja
  • Notes -taulun käyttö ei ole tuettua
  • Laitteelle voi synkronoida max 3 miljoonaa riviä
  • Power Fx:n Relate ja Unrelate -komennot eivät toimi
  • Many-to-many relaatiot eivät ole tuetttuja
  • Lookup-kenttiä voi hydyntää yhden relaation verran eteenpäin. Filter(Site, Country.CountryCode =”FI”) toimii kun taas Filter(Site, Country.RiskCategory.Name=”High”) ei toimi.
  • Lookup-kenttä ei voi viitata itseensä (Self-referential Lookups). LookUp(Site, ParentSite.Site = locCurrentSite) ei toimi.
  • Laskennalliset (calculated) ja kooste (rollup) -kentät päivittyvät vasta kun niiden arvot on synkronoitu takaisin Dataverseen
  • Rivien järjestys (sort order) saattaa poiketa oletetusta. Rivit kannattaa siis järjestää Power Appsin päässä itse.

Suurin osa rajoituksista on hoidettavissa. Itse jouduin käytännössä:

  • Korvaamaan many-to-many relaatiot omilla tauluilla
  • Kierrättämään kuvatiedostot Dataversen kautta SharePointiin (alunperin tallennettin suoraan SharePointiin)
  • Muuttamaan Power Appsista käynnistyvät flow’t käynnistymään muutoksesta Dataversessä
  • Testaamaan saadaanko käyttäjän lataamat kuvat toimimaan myös offlinessa. Onneksi alkuperäinen toteutus toimi sellaisenaan.

Kun mahdolliset rajoituksista tulleet esteet on hoidettu, voidaan siirtyä eteenpäin.

Offline-profiili

Mikäli sovelluksen käyttämissä tauluissa on yhteensä vain muutamia tuhansia rivejä, voit harkita automaattisesti generoidun profiilin käyttöä. Se synkronoi laittellee kaikki rivit kaikista tarvittavista tauluista.

Käytännössä tämä on harvoin mahdollista. Esimerkkisovelluksessamme on yli miljoona riviä. Niiden lataaminen käyttäjän puhelimeen ei ole järkevää. Eikä nopeaa.

Tuleekin rakentaa offline-profiili, joka synkronoi käyttäjän laitteelle ainoastaan tarvittavat rivit. Yksinkertaisimmillaan esimerkiksi kuluvan kuukauden aktiiviset tilaukset.

Esimerkissämme offline-profiili perustuu pitkälti relaatioketjuihin.

  • Kaikki työtilaukset, jossa käyttäjä on omistajana
  • Kaikki näihin työtilauksiin liittyvät tuotteet ja asiakkaat
  • Kaikki näihin tuotteisiin liittyvät työohjeet
  • Kaikki näihin asiakkaisiin liittyvät toimipisteet
  • jne

Näin käyttäjän laitteelle synkronoidaan ainoastaan tarvittavat tiedot.

Varaudu kuitenkin ongelmiin, mikäli tietomalli on laaja. Tauluun liityvien relaatioketjujen maksimipituus on 15.

Olemassa olevan sovelluksen muuntaminen käytännössä

Muutostyö kannattaa tehdä (todella) pienissä paloissa. Jatkuvasti mobiililaitteella testaten. Itse tein ensimmäisenä kopion olemassaolevasta sovelluksesta ja muutin sen tukemaan offline-käyttöä uutta offline-profiiliani käyttäen.

Ja sitten näyttö kerrallaan testaamaan ja tekemään korjauksia.

  1. Lisää offline-profiiliin näytön tarvitsemat taulut. Mieti kuntoon logiikka taulun rivien synkronointiin
  2. Varmista että käyttäjällä on tarvittava käyttöoikeus ko riveihin
  3. Julkaise offline-profiili
  4. Tarkista mobiililaitteella että tarvittavien taulujen rivit synkronoituvat laitteelle
  5. Tarkista mobiililaitteella että testattava näyttö toimii. Ei virheitä, ja kaikki tiedot tulevat näytölle kuten käyttämällä samaa sovellusta työaseman selaimella (samalla käyttäjällä)

Kun olet saanut näytön toimimaan, voit siirtyä seuraavaan.

Kuulostaa helpolta ja nopealta. Kokemukseni perusteella ongelmia kuitenkin tulee. Osa on nopea korjata lisäämällä puuttuva taulu offline-profiiliin. Olemassaolevaa sovellusta muutettaessa voi eteen tulla myös kaikkea enemmän tai vähemmän mystisempää.

Tyypilliset ongelmat

Alkutilanne voi olla se, että esimerkiksi galleria on kokonaan tyhjä. Vaikka siinä pitäisi näkyä vaikka mitä. Tällöin kannattaa ensimmäisenä tarkistaa, onko gallerian käyttämä taulu(t) riveineen synkronoitu laitteelle.

Harmiksemme iPhonen näytöllä näkyy ainoastaan 10 ensimmäistä taulua. Loppujen tilaa emme näe. iPadilla näkee hieman enemmän, muttei silläkään kaikkia. Olisi mainiota jos tätä näyttöä voisi vierittää…

Mikäli tarvittavat rivit on synkronoitu laitteelle, voi kokeilla CountRows-komennolla ovatko ne sovelluksen luettavissa. Mikäli eivät ole, tarkista käyttoikeusroolit. Mikäli ovat, on galleriassa jotain vikaa.

Vika on joko suodatusehdossa (filter) tai galleriassa näytettävässä sisällössä. Testaa suodatusehto CountRows-komennolla (CountRows(Filter(käyttämäsi ehto)) asettamalla se tekstikentän arvoksi näytölle, julkaisemalla sovellus ja testaamalla mobiililaitteella.

Mikäli suodatusehto palauttaa rivejä, on syy galleriassa esitettävässä sisällössä. Kommentoi yksi kerrallaan kaikki gallerian kentät, joissa esitetään tietoa muusta kuin gallerian käyttämästä taulusta. Esimerkiksi

  • Text = ThisItem.Customer.Name
  • Text = ThisItem.Customer.Country.Name (tämä ei ole tuettu)

Julkaise ja testaa. Todennäköisesti toimii. Sitten palautat kommentoidut kentät käyttöön kunnes löydät ongelman lähteen ja korjaat sen. Yleensä syynä on se, ettei viitattu tietue ole mukana synkronoidussa sisällössä. Profiilin viilaminen korjaa tällöin ongelman. Joissain tilanteissa joudut taipumaan ja hakemaan tiedot LookUp:lla.

  • Text = LookUp(Country, Country = ThisItem.Country).Name

Mikäli sovellusta käytetään ainoastaan mobiililla, eivät gallerian sisällä tehdyt LookUpit ole samanlaista myrkkyä kuin normaalisti. Kysely tehdään aina mobiililaitteella sijaitsevaan tietokantaan, ei Dataverseen.

Työtä helpottaa kun sitä tekee pienissä paloissa. Älä tee muutoksia samaan aikaan sekä sovellukseen, että offline-profiiliin. Kun jotain hajoaa, et voi olla varma mistä syystä se hajosi.

Virheilmoitukset

Sovellusta rakentaessa tyypillisin virheilmoitus on geneerinen ”Virhe yritettäessä noutaa tietoja verkosta”.

Yleensä kyse on siitä että viittaat sovelluksessa tietoihin, joita ei löydy offline-profiilista.

Mikäli käyttäjällä ei ole tauluun riittäviä käyttöoikeuksia, antaa alusta (yleensä) kunnollisen virheimoituksen.

Mystiset ongelmat

Lopuksi muutama hieman erikoisempi ongelma, joihin olen törmännyt. Offline-tuen ehdottomasti ärsyttävin piirre on mitäänsanomattomat virhe-ilmoitukset. Yleensä jos jokin ei rakennusvaiheessa toimi, saa käyttäjä epämääräisen ”Virhe yritettäessä noutaa tietoja verkosta” -ilmoituksen tai ei virhettä ollenkaan. Kunhan kaiken saa korjattua, toimii sovellus mainiosti. Mutta virheiden metsästäminen on välilä todella työlästä.

Power Apps -sovelluksen uudelleenasennus

Mikäli sovellus antaa geneerisen ”Virhe yritettäessä noutaa tietoja verkosta” -ilmoituksen vaikka mielestäsi kaiken tulisi olla kunnossa, kannattaa poistaa Power Apps -sovellus mobiililaitteelta ja asentaa se uudelleen.

Muutaman kerran tämä on korjannut virheen. Kun muutoksia tekee paljon, voi joko sovellus tai offline-profiili mennä laitteella solmuun.

Muuttujien ja kokoelmien uudelleennimeäminen

Vanha kikka Power Appsin alkuajoilta. Olemassaolevaa sovellusta muunnettaessa voi käydä niin että kokoelmiin ei lataudu enää arvoja. Vaikka kaiken pitäisi olla kunnossa. Tällöin kannattaa nimetä kokoelma uudelleen.

Vaikuttaa siltä että joskus kokoelmiin jää kiinni vääränlainen skeema, eikä se osaa ladata offlinena kaikkia tarvittavia tietoja. Varsinkaan relaation takaa.

Sama koskee muuttujia.

Mystinen kuva-kenttä

Esimerkkisovelluksessa on näyttö, jossa päivitetään riviä lisäämällä kahteen sen sarakkeeseen kuvatiedostot (allekirjoitukset). Patch-komento palautti aina geneeriseen virheen. Tiedot kuitenkin tallentuivat. Mutta ei sitä virhettä voinut jättää kummittelemaan.

Erikoista oli se, että uuden rivin lisääminen toimi ilman virhettä. Virhe tuli ainoastaan päivityksessä.

Lopulta havaitsin, että virhettä ei tule, mikäli päivityksessä päivittää toiseen kuvakenttään tyhjän arvon (Blank()). Ratkaisu oli lopulta lisätä tauluun kolmas kuvakenttä ja päivityksen yhteydessä lisätä siihen aina tyhjä arvo. Näin kaksi muuta kuvakenttää päivittyi ilman virhettä.

Jep. Mitä ihmettä.

Mystinen painike

Toinen sekopäinen tilanne tuli eteen yhden galleriassa sijaitsevan painikkeen kanssa. Painiketta painamalla alustetaan kokoelma. Paitsi että offline-sovelluksessani alustus loi kokoelman missä ei ole rivejä. Vaikka pitäisi.

Tein uuden näytön ja sinne vastaavan painikkeen. Se toimi. Kopioin painikkeen alkuperäiselle näytölle jolloin painike lakkasi toimimasta. Kopioin painikkeen uudelle näytölleni, eikä se toiminut sielläkään.

Minulla oli 4 identtistä painiketta kahdella eri näytöllä. Ainoastaan yksi painikkeista toimi.

Ratkaisu oli tietenkin siirtää vanhan näytön sisältö sille uudelle näytölle missä oli toimiva painike.

Sovelluksen export + import

Kaksi edellistä ongelmaa olivat siinä määrin mystisiä että oli pakko kokeilla koko hoidon lataamista omalle koneelle ja takaisin. Tällä toimenpiteellä onnistuu joskus korjaamaan täysin mystisiä ongelmia. Tällä kertaa ei.

Yhteenveto

Vaikka tarinan loppu saattaa kuulostaa pelottavalta, ei Canvas Power Appsin offline-tukea ole mielestäni syytä pelätä. Kohtaamani ongelmat johtuivat pääasiassa siitä että työstin useita vuosia kehitettyä, varsin monimutkaista, sovellusta. Ja niiden kanssa on välillä mystisiä ongelmia ilman offline-tarinaakin.

Mikäli pääset aloittamaan puhtaalta pöydältä, on näköpiirissä vähemmän ongelmia. Siinäkin tapauksessa etenisin toteutuksen kanssa hieman eri tavalla kuin perinteisen canvas appsin kanssa. Testaisin sitä tiheään tahtiin mobiililaitteella. Tällöin virheilmoituksen ilmestyessä tai näytön kokonaan tyhjentyessä (ja jompi kumpi tulee enemmin tai myöhemmin kehitystä tapahtumaan), on paljon helpompaa selvittää mistä virhe johtuu.

Aivan aloittelijoille en voi tähän leikkiin lähtemistä kuitenkaan suositella.