Dataverseä hyödyntävää canvas Power Appsia tehtäessä tulee pitää mielessä, että käyttäjiä on itseasiassa kaksi.

  1. Power Appsia käyttää AAD-käyttäjä
  2. Dataverseä käyttää kyseistä AAD-käyttäjää vastaava Dataverse-käyttäjä

Ja nämä ovat eri asioita.

Välillä sovellusta rakentaessa tulee tarve selvittää Power Appsin käyttäjää vastaava Dataverse-käyttäjä. Käydään seuraavaksi läpi, miten tämän voi tehdä.

Näkymät

Aluksi kuitenkin muistutus näkymien hyödyntämisestä. Mikäli haluamme suodattaa Dataversen rivejä käyttäjän perusteella, voimme käyttää tähän näkymää. Meidän ei tarvitse kaivaa esille käyttäjää vastaava Dataverse-käyttäjää.

Luodaan project-tauluumme näkymä (My Projects), joka sisältää ainoastaan käyttäjän luomat projektit (Created By Equals current user).

Näkymää voi käyttää Power Appsissa suodattimena (filter).

Ei ollut vaikeaa.

Valitettavasti näkymiä ei voi aina hyödyntää. Esimerkiksi lisätessä Patch-komennolla uutta tietuetta, joka sisältää viittauksen (LookUp) käyttäjä (User) -kenttään. Tällöin tarvitsemme tietoomme käyttäjää vastaavan Dataverse-käyttäjän.

Mitäs silloin tehdään?

Dataverse-käyttäjän selvittäminen ensisjaisen sähköpostin avulla

Voimme hakea käyttäjän Dataversen käyttäjä (Users) -taulusta käyttäjä ensisijaisen sähköpostiosoitteen (Primary Email) perusteella. Eli käyttäjä, jonka sähköposti on sama kuin sovellusta käyttävän käyttäjän (User()) sähkposti.

Asetetaan löydetty Dataverse-käyttäjä muuttujaan (varCurrentDataverseUser).

Set(varCurrentDataverseUser, LookUp(Users, 'Primary Email' = User().Email))

Nyt voimme suodattaa gallerian näyttämään ainoastaan käyttäjän luomat (Created By) projektit.

Tai voimme luoda tietueita, jotka sisältävät viittauksen käyttäjään. Esim:

Patch(Projects, Defaults(Projects),{Name: "Timon projekti", ProjectManager: varCurrentDataverseUser}) 

Dataverse-käyttäjän selvittäminen AAD-tunnuksen Id:n avulla

Mutta mutta…

Joskus User().Mail -komennon palauttama sähköposti on eri kuin Dataverse-käyttäjän ensisijainen sähköposti. Tällöin käyttäjää ei löydy ja kaikki menee pieleen.

Varmempi tapa selvittää käyttäjä onkin seuraava.

  • Haetaan (MyProfileV2()-komennolla) käyttäjän AAD-tunnuksen id
  • Haetaan Dataverse-käyttäjä löydetyn id:n perusteella (Azure AD Object ID -kenttä)

Eli näin.

Set(varCurrentUserAADId,Office365Users.MyProfileV2().id);
Set(varCurrentDataverseUser, LookUp(Users, 'Azure AD Object ID' = GUID(varCurrentUserAADId)))

Menetelmä on hieman hitaampi (yksi kysely enemmän) ja sitä varten sovellukseen tulee ottaa mukaan Office365Users -liitin (connector).

Mutta toimii aina.

Vai toimiiko?

Vieraskäyttäjät

Ai niin. Ne vieraskäyttäjät…

Yllätykseksemme Office365Users.MyProfileV2() -komento palauttaa vieraskäyttäjästä pelkkää tyhjää. Esimerkiksi käyttäjän sähköposti näkyy nätisti sisäisellä käyttäjällä.

Mutta vieraskäyttäjällä sisältö on tyhjä.

Mutta jos rajaat haun kattamaan vain tietyt sarakkeet, se toimii! Esimerkisi ainoastaan sähköpostin (mail).

Nyt liitin palauttaa myös vieraskäyttäjan sähköpostiosoitteen.

Dataverse-käyttäjän selvittäminen näyttää lopulta tältä.

Set(varCurrentUserAADId,
    Office365Users.MyProfileV2({'$select': "id"}).id); 
Set(varCurrentDataverseUser, 
    LookUp(Users, 'Azure AD Object ID' = GUID(varCurrentUserAADId)))

Toimii sekä tavallisilla- että vieraskäyttäjillä.

Dataverse-käyttäjän selvittämien näkymän avulla

Dataverse-käyttäjän voi selvittää aina myös näkymän avulla.

Luodaan käyttäjät (Users) -tauluun näkymä Current User. Näkymä sisältää ainoastaan nykyisen käyttäjän.

Power Appsissa haetaan muuttujaan tämän näkymän ensimmäinen (ja ainoa) rivi. Se sisältää Power Appsia käyttävän käyttäjän.

Set(varCurrentDataverseUser,First(Filter(Users,'Users (Views)'.'Current User')))

Toimii aina, emmekä tarvitse Office365Users-liitintä.