Jatketaan viime viikolla aloitetulla teemalla, eli Dataverse for Teamsilla (entinen Project Oakdale). Sen myötä yhä useammat Power Appsit tulevat käyttämään tietovarastona Dataverse for Teamsin tarjoamaa versiota Dataversestä (entisestä CDS:stä).

Mutta miten Power Apps tekeminen muuttuu, kun tutun SharePointin sijasta käytetäänkin Dataversea?

Se selviää nyt.

Esimerkki – Tehtävälista

Havainnollistetaan näiden kahden käytön eroja yksinkertaisella esimerkillä. Haluamme ylläpitää tehtäviä (ToDo). Kullakin tehtävällä on

  • Otsikko (Title)
  • Kuvaus (Description)
  • Tehtäväluokka (Category)
  • Määräpäivä (Deadline)
  • Tila (Status)
  • Omistaja (Assigned to)
  • Tieto siitä, onko kyseessä korkean prioriteetin tehtävä (High Priority)

Lisäksi kuhunkin tehtäväluokkaan liittyy kuvaus (description) ja vastuuhenkilö (responsible person).

Tietomalli – SharePoint

SharePointia käytettäessä tietomalli näyttää seuraavalta.

  • Tila on tyypiltään choice
  • Tehtäväluokkia ylläpidetään omassa listassaan, johon ToDo-listasta viitataan käyttäen tehtäväluokan ID:tä (köyhän miehen relaatio).

Tehtävät sisältävä SharePoint-lista näyttää käytännössä tältä.

Tietomalli – Dataverse for Teams

Dataversen kanssa tietomalli on hieman laajempi.

  • Tila on tyypiltään choice. Sen arvojoukko tallennetaan tehtävä-taulusta erilleen
  • Tehtävän ja tehtäväluokan välillä on aito relaatio (1:n eli ns Lookup)
  • Myös tehtävän ja sen suorittajan (Assigned to) välillä on relaatio.

Tehtävät sisältävä taulu sisältöineen näyttää tältä.

Käyttäjät

Pysähdytään kuitenkin ensimmäiseksi käyttäjiin. Dataversen tietomallissa käyttäjille on pyhitetty oma taulu. Miksi?

Koska Dataverse on täysiverinen xRM-alusta ja sillä on oma käyttäjähallinta! Nyt on hyvä hetki lukea aikaisempi juttuni CDS – Lyhyt oppimäärä Office 365/SharePoint -konsultille, mikäli et ole sitä jo tehnyt.

Tärkeintä on ymmärtää, ettei Power Appsista tuttu User() ole sama olio, kuin samaisen käyttäjän Dataverseen tallentaman rivin luoja (Created by).

Ensimmäinen on Office 365 (AzureAD) käyttäjä. Jälkimmäinen on samaa henkilöä vastaava Dataverse-käyttäjä. Tässä nimenomaisessa ympäristössä.

Selkeää?

Jatketaan silti.

Tehtäväluokat ja niihin liittyvät tehtävät

Lisätään Power Appsiin galleria, josta käyttäjä valitsee tehtäväluokan. Gallerian viereen lisätään toinen galleria, jossa näytetään kaikki valitun tehtäväluokan tehtävät.

SharePoint

Jälkimmäisen gallerian items-ominaisuus on tuttuun tapaan seuraava.

Items: Filter(ToDO, ToDoCategoryId = galToDoCategories_SPS.Selected.ID)

Eli suodatamme tehtäviä valitun kategorian perusteella.

Dataverse for Teams

Mikä muuttuu, kun tehtävät onkin tallennettu Dataverseen?

Voit lähestyä ongelmaa aivan samaan tapaan suodattamalla tehtäviä.

Items: Filter(ToDos, Category.'ToDo Category' = galToDoCategories_CDS_1.Selected.'ToDo Category')  

Huom! Dataversessä tietueen tunniste (GUID) löytyy taulun kanssa samannimisestä sarakkeesta (yllä ToDo Category). ID (tai GUID) saraketta sieltä on turha etsiä.

Kiitos relaatiomallin, samaan lopputulokseen päästään myös paljon helpommalla. Ensimmäisestä galleriasta on jo valittu tehtäväluokka. Jälkimmäisessä galleriassa voidaan näyttää suoraan kyseiseen luokkaan liittyvät tehtävät!

Items: galToDoCategories_CDS.Selected.ToDos

Jälkimmäinen tapa unohtuu todella helposti, mikäli on tottunut käyttämään tietovarastona SharePointia. Meidät on vuosien aikana ehdollistettu käyttämään kaikkeen suodatusta (filter).

Uuden tehtävän lisääminen (Patch)

Seuraavaksi luomme uuden tehtävän Patch-komennolla.

SharePoint

SharePointin kanssa homma on suoraviivaista. Kahden listan välinen relaatio on käytännössä vain numerosarake (ToDoCategoryID).

Patch(ToDO,
      Defaults(ToDO),
      {
        Title: "New task",
        ToDoCategoryId: 2,
        Status: {Value: "New"},
        'High priority':false
      }
)

Prioriteetti on tyypiltään boolean ja Status taasen choice. Helppoa.

Jos et keksi, miten joku SharePointin tietotyypeistä tallennetaan Patch-komennolla, suosittelen lunttaamaan Matthew Devanyn mainiosta postauksesta.

