Alallamme tuntien kirjaaminen on itsestään selvää. Tuntikirjaukset ovat keskeinen osa laskutusta ja kaikissa työpaikoissani tähän on käytetty tarkoitukseen suunniteltua työkalua. Yleensä ulkoa / palveluna hankittua.

Kaikkialla tilanne ei ole tämä vaan tunteja kirjaa organisaatiossa vain pieni osa työntekijöistä. Saankin usein kyselyjä kevyen tuntikirjaustyökalun toteuttamisesta.

Tällä kertaa rakennetaan sellainen. PowerAppsilla tietenkin.

Tietojen tallennus – CDS for Apps

Halaumme kohdistaa tuntikirjaukset projekteihin liittyviin tehtäviin. Tarvitsemme tällöin seuraavat tiedot.

  • Työkohteet (Projects)
    • Työkohteen nimi
    • Projektipäällikkö
  • Työkohteiden tehtävät (ProjectTask)
    • Tehtävän nimi
    • Tehtävän tuntihinta
    • Työkohde, johon tehtävä liittyy
  • Tuntikirjaukset (ProjectHour)
    • Päivä
    • Tuntimäärä
    • Kirjauksen selite
    • Työkohde, johon kirjaus liittyy
    • Työkohteen tehtävä, johon kirjaus liittyy

Mihin tiedot tallennetaan? Common Data Service for Apps on edelleen monille täysin tuntematon vaihtoehto. Mutta se on aivan huippu! Kaiken lisäksi Microsoft kehittää sitä hirveää vauhtia. Tallennetaan tiedot sinne.

CDS for Appsiin tehty tietomalli koostuu entiteeteistä. Voit ajatella entiteettejä vaikka SharePoint-listoina. Oikeasti ne ovat lähempänä tietokantatauluja. Todella yksinkertaisella hallintakäyttöliittymällä varustettuna.

Siirrytään osoitteeseen https://make.powerapps.com ja aletaan töihin.

Näyttökuva 2019-6-4 kello 20.32.12.png

Uusien entiteettien ja niiden sisältämien kenttien luominen on nopeaa. Kenttätyypeistä löytyy kaikki tarvittava. Pian onkin valmista.

Projektit

Näyttökuva 2019-6-4 kello 20.24.02.png

Projektien tehtävät

Näyttökuva 2019-6-4 kello 20.25.06.png

Projekti-kenttä viittaa (LookUp) projektiin.

Projektien tuntikirjaukset

Näyttökuva 2019-6-4 kello 20.27.33.png

Projekti-kenttä viittaa jälleen projektiin. Task-kenttä taas viittaa projektin tehtävään.

Yksi CDS:n mainio ominaisuus ovat entiteettien väliset suhteet (relaatiot). Kuvasta näet miten projektin tunnit -entiteetti liittyy sekä projekteihin, että projektin tehtäviin.

Näyttökuva 2019-6-4 kello 20.42.22.png

Tuntikirjaus PowerApp

Tuntikirjaussovelluksesta tulee suurin piirtein seuraavanlainen.

  • Näytön yläosassa näytetään kuluvan viikon viikonpäivät
  • Kunkin päivän kohdalla näytetään kyseiselle päivälle kirjattujen tuntien summa
  • Valitun päivän kirjaukset näkyvät listana
  • Viikkoja voi selailla eteen ja taakse

Luodaan tyhjä PowerApps puhelin-layoutilla.

Näyttökuva 2019-6-5 kello 19.38.24.png

Viikkokalenteri

Tehdään viikonpäivistä kokoelma (colWeek), joka sisältää

  • Viikonpäivän numeron (maanantai = 0, tiistai = 1 jne) (weekDayId)
  • Viikonpäivän lyhenteen (day)

Näyttökuva 2019-6-9 kello 12.27.48.png

Lisätään näytölle vaakasuuntainen galleria.

Näyttökuva 2019-6-5 kello 19.46.11.png

Galleriassa esitetään kokoelman (colWeek) sisältö. Lisätään galleriaan kentäksi viikonpäivän lyhenne.

Näyttökuva 2019-6-5 kello 19.48.49.png

Seuraavaksi päivämääräjumppaa. Selvitetään sovelluksen käynnistyessä kuluvan viikon viikkonumero. Tallennetaan se omaan muuttujaan (varCurrentWeekNumber).

