Aiemmassa kirjoituksessa käytiin läpi, miten perinteisiä työnkulkuja (classic workflow) hyödyntäen pääsee käsiksi Dataversen tietueiden tilaan ennen niiden muokkaamista tai poistamista.

Esimerkissä käsiteltiin flow’lla rivien poistoja ja muokkauksia siten että flow sai tietoonsa myös rivin tilan ennen muutosta/poistoa. Tehty ratkaisu edellytti oman lokitaulun käyttöä.

Tällä kertaa tehdään samanlainen ratkaisu, mutta ilman ylimääräistä taulua. Tämä onnistuu hyödyntämällä mukautettua toimintoa (custom action).

Aloitetaan!

Esimerkki – Laitteiden asetukset

Kuvitellaan tilanne, jossa ylläpidetään laitteita ja niihin liittyviä asetuksia.

Asetukset (configuration) koostuvat useasta rivistä (configuration item).

Laitteisiin liitetään jotkin asetukset.

Samoja asetuksia voi käyttää usea eri laite.

Tietomallimme näyttää siis tältä.

Asetuksia muokattaessa tulee lähetää uusi konfiguraatio jokaiselle laitteelle, joka kyseistä asetusta käyttää.

Tämä ei ole ongelma kun asetuksiin lisää uusia rivejä tai muokkaa olemassaolevia. Mutta mitäs kun asetuksista poistetaan rivi? Miten saamme tietää, mistä asetuksista rivi on poistettu? Tarvitsemmme tämän tiedon päivittääksemme kaikki laitteet, jotka kyseistä asetusta käyttävät.

Rivin poistosta käynnistyvä flow ei kerro muuta kuin poistetun rivin id:n. Mikä on ymmärrettävää, sillä rivi on flow’ta suoritettaessa oikeasti jo poistettu.

Tarvitsemme siis jotain muuta-

Toiminto (Action)

Aloitetaan luomalla uusi toiminto. Toiminnot ovat kuin klassisia työnkulkuja, mutta ne eivät käynnisty automaattisesti tauluun kohdistuvista muutoksista. Ne käynnistetään tarpeen mukaan muualta. Tyypillisesti klassisesta työnkulusta.

Annetaan toiminnolle nimi ja määritellään sen olevan riippumaton mistään taulusta (Add to = None).

Esiin aukeaa sitä hieman perinteisempää Dynamicsia.

Toimintomme ei tällä kertaa itseasiassa tee yhtään mitään. Mutta se ottaa parametrina vastaan sen konfiguraation, johon poistettu rivi liittyi.

Lisätään uusi parametri (1) ja annetaan sille nimi (2). Määritellään parametrin tyypiksi (3) viittaus talun riviin (EntityReference) ja määritellään viittauksen kohteeksi oikea taulu (4).

Parametri on toiminnolle sisään tuleva (Input).

Valmis. Tallennetaan (Save) ja aktivoidaan (Activate).

Perinteinen työnkulku (classic workflow)

Mikä toimintomme sitten käynnistää? Tietenkin perinteinen työnkulku. Luodaan sellainen.

Poistetaan valinta kohdasta ”Run workflow in the background”. Näin työnkulkumme käynnistyy välittömästi ja meillä on mahdollisuus nähdä poistettavan tietueen tiedot ennen sen poistamista.

Työnkulku käynnistyy kenen tahansa käyttäjän poistaessa (2) asetusrivin (Scope Organization, 1). Se suoritetaan ennen (3) kuin rivi on oikeasti poistettu.

Työnkulku ei tee muuta kuin suorittaa toiminnon (Perform Action).

Valitaan listalta juuri tekemämme toiminto ja siirrytään määrittelemään sille välitettävät parametrit (Set Properties).

Toiminnollamme on yksi parametri (updatedTemplate) ja sivun oikeassa reunassa on oikea sarake jo valittuna valmiina (template). Painetaan Add (1), OK (2) ja Save and Close (3).

Tallennetaan työnkulku lopuksi ja aktivoidaan se.

Flow

Lopuksi se varsinainen taika. Luodaan uusi flow, joka käynnistyy aina kun Dataversessä suoritetaan toiminto (When an action is performed).

Valitaan toiminto, jonka suorituksesta flow käynnistyy (tp_Configurationitemisdeleted).

Kun toiminto suoritetaan, flow käynnistyy ja sieltä löytyy parametrina välitetyn asetus-tietueen tunniste (updatedTemplate/Id).

Voimme käyttää tätä hyväksemme ja listata kaikki laitteet, jotka käyttävät asetusta josta rivi juuri poistettiin.

Filter rows = _tp_configuration_value eq triggerOutputs()?['body/InputParameters/updatedTemplate/Id']

Lopuksi käydään läpi nämä laitteet yksi kerrallaan ja voimme lähettää laitteeseen liitettävät asetukset eteenpäin. Esimerkissä emme kuitenkaan tee sitä vaan tyydymme laadi (compose) -komentoon.

Yhteenveto

Olemme luoneet flow’n, joka pääsee käsiksi tunnisteen lisäksi myös muihin poistetun rivin tietoihin. Voisimme tehdä saman myös rivejä muokatessa. Mikä oli rivin arvo ennen muokkausta?

Tähän tarvitsimmme flow’n lisäksi yhden toiminnon sekä yhden perinteisen työnkulun. Toiminnon avulla välitämme tarvittavat tiedot perinteisestä työnkulusta flow’lle. Näin emme tarvitse aiemmassa esimerkissä käyttämäämme omaa lokitaulua tietojen välittämiseen.