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

project entity.png

Käyttäjät taas löytyvät valmiista User-entiteetistä.

user entity.png

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.

add many to many relation.png

Ja valitaan entieetit, joiden välille suhde muodostetaan.

project entity. many to many relation.png

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

project model-driven step 1

Annetaan sovellukselle nimi.

project model-driven step 2.png

Ja valitaan entiteetit, joita sovelluksemme käyttää.

project model-driven step 3.png

Poimitaan mukaan seuraavat

  • Project
  • ProjectHour
  • ProjectTask
  • User

project model-driven step 4.png

Seuraavaksi rakennetaan sovelluksen navigaatio (Site Map).

project-model-driven-step-5.png

Nimetään navigoinnin kaksi ensimmäistä tasoa uudelleen (Project management ja Admin). Viimeiseen tasoon (sub area) liitetään projekti-entiteetti.

project model-driven step 6.png

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.

project model-driven step 7.png

Raahataan oikean reunan listasta (Field Explorer) lomakkeelle projektipäällikkö (Project manager) -kenttä.

project model-driven step 8.png

Lisätään lomakkeelle uusi alue (section).

project model-driven step 9.png

Uudelle alueelle lisätään muokattava lista projektin tehtävistä (Insert -> Sub-Grid ja valitaan oikea entiteetti).

project model-driven step 10.png

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

project model-driven step 11.png

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

project model-driven step 12.png

Lisätään luodulle välilehdelle muokattava lista, jossa esitetään projektiin liittyvät käyttäjä (User) -tietueet.

project model-driven step 13.png

Ja taas tallenetaan ja julkaistaan.

Nyt projektinäytöllä on oma välilehti, jolla pääsee muokkamaan projektiryhmää.

project model-driven step 14.png

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.

project hours canvas app step 1.png

Hyödynnetään User-tietuetta tuntikirjausnäytön projektit-valikossa. Listataan sitä käyttäen ainoastaan käyttäjän omat projektit.

project hours canvas app step 1

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

project hours canvas app step 3.png

Siirrytään tuntikirjausnäytölle ja lisätään lomakkeen sisään galleria.

top projects 1png.png

Lisätään galleriaan painike, sekä asetetaan kukin rivi näyttämään kaksi painiketta (wrap count = 2).

top projects2png.png

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.

project hours canvas app step 4.png

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

project hours canvas app step 5.png

Nyt voimme käyttää uutta tietoa projektilistassa. Sen oletusarvo on joko

  • painikkeella valittu arvo (varSelectedProject) tai
  • kentän oletusarvo (Parent.Default)

project hours canvas app step 6.png

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.

project hours canvas app step 7.png

Tehtävälistan valinta tulee poistaa myös käyttäjän vaihtaessa (OnChange) projektin alasvetovalikosta.

project hours canvas app step 8.png

Jotta lomakkeelle tultaessa lähtötilanne on oikein, tulee aiemmin tehty pikavalinta tyhjentää.

OnSelect: Set(varSelectedProject, Blank());

project hours canvas app step 9.png

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.

project hours canvas app reporting step 1.png

Lisätään näytölle piirakkakaavio (Insert -> Charts -> Pie chart).

project hours canvas app reporting step 2.png

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.

project hours canvas app reporting step 3.png

Lisätään vielä näytölle 7 edellisen päivän kirjauksien kokonaisumma.

project hours canvas app reporting step 4.png

Harmiksemme kuvaajasta ei näy paljonko kullekin projektille on kirjattu tunteja. Lisätään näytölle vielä taulukko, jossa esitetään samat kirjaustiedot.

project hours canvas app reporting step 5.png

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.