Tuntikirjaussovelluksen rakentaminen oli niin hauskaa, että jatketaan hetki sen parissa. Täydennetään ratkaisua seuraavilla ominaisuuksilla.
- Tuntikirjauksia voi tehdä ainoastaan projekteille joiden jäsen on
- Pikavalinta aktiivisille projekteille
- Hallintakäyttöliittymä tälle kaikelle
Aloitetaan.
Tietomallin täydentäminen
Voidaksemme suodattaa projekteja henkilön perusteella, tulee meidän kuvata tietomallissamme, ketkä käyttäjät kuuluvat mihinkin projekteihin.
Projekit löytyvät Project-entiteetistä.
Käyttäjät taas löytyvät valmiista User-entiteetistä.
Henkilö voi olla mukana useassa projektissa ja projektissa voi olla mukana useita henkilöitä.
Tarvitsemme siis projekti ja käyttäjä entiteettien välille monen suhde moneen -suhteen (many-to-many relation).
Valitaan Relationships -> Add relationship -> Many-to-many.
Ja valitaan entieetit, joiden välille suhde muodostetaan.
Se on siinä. Valmista. Ei ole vaikeaa.
Nyt voimme PowerAppsissa suodattaa projekteja käyttäjän perusteella.
Hallintakäyttöliittymä – Model-driven App
Projekteja, niihin liittyviä henkilöitä ja tehtäviä olisi suotavaa pystyä ylläpitämään jotenkin. PowerApps -tekijät pyöräyttävät vanhasta tottumuksesta tätä varten yhden tai useamman canvas PowerAppsin.
Mutta koska tietovarastona on Common Data Service (CDS), löytyy ongelmaan parempi ratkaisu. Nimittäin model-driven PowerApps.
Luodaaan sellainen (Apps -> Create an app -> Model-driven).
Annetaan sovellukselle nimi.
Ja valitaan entiteetit, joita sovelluksemme käyttää.
Poimitaan mukaan seuraavat
- Project
- ProjectHour
- ProjectTask
- User
Seuraavaksi rakennetaan sovelluksen navigaatio (Site Map).
Nimetään navigoinnin kaksi ensimmäistä tasoa uudelleen (Project management ja Admin). Viimeiseen tasoon (sub area) liitetään projekti-entiteetti.
Lomakkeen muokkkaaminen – Model-driven Apps
Lopuksi hankalin osuus. Muokataan projekti-entiteettiin liittyvää lomaketta siten, että sillä voi muokata projektin tietojen lisäksi myös siihen liittyviä tehtäviä sekä projektiryhmän jäseniä.
Avataan oikea lomake muokattavaksi.
Raahataan oikean reunan listasta (Field Explorer) lomakkeelle projektipäällikkö (Project manager) -kenttä.
Lisätään lomakkeelle uusi alue (section).
Uudelle alueelle lisätään muokattava lista projektin tehtävistä (Insert -> Sub-Grid ja valitaan oikea entiteetti).
Lopuksi (kuten aina model-driven maailmassa) Save ja Publish.
Nyt kun sovelluksessa avaa projektin, näkyy sivulla myös projektiin liittyvät tehtävät (koska niiden välillä on relaatio ja listassa on määritelty näytettävän ainoastaan projektiin liittyvät tietueet).
Näytöltä voi myös lisätä projektille uusia tehtäviä.
Tämähän on helppoa. Jatketaan.
Lisätään projektiryhmä näkyviin samalle lomakkeelle, mutta tällä kertaa omalle välilehdelleen.
Luodaan uusi välilehti (Insert -> 1 Tab One Column).
Lisätään luodulle välilehdelle muokattava lista, jossa esitetään projektiin liittyvät käyttäjä (User) -tietueet.
Ja taas tallenetaan ja julkaistaan.
Nyt projektinäytöllä on oma välilehti, jolla pääsee muokkamaan projektiryhmää.
Voimme halutessamme muokata eri listauksissa näkyviä sarakkeita jne, mutta jätetään tämä tällä kertaa tähän.
Olemme luoneet työkalun, jolla voi helposti muokata projekteja, niiden tehtäviä sekä projektien jäseniä.
PowerApps muutokset
Viritetään lopuksi aiemmin luomaamme PowerAppsia.
Tuntikirjausten tekeminen ainoastaan omille projekteille
Muutetaan PowerAppsia siten, että käyttäjä voi kirjata tunteja ainoastaan projekteille, joiden jäsen hän on.
Haetaan sovelluksen käynnistyessä muuttujaan käyttäjää vastaavaa User-tietue.
Hyödynnetään User-tietuetta tuntikirjausnäytön projektit-valikossa. Listataan sitä käyttäen ainoastaan käyttäjän omat projektit.
Mutta… Kyselyä ei voida delegoida (keltainen kolmio)?
Tämä kuulostaa hieman paksulta. Tutkimalla liikennettä selviää, että delegointi oikeasti onnistuu, joten ei tällä kertaa välitetä kolmiosta. Relaatioiden hyödyntäminen on preview-vaiheessa, joten oletetaan kyseessä olevan bugin.
Käyttäjän Top 4 projektit
Kirjaan tunteja pääasiassa aina samoille projekteille kuin eilen, toissapäivänä jne.
Toteutetaan tuntien syöttölomakkeelle ominaisuus, jossa projektin voi pikavalita. Valittavissa on edellisen seitsemän päivän neljä suosituinta projektia.
Eli projektit, joille on tehty eniten kirjauksia.
Selvitetään nämä projektit sovelluksen käynnistyessä (App OnStart).
Vertailua varten tarvitaan päivämäärä seitsemän päivää sitten.
Set(varDate7DaysAgo,Today() - 7)
Tämän jälkeen luodaan kokoelma, joka sisältää kaikki käyttäjän tuntikirjaukset seitsemän päivän ajalta.
ClearCollect(colMyLast7DaysProjects, Filter(ProjectHours, WorkDay > varDate7DaysAgo And 'Created By'.'Primary Email' = varCurrentUserEmail ) )
Seuraavaksi luodaan toinen kokoelma, jossa käyttäjän kirjaukset on ryhmitelty projektin nimen mukaan.
Samassa kokoelmaan lisätään uusi sarake (SumOfHours), johon lasketaan kyseiselle projektille tehtyjen kirjausten kokonaissumma.
ClearCollect(colMyLast7DaysProjectsWithSum, AddColumns(GroupBy( colMyLast7DaysProjects, "crd01_name", "rest"), "SumOfHours",Sum(rest, Hours) ) )
Nyt tiedämme miten paljon käyttäjä on kirjannut tunteja millekin projektille viimeisen 7 päivän aikana. Luotu kokoelma näyttää tältä.
Siirrytään tuntikirjausnäytölle ja lisätään lomakkeen sisään galleria.
Lisätään galleriaan painike, sekä asetetaan kukin rivi näyttämään kaksi painiketta (wrap count = 2).
Määritetään gallerian tietolähteeksi henkilön top projektit. Järjestetään ne kirjattujen tuntien mukaan ja rajoitetaan määrä neljään (FirstN).
Items: FirstN(Sort(colMyLast7DaysProjectsWithSum, SumOfHours, Descending), 4)
Olen näköjään kirjannut tunteja ainoastaan kolmelle projektille viime viikolla.
Projektin pikavalintapainiketta painettaessa valitaan kysinen projekti projektit-alasvetovalikosta ja mahdollinen tehtävävalinta perutaan (jokaisella projektilla on omat tehtävänsä).
Painiketta painettaessa tehdään käytännössä seuraavaa
- Tallennetaan muuttujaan (varSelectedProject) valitun projektin nimi
- Pyöräytetään tehtävälistan resetoinnissa käytettävä muutaja arvoon true ja takaisin arvoon false
Nyt voimme käyttää uutta tietoa projektilistassa. Sen oletusarvo on joko
- painikkeella valittu arvo (varSelectedProject) tai
- kentän oletusarvo (Parent.Default)
Koska tehtävät ovat projektikohtaisia, tulee huolehtia siitä että projektia vaihdettaessa tehty tehtävävalinta poistuu. Tämä onnistuu käyttämällä tehtävälistan Reset-ominaisuuden arvona varResetTaskSelection-muuttujaa.
Tehtävälistan valinta tulee poistaa myös käyttäjän vaihtaessa (OnChange) projektin alasvetovalikosta.
Jotta lomakkeelle tultaessa lähtötilanne on oikein, tulee aiemmin tehty pikavalinta tyhjentää.
OnSelect: Set(varSelectedProject, Blank());
Nyt käyttäjä voi nopeasti valita projektien joukosta jonkun niistä, johon on viimeisen viikon aikana tehnyt paljon töitä.
Viikon tunnit
PowerAppsissa on varsin näppärät kontrollit erilaisten kaavioiden esittämiseen. Tehdään lopuksi viusaalinen yhteenveto edellisen 7 vuorokauden tuntikirjauksista.
Lisätään uusi näyttö ja siihen yläpalkki otsikoineen ja paluupainikkeineen.
Lisätään näytölle piirakkakaavio (Insert -> Charts -> Pie chart).
Vaihdetaan kaavion tietojoukoksi (items) kokoelma, joka sisältää kaikki käyttäjän edeltävän 7 vuorokauden kirjaukset summattuna projekteittain (colMyLast7DaysProjectsWithSum).
Ja näin meillä on valmis kuvaaja.
Lisätään vielä näytölle 7 edellisen päivän kirjauksien kokonaisumma.
Harmiksemme kuvaajasta ei näy paljonko kullekin projektille on kirjattu tunteja. Lisätään näytölle vielä taulukko, jossa esitetään samat kirjaustiedot.
Yhteenveto
CDS:n käyttö tuo PowerAppsiin mukaan relaatiot, jotka suoraviivaistavat sovelluslogiikan rakentamista. Samalla pääsee hyödyntämään model-driven appseja, joiden mahdollisuuksista hyödynnettiin tässä esimerkissä vasta promille.
Suosittelen kaikkia PowerAppsista kiinnostuneita tutustumaan myös CDS:ään.