Dataverse for Teams

Sama toimenpide Dataverseä vasten näyttää seuraavalta.

Patch(ToDos,
      Defaults(ToDos),
      {
        Name: "New task",
        Category: LookUp('ToDo Categories', Name ="Work"),
        'Status (cr111_status)': 'Status (ToDos)'.New,
        'High Priority': 'High Priority (ToDos)'.No
      }
)

Relaatio uuden tehtävän ja tehtäväluokan (ToDo Category) välille syntyy näppärästi määrittelemällä Lookup-sarakkeen (Category) arvoksi haluttu ToDo Category objekti.

Status ja High Priority -sarakkeet ovat molemmat tyypiltään valintoja (choice).

Miksi status-sarake on kryptisessä muodossa ’Status (cr111_status)’?

Koska Dataversen tauluissa on jo vakiona Status-sarake. Sen arvo on joko aktiivinen tai passiivinen. Samannimiset sarakkeet erotetaan toisistaan suluissa näkyvän sisäisen nimen avulla.

Olisi pitänyt keksiä omalle status-sarakkeellemme parempi nimi…

Omat tehtäväni

Haluamme seuraavaksi näyttää käyttäjälle kaikki hänelle nakitetut tehtävät.

SharePoint

SharePointilla teemme mitä voimme. Eli suodatamme tehtäviä Assigned to -tiedon perusteella.

Items: Filter(ToDO, 'Assigned to'.Email = varCurrentUserEmail)

Delegointia välttääksemme olemme tallentaneet käyttäjän sähköpostin (App OnStart:ssa) muuttujaan (varCurrentUserEmail).

Dataverse for Teams

Dataversen kanssa vaihtoehtoja onkin paljon enemmän. Voimme suodattaa tehtäviä käyttäjän sähköpostiosoitetta hyödyntäen.

Items: Filter(ToDos, 'Assigned To'.'Primary Email' = varCurrentUserEmail)

Tai voimme selvittää (App OnStart:ssa) AzureAD käyttäjää vastaavan CDS käyttäjän (varCDSUser)

Set(varCDSUser, LookUp(Users, 'Primary Email' = varCurrentUserEmail))

ja suodattaa tehtäviä sillä.

Items: Filter(ToDos, 'Assigned To'.User= varCDSUser.User)

Tosin tällöin on luontevampaa käyttää relaatiomallia hyväksi ja näyttää galleriassa käyttäjän käyttäjäobjektiin liittyvät tehtävät.

Items: varCDSUser.'ToDos (user_cr111_todo)'

Paras on kuitenkin vielä jäljelä. Nimittäin näkymät.

Näkymät (Views)

Siirrytään Build -> See All ja kaivetaan esiin ToDo-taulun näkymät (Views).

Luodaan uusi näkymä (Add view). Ja annetaan sille sopiva nimi.

Meille avautuu näkymäeditori. Lisätään sarakkeet, jotka haluamme näkymäämme mukaan. Huomaa että voit ottaa näkymään sarakkeita myös relaation takaa. Et kuitenkaan useamman kuin yhden relaatiohypyn takaa.

Lisätään näkymään suodatin oikean reunan Edit filters -linkistä. Määritellään yksinkertainen ehto, jolla näkymä sisältää ainoastaan tehtävät, jotka on nakitettu käyttäjälle.

Lopuksi Save ja Publish!

Näkymät voivat ja usein ovatkin paljon monimutkaisempia. Voit tehdä esimerkiksi näkymän, joka sisältää

  • minulle määritellyt tehtävät
  • jotka eivät ole valmiita
  • jotka on joko
    • luotu +30 päivää sitten ja prioriteetti on normaali TAI
    • luotu +10 päivää sitten ja prioriteetti on korkea
  • joiden luokka on ”Work”

Näkymien avulla saat yksinkertaistettua Power Appsiasi siirtämällä monimutkaiset hakuehdot suodatuskomennoista näkymiin. Ja kun myöhemmin model driven Appsit tulevat myös Dataverse for Teamsiin, voit hyödyntää samoja näkymiä niissä.

Näkymää käyttäen gallerian Items onkin

Items: Filter(ToDos, 'ToDos (Views)'.'My ToDos')

Voit täydentää näkymää omilla lisäsuodatuksilla.

Items: Filter(ToDos, 'ToDos (Views)'.'My ToDos', Category.Name = "Work")

Kaikilla kuvatuilla menetelmillä lopputulos on sama.

Yhteenveto

Mikäli olet tehnyt Power Appseja SharePoint-listojen päälle, ei siirtyminen Dataverseen ole suuri ponnistus.

Muista vain aluksi seuraavat.

  • Osa tutuista sarakkeiden nimistä vaihtuu (Title > Name jne)
  • ID-saraketta ei ole. Rivin tunniste löytyy taulun kanssa samannimisestä sarakkeesta.
  • Choice-tyyppisiä sarakkeita käsitellään hieman eri tavalla
  • Hyödynnä relaatioita. Pääset kaikkialla hyppimään taulusta seuraavaan! Kurkkaa aina mitä pisteen takana on tarjolla. Sieltä löytyy yksittäisten arvojen sijasta nyt myös rivejä.
  • Hyödynnä näkymiä