Yksi Dataversen hienouksista on, että sillä voi määritellä taulujen välille helposti erilaisia suhteita (relationship). Näitä suhteita (1:n tai n:n) hyödyntämällä voi taas luoda nopeasti hyvinkin monimutkaisia mallipohjaisia (model-driven) sovelluksia.

Mutta tämä ei jää tähän. Dataverse tarjoaa työkaluja myös tiedon viite-eheyden varmistamiseksi. Tällä kertaa tutustutaan hieman niihin.

Esimerkki – Tilaussovellus

Käytetään esimerkkinä yksinkertaista tilaussovellusta. Meillä on tilauksia (Order) ja

  • Tilauksiin liittyy aina yksi asiakas (Account)
  • Tilauksiin liittyy nolla, yksi tai usea tilausrivi (Order Item)
  • Tilausriviin liittyy aina yksi tuote (Product)

Kuvana jotain tällaista.

Käytetyt taulut näyttävät seuraavilta. Taulujen väliset suhteet määritellään Lookup-sarakkeilla.

Tilaukset:

Tilausrivit:

Tuotteet:

Asiakas-tauluna käytetään Dataversen vakiotaulua (Account).

Luodaan mallipohjainen sovellus tilausten ylläpitoon.

Tilaukset:

Yksittäinen tilaus tilausriveineen:

Asiakas on määritelty tilauksen pakolliseksi tiedoksi. Näin tilauksia ei voi luoda ilman tilaukseen liittyvää asiakasta.

Tilauksen ja sen rivien luominen on nopeaa. Alusta huolehtii automaattisesti siitä että tilausriviin liittyy aina olemassaoleva tuote ja riville on määritelty määrä (quantity) ja yksikköhinta (unit price).

Hienoa!

Mutta onko kaikki nyt hoidossa?

Ei välttämättä.

Tuoteen tai asiakkaan poistaminen

Havaitsemme tuotteen (Product 1) olevan virheellinen ja sen kummemmin ajattelematta poistamme sen.

Ja hups, meillä on järjestelmässä tilauksia, joiden tilausrivit eivät ole enää eheitä. Niistä puuttuu pakollinen tuotetieto.

Sama on mahdollista myös asiakkaan kohdalla. Poistetaan epähuomiossa koko asiakas ja meillä on järjestelmässä jälleen puutteellinen tilaus.

Tällaisen tilanteen tulisi olla poikkeuksellinen. Tietueita tyypillisisesti passivoidaan (deactivate), ei poisteta (delete). Mutta myös poistamiseen on hyvä varautua.

Avataan tuoterivi (Order item) taulun suhteet (relationships) ja sieltä tuote (Product).

Kiinnostava osuus löytyy suhteen käyttäytymisestä (Type of behaviour). Oletuksena suhde toimii kuten viittaus (Referential) ja viittauksen takana olevien rivien poistaminen on sallittua (Delete = Remove Link).

Haluamme kuitenkin estää viittauksen kohteena olevien tietueiden poistamisen. Asetetaan Deleten arvoksi Restrict.

Huomaa, että tämä sama suhde löytyy myös Tuote (Product) -taulusta. Tekemämme muutos näkyy myös siellä, sillä kyseessä on sama tieto. Se vain esitetään molempien taulujen yhteydessä.

Kokeillaan!

Meillä on tilaus, joka sisältää tuotteita Product 1 ja Product 2.

Yrittäessämme poistaa Product 1:n, saamme virheilmoituksen.

Tuotetta ei voi enää poistaa, mikäli se on mukana yhdessäkään tilauksessa.

Sama rajoitus oli järkevää tehdä myös tilauksen asiakkaalle.

Kokonaisen tilauksen poistaminen

Seuraavaksi poistetaan tilaus. Helppoa!

Tarkastellessamme tämän jälkeen tilausrivejä, havaitsemme että ainoastaan tilaus poistettiin. Järjestelmään jäi kaikki poistettuun tilaukseen liittyneet tilausrivit.

Näistä tilausriveistä puuttuu nyt tieto, mihin tilaukseen ne liittyvät. Kyseistä tilausta kun ei enää ole.

Ei hyvä.

Voimme estää tämänkin.

Mikäli käyttäisimme samaa menetelmää kuin tuotteiden kanssa, joutuisimme tilausta poistettaessa ensin poistamaan kaikki sen tilausrivit.

Mahdollinen lähestyminen sekin.

Voimme myös asettaa tilausten ja tilausrivien välisen suhteen toimivan kuten ylätaso (Parental). Eli tässä tapauksessa tilausriville tehdään sama kuin tilaukselle.

Nyt käyttäjän poistaessa tilauksen, myös kaikki tilaukseen liittyvät tilausrivit poistetaan.

Kas näin.

Jälleen on kuitenkin hyvä miettiä, missä tilanteessa tilauksia aidosti poistetaan passivoinnin sijasta.

Suhteen käyttäytymisen tarkempi määrittely

Mikäli nämä kaksi esitettyä toiminnallisuutta eivät riitä, voit määritellä suhteen käyttäytymisen toimintokohtaisesti (Delete, Assign, Share, Unshare ja reparent). Tällöin käyttäytymiseksi (Type of behaviour) valitaan Custom.

Kullekkin toiminnolle (Delete, Assign jne) löytyy omat vaihtoehtonsa.

Entäs canvas Power Apps?

Miten tehdyt muutokset vaikuttavat canvas Power Appsiin?

Luodaan Power Apps, joka esittää tilaukset galleriassa. Tilauksen voi poistaa roskakoria klikkaamalla.

Olemme määritelleet tietomalliimme, ettei tilauksia voi poistaa mikäli niihin liittyy tilausrivejä (Delete = Restricted).

Käyttäjän yrittäessä poistaa tilausta johon liittyy tilausrivejä, palauttaa Power Apps virheen.

Canvas Power Appsia tehdessä tulee nämä rajoitukset ottaa aina huomioon. Esimerkiksi piilottaa tilauksen poisto-toiminto, mikäli tilaukseen liittyy rivejä.

Älä kuitenkaan tee sitä laskemalla tilaukseen liittyviä rivejä galleriassa. Tällöin käytännössä haet aina galleriassa näkyvien tilausten kaikki tilausrivit.Voi hidastaa gallerian renderöintiä melkoisesti.