Näyttökuva 2019-6-5 kello 19.52.49.png

Tallennetaan toiseen muuttujaan (varFirstDayOfWeek) kuluvan viikon ensimmäinen päivä.

Set(varFirstDayOfWeek;
    Today() - Weekday(Today();StartOfWeek.Monday) + 1
   )

Nyt voimme laskea kunkin viikonpäivän päivämäärän aina kaavalla

varFirstDayOfWeek + ThisItem.weekDayId

Viikkojen välillä navigoiminen

Lisätään näytölle otsikkopalkki, johon lisätään seuraavat elementit

  • Viikkonumeron kertova otsikko
  • Ikonit, joilla siirrytään edelliselle / seuraavalle viikolle

Näyttökuva 2019-6-5 kello 20.09.19.png

Seuraavalle viikolle siirryttäessä (= ikonia painettaessa)

  • kasvatetaan viikkonumeroa yhdellä
  • kasvatetaan viikon ensimmäistä päivää seitsemällä (päivällä)

Näyttökuva 2019-6-5 kello 20.11.46.png

Edelliselle viikolle siirtyminen tapahtuu luonollisesti päinvastoin.

Voimme liikkua viikolta toiselle, valita vapaasti kalenterista viikonpäivän. Ja aina laskea kyseisen päivän päivämäärän.

Valitun ja kuluvan päivän korostaminen

Mikäli joku viikonpäivistä on kuluva päivä, korostetaan se vihreällä värillä.

Näyttökuva 2019-6-5 kello 20.37.32.png

Valittu päivä taas korostetaan vihreällä ympyrällä. Lisätään galleriaan sellainen.

Näyttökuva 2019-6-5 kello 20.42.08.png

Ympyrä on näkyvillä ainoastaan, mikäli päivä on valittuna.

Visible : ThisItem.IsSelected

Asetetaan ympyrä sopivalle kohtaa, sekä vaihdetaan viikonpäivän lyhenne valkoiseksi, mikäli päivä on valittu.

Lopputulos näyttää tältä.

Näyttökuva 2019-6-5 kello 20.47.16.png

Tuntien syöttölomake

Luodaan toinen näyttö, jolle lisätään lomake.

Lomakkeen tietolähteeksi (data source) valitaan Common Data Service.

Näyttökuva 2019-6-5 kello 20.50.20.png

Poimitaan käytettäväksi entiteetiksi projektin tuntikirjaukset (ProjectHours).

Näyttökuva 2019-6-5 kello 20.51.54.png

Lisätään halutut kentät lomakkeelle ja poistetaan kaikki turhat.

Näyttökuva 2019-6-5 kello 20.55.23.png

Projekti-kenttä on samantien virheessä. Ei lupaa hyvää.

Pieniä lastentauteja vielä… Projektit-alasvetovalikon sisältö (Items) on

Items: Choices(ProjectHours.crd01_Project)

Vaihdetaan sen tilalle

Items: Choices(ProjectHours.Project)

Ja taas mennään. Nyt lomakkeella voi valita projektin, johon kirjaukset liittyvät.

Näyttökuva 2019-6-5 kello 21.01.06.png

Mutta miten saisimme valitun projektin tehtävät (tasks) näkymään omassa alasvetovalikossaan?

SharePoint-listalla tai SQL-kannalla se tehtäisiin näin.

Näyttökuva 2019-6-6 kello 13.29.06

Mutta CDS on fiksumpi. Laitetaan seuraava (preview) ominaisuus päälle.

Näyttökuva 2019-6-9 kello 21.03.11.png

Tämän jälkeen tehtävät sisältävän alasvetovalikon sisältö voidaan määritellä seuraavasti.

Näyttökuva 2019-6-9 kello 21.05.02.png

Eli näytämme valittuun projektiin liittyvät tehtävät.  Siistiä!

Lomakkeen viimeistely

Tehdään lopuille kentille seuraavat toimenpiteet.

Otsikoksi (name) tallennetaan aina käyttäjän sähköposti ja kuluva hetki.

User().Email & " " & Now()

Päivän (workDay) oletusarvona on

  • olemassa olevaa muokatessa aiemmin tallennettu arvo
  • uutta lisätessä aloitusnäytön kalenterista valittua päivää vastaava päivämäärä
