Erilaisia kehitystöitä tehdessäni olen aina vihannut kahta asiaa. Aikaleimoja (DateTime-kentät) ja ääkkösiä. Kaltaiseni amatööri sekoilee niiden kanssa toistuvasti.

Aikaleimojen kanssa on nopeasti sekaisiin, kun tiedot tallennetaan käyttäen aikavyöhykettä A ja käyttäjät toimivat aikavyöhykkeillä B ja C. Ja ääkköset nyt on aina jossain pielessä.

Dataversen myötä inhokkilistalleni on päässyt myös valintakentät (Choice, omaa sukua Option Set). Ne toimivat hienosti model-driven appseissa, mutta flow’ssa ja canvas appsissa ovat innokkaat aloittelijat niiden kanssa usein pulassa.

Tänään onkin vuorossa perusteet aiheesta canvas Power Apps ja valintakentät.

Tietomalli

Luodaan harjoitusta varten Dataverseen uusi taulu (MyTable) ja siihen kaksi kenttää.

Ensimmäinen kenttä (Order is paid) on tyypiltään valinta (Choice).

Luodaan sille oma arvojoukko (Order is paid), jonka arvoina on tylsästi Yes ja No.

Luodaan vielä toinen kenttä (Order is ready), joka on tyypiltään kyllä/ei.

Vaikkei jälkimmäinen olekaan tyypiltään valintakenttä, toimii se käytännössä hyvin samalla tavalla. Otetaan se mukaan niin nähdään, onko sen käytössä jotain eroja valintakenttään nähden.

Luodaan seuraavaksi canvas Power Apps ja katsotaan miten tätä valintakenttää siellä käsitellään.

Valintakenttään tallennetun arvon esittäminen lomakkeella

Haluamme muokata lomakkeen avulla olemassa olevaa tietuetta. Tätä varten olemme tallentaneet kyseisen tietueen muuttujaan (varRecord).

Lomakekontrollia käytettäessä kaikki toimii automaattisesti. Kontrollin (Combo box) arvojoukkona on valinnan (choices) arvot.

Oletusvalintana (DefaultSelectecItems) on kenttään tallennettu arvo.

Käyttäjän tekemät muutokset tallentuvat, kun lomake lähetetään (submitForm).

Kaikki on siis hienosti!

Mikäli lomakkeen toteuttaa ilman Forms-kontrollia, tulee valinnan arvojoukko (items) asettaa itse.

Mutta miten saamme esivalittua tietueelle tallennetun arvon?

Luontevaa olisi asettaa DefaultSelectedItems-ominaisuuden arvoksi kenttään tallennettu arvo. Mutta sehän ei kelpaa.

Muuttujamme kykenee näyttämään Order is paid -kentästä ainoastaan tehdyn valinnan nimen (esim ”Yes”).

Kontrolli haluaa oletusarvoksi kuitenkin taulukon. Onhan valinta (Choice) oikeasti tietue. Se sisältää valitun arvon nimen (Name) ja arvon (Value).

Voimme hakea tarvittavan parin valinnasta LookUp-komennolla.

DefaultSelectedItems: LookUp(Choices('Order is paid'), Value = varRecord.'Order is paid')

Kyllä. Tähän kohtaan olen nähnyt useamman kansalaiskehittäjän hyytyneen.

Voimme myös oikaista ja kirjoittaa oletusvalinnan arvon itse. Taulukko, jolla on vaadittava arvo Value.

DefaultSelectedItems = {Value: varRecord.'Order is paid'}

Valintakenttä ja oletusvalinta lomakkeella

Uutta tietuetta luotaessa eivät valintakenttien oletusarvot ole lomakkeella automaattisesti valittuna. Riippumatta siitä käytätkö Forms-kontrollia vai teetkö lomakkeen itse.

Haluamme uutta riviä luodessa alasvetovalikon oletusarvon olevan ”Yes”. Ensimmäinen yritys on luonteva, mutta ei tuota tulosta.

DefaultSelectedItems = 'Order is paid'.Yes

Unohdime jo. Valinta on tietue (nimi ja arvo).

Haluamamme oletusarvo on valintakentän vaihtoehdoista ensimmäinen. Jolloin seuraaava toimii.

DefaultSelectedItems = First(Choices('Order is paid'))

Mutta onhan tämä aika epäselvä tapa valita arvoksi ”Yes”.

Samoin toimii LookUp haku.

DefaultSelectedItems = LookUp(Choices('Order is paid'), Value = 'Order is paid'.Yes)

Sekä itse kirjoitettu arvo.

DefaultSelectedItems = {Value: 'Order is paid'.Yes}

Voimme asettaa halutun arvon myös käsin.

DefaultSelectedItems = {Value: "Yes"}

Oletusvalinta tehdään edelleen oikein. Mutta se ei tallennu oikein. Koska tekemämme oletusvalinta ei ole valintakentän arvo. Se on ainoastaan otsikko ”Yes”.

