Perheemme auto vaihtui joulukuussa yksityisleasingiin. Sopimus kestää vuoden ja kattaa 15 000 kilometriä. Se ei tule aivan riittämään. Ylimääräisten kilometrien ollessa varsin arvokkaita, haluan seurata kilometrimäärän täyttymistä.
Mutta miten sen tekisi?
Vaihtoehto 1 – Excel
Tein ensin Excelin, johon laskin paljonko voimme keskimäärin ajaa kuukaudessa ja mitä mittarilukeman pitäisi näyttää kuun lopussa. Viereen kun syöttää toteuman niin näkee missä mennään.
Kuka muistaa ottaa mittarilukeman ylös joka kuun viimeinen päivä?
Ei kukaan.
Tein toisen Excelin, johon laskin oletetun mittarilukeman vuokrakauden jokaiselle päivälle. Nyt voin lisätä toteutuneen mittarilukeman mille tahansa päivälle ja näen miten toteuma suhtautuu ennusteeseen.
Kävisin autossa kirjaamassa ylös mittarilukeman ja tulisin kotiin naputtelemaan sen Exceliin?
Jep. Kuulostaa hieman ysäriltä.
Tehdään tämä kunnolla tai ei tehdä ollenkaan.
Vaihtoehto 2 – Kännykällä käytettävä Power Apps
Haluan mobiilisovelluksen, jolla voi autossa olessaan nopeasti kirjata mittarilukeman. Sovellus näyttää saman tien olenko ajamassa yli vai alle vuosikilometrirajani.
Koska tykkään seurata kaikkia kustannuksia, haluan tallentaa sovelluksella tiedot myös
- kotona ladatun sähkön määrästä (kwh lukema autopaikan tolpasta)
- latauspisteillä lataamastani sähköstä (määrä ja kustannus)
- ilmaiseksi lataamani sähköstä (Lidl, Motonet, IKEA jne)
Näiden avulla voi laskea jo kaikkea kivaa.
Käyttöliittymä
Kuvittelen tietäväni mitä haluan, joten voimme aloittaa suoraan käyttöliittymästä. Sovelluksen aloitusnäyttö voisi näyttää tältä.
Näytöllä ei ole erikseen ”Lisää” painikkeita. Luvut pääsee syöttämään arvoja painamalla.
Kilometrilukeman syöttäminen voisi näyttää tältä.
Ladatut sähköt syötetään samannäköiseltä näytöllä.
Nyt kun tiedetään mitä halutaan, voidaan miettiä mitä tietoja sovellus tarvitsee (parametrit) ja mitä se tallentaa.
Tietojen tallennuspaikka – Common Data Service
Sovellus ei tule tallentamaan hurjia määriä rivejä, eikä sen tietomalliin tule edes relaatioita. Selvää SharePoint tavaraa.
Vai onko?
Käytetään kuitenkn tietovarastona Common Data Serviceä (CDS). Seuraavista syistä:
- Voin laskea päiväkohtaisen käytössä olevan kilometrimäärän suoraan tietovarastossa. Näin sovelluksesta tulee yksinkertaisempi.
- Haluan jatkossa tehdä tiedoista Power BI -raportin ja upottaa sen Power Appsiin. CDS:n roadmapilla olevalla Direct Query -yhteydellä voin tehdä raportista reaaliaikaisen. SharePointin kanssa tämä ei ole mahdollista.
Luodaan CDS:ään seuraavat entiteetit.
Leasing parametrit
Parametritietue sisältää yhden leasingauton sopimustiedot, joita sitten mobiilisovellus hyödyntää laskennassa.
- Nimi
- Sopimuksen alkupäivä
- Sopimuksen loppupäivä
- Sopimuksen kesto päivinä (lasketaan: sopimuksen loppupäivä – sopimuksen alkupäivä)
- Mittarilukema sopimuksen alussa
- Sopimuksen kilometrit
- Keskimääräiset kilometrit per päivä (lasketaan: sopimuksen kilometrit / sopimuksen kesto päivinä)
- Kotona ladattavan sähkön hinta (senttiä/kWh)
Teemme ratkaisun ainoastaan minun käyttööni, mutta se on helposti laajennettavissa usean käyttäjän käytettäväksi. Jokaisella käyttäjällä (tarkemmin ottaen ajoneuvolla) olisi tällöin oma parametritietueensa.
Omani näyttää tältä.
Leasing kilometrilukemat
Tärkein entiteetti. Ja yksinkertaisin. Tänne tallennetaan mittarilukemat.
Entiteetin kentät ovat.
- Kilometrilukema
- Kirjauspäivä (tietueen luontipäivä)
Leasing lataukset
Lataus-entiteettiä käytetään lataustapahtumien tallentamiseen. Samaa entiteettiä käytetään niin kotona kuin muuallakin tehtyjen latausten kirjaamiseen.
Entiteetin kentät ovat.
- Latauspäivä
- kWh määrä
- Latauskustannus
- Latauspaikka (koti, maksullinen, ilmainen)
Tietomalli on valmis. Voimme siirtyä toteutukseen.
Power Apps – Aloitusnäyttö
Lisätään Power Appsin tietolähteiksi juuri luomaamme entiteetit (Näytä – Tietolähteet -> etsi ja klikkaa).
Leasingsopimuksen tietoja (auton mittarilukema sopimuksen alussa jne) tarvitaan useassa paikassa, joten ladataan ne sovelluksen käynnistyksen yhteydessä (App OnStart) omaan muuttujaansa.
Set(varLeasingParametrit; First('Leasing parametrit'))
Myös viimeisintä tallennettua mittarilukemaa käytetään useassa paikassa. Sen arvo kuitenkin voi muuttua sovellusta käytettäessä, joten tallennetaan se muuttujaan aina kun etusivu näytetään (OnVisible).
Set(varLastOdometerRecord;
Last(Sort('Leasing kilometrilukema';'Created On';Ascending)))
Mittarilukemana näytetään aina tämän muuttujan sisältämä mittarilukema.
Lasketaan seuraavaksi kilometrin vieressä näytettävä toteuman ja ennusteen erotus.
Loogisesti se menee seuraavasti.
- Lasketaan paljonko nyt on ajettu (Mittarilukema nyt – mittarilukema sopimuskauden alussa)
- Vähennetään ajetustä määrästä määrä, jonka olisi laskenallisesti voinut ajaa (monesko sopimuspäivä nyt on * keskimääränien päivittäinen kilometrimäärä)
- Mikäli summa on positiivinen, ollaan ajettu liikaa. Korostetaan tätä + -merkillä
Kaavana sama näyttää hieman monimutkaisemmalta.
With(
{currentdifference:
Round(varLastOdometerRecord.Mittarilukema -
varLeasingParametrit.'Mittarilukema sopimuksen alussa' -
RoundUp(
(varLastOdometerRecord.'Created On' -
varLeasingParametrit.'Sopimuksen alkupäivä' - 1);0
) * varLeasingParametrit.'Keskimääräiset kilometrit per päivä';
0)
};
If(currentdifference > 0;
"(+" & currentdifference & ")";
"(" & currentdifference & ")"
)
)
Korostetaan kilometrien ylitystä vielä värillä. Mikäli luvun etumerkki on miinus, asetataan väriksi punainen. Muutoin luku on vihreä.
Kilometrilukemaa klikkaamalla siirrytään mittarilukeman kirjaamiseen.
Power Apps – Mittarilukeman syöttäminen ja muokkaaminen
Aloitetaan Update-painikkeesta. Mikäli olemme päivittämässä vanhaa kirjausta (varEditHistoryItem muuttuja sisältää arvon), päivitämme sen. Muussa tapauksessa lisäämme uuden kirjauksen.
OnSelect: If(!IsBlank(varEditHistoryItem);
Patch('Leasing kilometrilukema';
varEditHistoryItem;
{Mittarilukema: Value(inpOdometerValue.Text)});
Patch('Leasing kilometrilukema';
Defaults('Leasing kilometrilukema');
{Name: Today();
Mittarilukema: Value(inpOdometerValue.Text)})
);;
Navigate(scrHome;ScreenTransition.None)
Älä hämmenny, emme ole vielä luoneet varEditHistoryItem muuttujaa, se tulee myöhemmin.
Cancel-painikkeella palataan takaisin etusivulle.
Lisätään näytölle galleria, jonka tietolähteenä on Leasing kilometrilukema -entiteetti. Gallerian ainoassa tekstikentässä esitetään mittarilukema ja kirjauspäivä (tietueen otsikko).
ThisItem.Mittarilukema & "km (" & ThisItem.Name & ")"
Käyttäjän klikatessa riviä, tallennetaan se muuttujaan (varEditHistoryItem).
Select(Parent);; UpdateContext({varEditHistoryItem: ThisItem})
Mikäli käyttäjä on valinnut vanhan rivin muokattavaksi, näytetään syöttökentän otsikossa päivä, jonka kirjausta ollaan muokkaamassa.
Text: "Odometer value " & If(!IsBlank(varEditHistoryItem); varEditHistoryItem.Name)
Olemassa olevaa kirjausta muokatessa näytetään tietenkin syöttökentässä oletuksena alkuperäinen arvo.
Vielä kun lisätään mahdollisuus poistaa tehtyjä kirjauksia, alkaa näyttö olemaan valmis.
Power Apps – Lataustapahtumien syöttäminen
Auton lataustiedot tallennetaan hyvin samanlaisella näytöllä, kuin mittarilukema. Erona on
- Riveille tallennetaan lataustapahtuman tyyppi (mittarilukema kotona, maksullinen lataus muualla, ilmainen lataus muualla)
- Lataustapahtuman tyyppi määräytyy sen mukaan, mistä etusivun kohdasta näytolle tullaan
- Maksullisesta latauksesta tallennetaan ladatun kWh määrän lisäksi myös latauksen kustannus
- Mikäli kirjataan mittarilukema kotona, lasketaan kustannukseksi kWh-lukema * sähkön hinta kotona (tieto tallennettu parametritietueeseen)
Skipataan toteutuksen yksityiskohdat, ettei tarina käy tylsäksi ja ala toistamaan itseään.
Power Apps – Etusivun muut osuudet
Kun tietojen syöttäminen on kunnossa, voimme vimeistellä etusivun muut osuudet.
Auton lataaminen kotona
Etusivulla näytetään kotona ladatun sähkön määrä, sekä sen kustannus.
Teksti toimii linkkinä lataustapahtuman syöttönäytölle.
OnSelect: Navigate(scrCharges; ScreenTransition.None; {varChargingType: "Home"; varEditHistoryItem: Blank()})
Näytettävävät luvut ovat
- viimeiseisen mittariluvun kWh lukema
- kyseistä lukemaa vastaava kustannus (laskettu valmiiksi tietojen syöttäminsen yhteydessä: kWh määrä * sähkön hinta kotona (tieto tallennet parametritietueeseen)
Text: With( {item: Last(Filter('Leasing lataukset';Latauspaikka = "Home"))}; item.'Kwh määrä' & "kWh (" & item.Latauskustannus & "€)" )
Maksulliset latauspisteet
Seuraavassa laatikossa kerrotaan paljonko olen ladannut maksullisista latauspisteistä sekä paljonko tähän on mennyt rahaa.
Teksti on jälleen linkki lataustapahtuman syöttönäytölle.
Näytettävän tekstin muodostaminen on nyt pykälää monimutkaisempaa. Nyt lasketaan tietueilta löytyviä lukuja yhteen (SUM funktio).
Text: Text( Sum( Filter('Leasing lataukset'; Latauspaikka = "ChargingStationPaid"); 'Kwh määrä') ) & "kWh (" & Text( Sum( Filter('Leasing lataukset'; Latauspaikka = "ChargingStationPaid"); Latauskustannus) ) & "€)"
Ilmaiseksi ladattu sähkö
Alimpana näytetään ilmaiseksi ladatun sähkön määrä.
Text: Text( Sum( Filter('Leasing lataukset'; Latauspaikka = "ChargingStationFree"); 'Kwh määrä') ) & "kWh"
Ajokustannukset ja kilometriylityksen arvioitu kustannus
Etusivun yläosassa on vielä kaksi kiinnostavaa lukua.
- Paljonko sähköön on kulunut rahaa ajettua 100km kohden
- Paljonko joudun maksamaan lisäkilometreista (30 senttiä/km), mikäli kilometrejä kertyy tähän tahtiin
Jätetään näiden laskeminen kotitehtäväksi.
Yhtenveto
Sovellusta oli hauska tehdä. Tarve oli todellinen ja käytän appsia viikottain. Näen koko ajan miten paljon olen ylittänyt arvioidun kilometrimäärän. Lisäksi näen arvion lisäkilometreista tulevasta lisälaskusta, mikäli jatkan ajamista samaan tahtiin.