Default: If(Form1.Mode = FormMode.Edit; 
            Parent.Default;
            varFirstDayOfWeek + galWeekDays.Selected.weekDayId)

Kirjauspäivästä tallennetaan ainoastaan päiväys (oletuksena tallennetaan myös valittu kellonaika).

Lopuksi käyttäjältä piilotetaan seuraavat kentät

  • otsikko
  • päivään liittyvät tunti- ja minuuttikentät

Näyttökuva 2019-6-6 kello 13.37.14.png

Siistitään kenttien ulkoasua ja lisätään sivulle otsikko, sekä peru- ja tallenna-painikkeet.

Näyttökuva 2019-6-6 kello 13.45.21.png

Aloitusnäytön tuntilista

Valitun päivän kirjaukset halutaan näyttää aloitussivulla. Lisätään toinen galleria, jonka tietolähteenä on kirjatut tunnit (projectHours). Riveillä näytetään

  • Projekti
  • Projektin tehtävä
  • Kirjauskommentti
  • Tuntimäärä

Näyttökuva 2019-6-6 kello 13.52.14.png

Galleriassa näytetään käyttäjän tunnit valitulta päivältä. Delegoitavuuden vuoksi  käyttäjän sähköposti tulee tallentaa muuttujaan sovelluksen käynnistyessä (App OnStart).

Set(varCurrentUserEmail;User().Email)

Nyt voimme tehdä halutun rajauksen.

Items = Filter(ProjectHours;WorkDay = 
              (varFirstDayOfWeek + galWeekDays.Selected.weekDayId)
              And 
              'Created By'.'Primary Email' = varCurrentUserEmail)

Riviä painamalla siirrytään muokkaamaan kyseistä kirjausta.

Näyttökuva 2019-6-6 kello 14.24.57.png

Jotta muokkaus toimii, tulee lomakkeella määritellä mitä riviä muokkaustilassa muokataan.

Eli galleriasta valittua riviä.

Näyttökuva 2019-6-6 kello 14.26.23.png

Päivän kirjausten summa

Lisätään viikkokalenteriin kenttä, jossa esitetään viikonpäivän tuntikirjausten kokonaissumma.

Näyttökuva 2019-6-9 kello 13.06.01Vielä kun piilotetaan otsikot, joissa ei ole ollenkaan tunteja (Visible: lblDayHours.Text = ”h”), näyttää lopputulos tältä.

Näyttökuva 2019-6-6 kello 14.35.06.png

Uuden kirjauksen tekemiseksi tarvitaan painike. Muotoillaan se ympyräksi.

Näyttökuva 2019-6-6 kello 14.37.17.png

Loppusilauksena lisätään näytölle kannustava kuva ja teksti, jotka näkyvät ainoastaan mikäli päivälle ei ole tehty yhtään kirjausta.

Näyttökuva 2019-6-6 kello 14.47.56.png

Valmista!

Ongelmia…

Kaikki on mennyt tähän asti kuin tanssi (melkein, ihan kaikkea en ole kertonut). Mutta kun avaan sovelluksen puhelimella, ilmestyy näyttöön virhe.

img_3cad1b5cb181-1.jpeg

Sovellus yrittää hakea CDS for Appsista tietoja, ennen kuin App OnStart:ssa alustetut muuttujat (varFirstDayOfWeek ja varCurrentUserEmail) ovat saaneet arvot.

Näyttökuva 2019-6-6 kello 15.12.45.png

Olen törmännyt tähän ongelmaan ennenkin. Jostain syystä aina CDS:n kanssa.

Onneksi PowerAppsin asetuksista löytyy lisäasetus (”Käytä OnStart sääntöä, joka ei estä”). Ongelma katoaa kytkemällä tämän asetuksen pois päältä.

Näyttökuva 2019-6-6 kello 15.14.02.png

Tai niin sitä luulisi.

Päädyin lopulta vähemmän tyylikkääseen ratkaisuun, jossa gallerioiden sisältöjä ei täytetä ollenkaan, mikäli tarvittavissa muuttujissa ei ole (vielä) arvoja.

Näyttökuva 2019-6-7 kello 18.14.47.png

Kaikesta huolimatta sovellus toimii mukavasti ja sen tekeminen oli mukavaa, nopeaa ja helppoa.

Kuten PowerAppsit aina.