Oletko joskus ihmetellyt, mikä tämä Dataversen List rows – toiminnon mystinen Fetch XML Query -ominaisuus on?

Mikäli tulet Dynamics 365 -maailmasta, tämä on sinulle todennäköisesti tuttua. Muussa tapauksessa et ole Fetch XML:stä varmaan koskaan kuullutkaan.

Mikäli työskentelet Dataversen (tai Dataverse for Teamsin) parissa, niin syytä olisi. Fetch XML on nimittäin helppo ja suorituskykyinen tapa tehdä monimutkaisia kyselyitä Dataverseen.

Tutustutaan siihen esimerkin avulla.

Esimerkki – Kirjat ja niiden lainat

Käytetään esimerkkinä aikaisemmasta kirjoituksesta tuttua kirjojen lainaamista.

Tietomallimme on yksinkertainen. Meillä on kirjoja (book), joihin liittyy kirjoittaja (author) sekä 0-n kappaletta lainauksia (booking).

Aloitetaan.

Kentän arvon haku relaation takaa

Kuvitellaan tilanne, jossa käsittelemme flow’n avulla viime vuonna lisättyjä kirjoja (Books). Haemme ensin kirjat ja sitten teemme niille jotain. Tällä kertaa tarvitsemme (syystä jota en ole vielä keksinyt) tietoomme kirjan kirjoittajan (Author) syntymäajan (Date of Birth). Arvo sijaitsee toisessa taulussa, johon kirja-taulusta (Booking) on relaatio.

Yleisin ratkaisu lienee tämä.

Ongelma on tietenkin se, että suoritamme jokaisen kirjan kohdalla ylimääräisen Power Platform palvelupyynnön (Get a row by ID – Author).

Voimme ratkaista tämän hyödyntämällä Expand Query -ominaisuutta (katso esimerkki), mutta helpoimmalla pääsee Fetch XML:ää hyödyntäen.

Avataan mallipohjainen sovellus, jolla kirjoja ja niiden varauksia tarkastellaan. Oikeasta yläreunasta löytyy Advanced Find -toiminto.

Luodaan haku, joka palauttaa viime vuonna lisätyt kirjat.

Lisätään hakutulokseen halutut kentät (Edit Columns).

Valitaan avautuvasta dialogista Add Columns.

Vaihdetaan tauluksi (Record Type) Author ja poimitaan mukaan Date of Birth -kenttä.

Testataan kyselyä painamalla Results.

Näin meillä on haku, jonka tuloksena saadaan sekä kirjan nimi että sen kirjoittajan syntymäaika.

Hakutulokseen voi tietenkin poimia mukaan kaikki tarvitsemansa kentät.

Varsinainen taika piilee kuitenkin hakueditorin viimeisessä ikonissa. Voit ladata luomasi kyselyn Fetch XML -muodossa!

Ladattu kysely näyttää seuraavalta.

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="tp_book">
    <attribute name="tp_bookid" />
    <attribute name="tp_name" />
    <attribute name="createdon" />
    <order attribute="tp_name" descending="false" />
    <filter type="and">
      <condition attribute="statecode" operator="eq" value="0" />
      <condition attribute="createdon" operator="last-year" />
    </filter>
    <link-entity name="tp_author" from="tp_authorid" to="tp_auhtor" visible="false" link-type="outer" alias="a_e8cd14ea7dfbeb1194ef000d3ade7d82">
      <attribute name="tp_dateofbirth" />
    </link-entity>
  </entity>
</fetch>

Syntaksi on yksinkertainen. Siihen on helppoa lisätä itse puuttuvia kenttiä, muokata suodatusehtoja jne.

Ja mikä parasta, voit käyttää tätä flow’n List rows -toiminnossa!

Näin meillä on kaipaamamme kirjailijan syntymäaika käytettävissä flow’ssa ilman ylimääräistä hakua.

Erittäin tehokasta!

Mutta tämä vain paranee…

Summien ja lukumäärien laskeminen (aggregation)

Tiedämme jokaisen kirjan sivumäärän (tp_pages). Miten selvitämme jonkin kirjajoukon sivujen keskiarvon?

Perinteinen lähestyminen olisi seuraava.

  • Haetaan kirjat
  • Käydään kirjat läpi ja lisätään kunkin kirjan sivumäärä muuttujaan (page count total)
  • Lasketaan lopuksi sivujen keskiarvo (page count total jaettuna kirjojen lukumäärällä)

Toimii toki, mutta on isommilla joukoilla tolkuttoman hidasta ja kuluttaa paljon Power Platform palvelupyyntöjä.

Fiksumpaa on suorittaa laskenta Dataversessä. Sekin onnistuu Fetch XML:n avulla. Tällä kertaa joudumme kirjoittamaan xml:n käsin.

  • lisätään alkuun aggregate=”true”
  • määritellään attribuutti, jonka arvo on laskennallinen (tp_pages)
  • kerrotaan mitä laskentaa tehdään (sum, avg, min, max, count)

Tarvittava pätkä näyttää tältä.

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false" aggregate="true">
  <entity name="tp_book">
    <filter type="and">
      <condition attribute="statecode" operator="eq" value="0" />
    </filter>
    <attribute name="tp_pages" aggregate="avg" alias="AveragePageCount"/> 
  </entity>
</fetch>

Ja koko homma hoituu flow’ssa yhdellä toiminnolla.

Toimii!

Rivit, joihin ei ole yhtään viittausta

Viimeisenä käydään läpi esimerkki, jota en lähtisi edes yrittämään ilman Fetch XML:ää.

Booking-taulussamme on Lookup-kenttä Book-tauluun. Se kertoo mihin kirjaan lainaus liittyy. Miten saamme tietoomme kaikki kirjat, joita ei ole koskaan lainattu? Eli kirjat, joista ei ole yhtään riviä Bookings-taulussa.

Luodaan Advanced Find:lla kysely, joka palauttaa kaikki kirjat joihin ei liity Bookings-riviä.

Ladattu Fetch XML näyttää seuraavalta.

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
  <entity name="tp_book">
    <attribute name="tp_bookid" />
    <attribute name="tp_name" />
    <order attribute="tp_name" descending="false" />
    <link-entity name="tp_booking" from="tp_book" to="tp_bookid" link-type="outer" alias="ak" />
    <filter type="and">
      <condition entityname="ak" attribute="tp_book" operator="null" />
    </filter>
  </entity>
</fetch>

Tätä voi hyödyntää edellisten esimerkkien tapaan flow’ssa.

Samaan tapaan voit etsiä esimerkiksi kaikki Accountit, joihin ei ole liitetty yhtään kontaktia.

Yhteenveto

Fetch XML on huikea apuväline työskenneltäessä Dataversen ja flow’n kanssa. Useimpiin kyselyihin saa tehtyä rungot nopeasti Advanced Find:in avulla. Tämän jälkeen vain muokkaat Fetch XML:n sisällä olevat hakuehdot mieleiseksesi flow’ssa.

Aggregointi-lauseet joutuu kirjoittamaan itse, mutta myös niistä pääsee nopeasti jyvälle.

Loputuloksena on usein merkittävä suorituskykyparannus. Vähemmän toimintoja, vähemmän Power Platform -pyyntöjä ja nopeampi flow’n suoritus.

Muista kuitenkin että Fetxh XML:ää hyödynnettäessä flow’n toiminto palauttaa max 5000 riviä. Mikäli tarvitset enemmän, joudut rakentamaan sivutuksen itse.