Siistein tapa tehdä oleusvalinta on mielestäni seuraava.

DefaultSelectedItems = Choices('Order is paid'.Yes)

Valinnan tallentaminen valintakenttään

Lomake-kontrollin kanssa kaikki menee hienosti. Mutta mikäli tallennat tietueen itse (Patch-komennolla) pitää jo vähän tietää mitä tekee.

Vakioarvon tallentaminen

Mikäli haluat tallentaa aina saman arvon, voit tehdä sen näin.

Patch(MyTables,
      Defaults(MyTables),
      {'Order is paid': 'Order is paid'.No, Name:"test record"}
)

Et voi käyttää true / false arvoja. Vaikka tekemäsi arvojoukon arvot ovat tällä kertaa kyllä ja ei, voivat ne alustan näkökulmasta olla mitä vain.

Huom! Mikäli kenttä kuitenkin on tyypiltään Kyllä/Ei, niin voit käyttää true / false arvoja.

Patch(MyTables,
      Defaults(MyTables),
      {'Order is ready': true, Name:"test record"}
)

Mikäli taas käytät Kyllä/Ei kentän samaa syntaksia kuin valintakenttien kanssa, on kentän nimeä hieman vaikeampi löytää. Siinä on taulun nimi mukana.

Patch(MyTables,
      Defaults(MyTables),
      {'Order is ready': Order is ready (MyTables)'.Yes, Name:"test record"}
)

Lomakkeella tehdyn valinnan tallentaminen

Mikäli tallennetaan aina lomakkeella valittu arvo, menee kaava näin.

Patch(MyTables,
      Defaults(MyTables),
      {'Order is paid': cmbOrderIsPaid.Selected.Value, Name:"test record"}
)

Ja nyt tarkkana. Tallennus toimii, mikäli Patchissa käytetty alasvetovalikon oletusarvo on asetettu oikein.

Mutta jos oletusarvo on asetettu käsin pelkkänä merkkijonona (tyyliin {Value: ”Yes”}), niin pieleen menee mikäli käyttäjä ei ole muuttanut alasvetovalikon arvoa.

Luodaan uusi rivi käyttäen oletusarvoa.

Lopuksi tietueelle tallentuu virheellisesti oletusarvo (”No”).

Koska kontrolliin asettamamme oletusarvo ei ollut oikeasti valintakentän arvo. Se tulkitaan tyhjäksi ja käytetään kentälle Dataversessä asetettua oletusarvoa No.

Valintakenttä ja muut kontrollit

Usein on mielekästä käyttää valinan tekemiseen jotain muuta kontrollia kuin alasvetovalikkoa (combo box). Katsotaan vielä lyhyesti miten ne toimivat valintakentän kanssa.

Valintaruutu (checkbox)

Kyllä/Ei -tyyppisten valintojen kohdalla on luontevaa käyttää valintaruutu-kontrollia.

Tällöin valinta on oletuksena tehty, mikäli tallennettu arvo on ”Kyllä”.

Default = varRecord.'Order is paid' = 'Order is paid'.Yes

Mikäli olemme lisäämässä uutta tietuetta, voidaan käyttää normaalisti true/false -arvoja.

Mikäli käytät lomakekontrollia, tulee kentän Update-ominaisuus muokata vastaamaan muutoksia.

Patch-komennolla valinnan tallennus on suoraviivaista.

Patch(MyTables,
      Defaults(MyTables),
      {'Order is paid':  If(chkOrderIsPaid.Value = true,
                            'Order is paid'.Yes, 
                            'Order is paid'.No), 
       Name:"test record"}
)

Valintakytkin (Toggle) toimii samalla logiikalla.

Valintanappi (Radio)

Valinta voidaan toteuttaa myös valintanapin avulla. Sen arvojoukoksi (Items) asetetaan valinta-kentän arvot (Choices).

Olemassaolevan tietuen kohdalla kontrollin oletusarvon asettaminen on suoraviivaista.

Default = varRecord.'Order is paid'

Uutta tietuetta lisätessä oletusarvo määritellään itse. Huomaa että syntaksi onkin eri kuin alasvetovalikkoa (combobox) käytettäessä.

Default = 'Order is paid'.No

Ja vielä tallentaminen.

Lomake-kontrollia käytettäessä tehdään tarvittava muutos kentän Update-ominaisuuteen.

Patch-komennolla valinnan tallennus on jälleen suoraviivaista.

Patch(MyTables,
      Defaults(MyTables),
      {'Order is paid': rdOrderIsPaid.Selected.Value, 
       Name:"test record"}
)

Dropdown-kontrolli toimii samalla logiikalla kuin valintanappi.

Yhteenveto

Mikäli tämä tuntui sekavalta, se johtuu siitä että se myös on sitä. Mutta kyllä ne oikeat kaavat sieltä aina lopuksi löytyy.