Jaa


TripPin-osa 4 – Tietolähdepolut

Tässä moniosaisessa opetusohjelmassa käsitellään uuden tietolähdelaajennuksen luomista Power Querylle. Opetusohjelma on tarkoitus tehdä järjestyksessä – jokainen oppitunti perustuu aiemmilla oppitunneilla luotuun liittimeen ja lisää uusia ominaisuuksia liittimeen.

Tällä oppitunnilla:

  • Liittimen yhteyslogiikan yksinkertaistaminen
  • Siirtymistaulukon käyttökokemuksen parantaminen

Tämä osio yksinkertaistaa edellisessä osiossa luotua liitintä poistamalla sen vaaditut funktioparametrit ja parantamalla käyttökokemusta siirtymällä dynaamisesti luotuun siirtymistaulukkoon.

Tarkempia tietoja tunnistetietojen tunnistamisesta on Todentamisen käsitteleminen -osiossa Tietolähdepolut.

Tietolähdepolut

Kun käynnistät tietolähdefunktion, M-moduuli tunnistaa arvioinnin aikana käytettävät tunnistetiedot tekemällä haun, joka perustuu tietolähteen laji- ja tietolähdepolku-arvoihin.

Edellisessä osiossa jaoit kaksi tietolähdefunktiota, molemmat yhdellä Uri.Type-parametrilla.

[DataSource.Kind="TripPin"]
shared TripPin.Feed = Value.ReplaceType(TripPinImpl, type function (url as Uri.Type) as any);

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents =  Value.ReplaceType(TripPinNavTable, type function (url as Uri.Type) as any);

Kun suoritat kyselyn, joka käyttää jotakin näistä funktioista ensimmäistä kertaa, näyttöön tulee tunnistetietokehote, jonka kautta voit valita polun ja todennustyypin.

Polut sisältävä tunnistetieto.

Jos suoritat saman kyselyn uudelleen samoilla parametreilla, M-moduuli voi paikantaa välimuistissa olevat tunnistetiedot, eikä tunnistetietokehotetta näytetä. Jos muokkaat funktion url argumenttia niin, että peruspolku ei enää vastaa, uudelle polulle näytetään uusi tunnistetietokehote.

Näet kaikki välimuistissa olevat tunnistetiedot Tunnistetiedot-taulukossa M-kyselyn tuloste -ikkunassa.

Tunnistetiedot-välilehti.

Toiminnon parametrien muokkaaminen aiheuttaa todennäköisesti tunnistetietovirheen muutoksen tyypistä riippuen.

Liittimen yksinkertaistaminen

Yksinkertaistat nyt liitintä poistamalla tietolähdefunktion (TripPin.Contents) parametrit. Poistat myös kohteen tarkenneen shared TripPin.Feedja jätät sen vain sisäiseen funktioon.

Yksi Power Queryn suunnittelufilosofioista on pitää alkuperäinen tietolähdevalintaikkuna mahdollisimman yksinkertaisena. Jos mahdollista, anna käyttäjälle vaihtoehtoja Siirtymistoiminto-tasolla yhteysvalintaikkunan sijaan. Jos käyttäjän antama arvo voidaan määrittää ohjelmallisesti, harkitse sen lisäämistä siirtymistaulukkosi ylimmäksi tasoksi funktioparametrin sijaan.

Kun esimerkiksi muodostat yhteyden relaatiotietokantaan, saatat tarvita palvelimen, tietokannan ja taulukon nimet. Kun tiedät, että palvelin on yhdistetty ja tunnistetiedot on annettu, voit tietokannan ohjelmointirajapinnan avulla noutaa tietokantojen luettelon ja luettelon kunkin tietokannan sisältämistä taulukoista. Tässä tapauksessa, jotta alkuperäinen yhteyden muodostamisvalintaikkuna pysyy mahdollisimman yksinkertaisena, vain palvelimen nimen tulee olla pakollinen parametri –Database ja Table se on siirtymistaulukon taso.

Koska TripPin-palvelussa on kiinteä URL-päätepiste, sinun ei tarvitse pyytää käyttäjältä mitään arvoja. Poistat URL-parametrin toiminnostasi ja määrität BaseUrl-muuttujan liittimessäsi.

BaseUrl = "https://services.odata.org/v4/TripPinService/";

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents = () => TripPinNavTable(BaseUrl) as table;

Säilytät funktion TripPin.Feed , mutta et enää tee siitä jaettua, et enää liitä sitä tietolähteen lajiin ja yksinkertaistat sen määrittelyä. Tästä eteenpäin käytät sitä vain sisäisesti tässä osion asiakirjassa.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source)
    in
        json;

Jos päivität TripPin.Contents() tiedoston kutsun TripPin.query.pq ja suoritat sen Visual Studio Codessa, näet uuden tunnistetietokehotteen. Huomaa, että nyt on olemassa yksi tietolähdepolkuarvo – TripPin.

Tunnistetiedot, joilla ei ole polkua.

Siirtymistaulukon parantaminen

Ensimmäisessä opetusohjelmassa OData käytit sisäisiä funktioita yhteyden muodostamiseksi TripPin-palveluun. Tämä antoi sinulle mukavan näköisen siirtymistaulukon TripPin-palveluasiakirjan perusteella, eikä sinun puolellasi enää ole koodia. OData.Feed-funktio teki kovan työn automaattisesti puolestasi. Koska olet "karkea" käyttämällä Web.Contents-funktiota OData.Feed:n sijaan, sinun on luotava tämä siirtymistaulukko uudelleen itse.

OData Navigator.

Teet seuraavat muutokset:

  1. Siirtymistaulukossa näytettävän kohdeluettelon määrittäminen
  2. Poista entiteettikohtaiset funktiot (GetAirlineTables ja GetAirportsTable)

Siirtymistaulukon luominen luettelosta

Luettelet siirtymistaulukossa entiteetit, jotka haluat paljastaa, ja luot tarvittavan URL-osoitteen niiden käyttämiseksi. Koska kaikki entiteetit ovat samassa pääpolussa, voit luoda nämä URL-osoitteet dynaamisesti.

Esimerkin yksinkertaistamiseksi paljastat vain kolme entiteettijoukkoa (Lentoyhtiöt, Lentokentät, Ihmiset), jotka näytettäisiin taulukoina M:ssä, ja ohitat singletonin (Me), joka paljastetaan tietueena. Ohitat funktioiden lisäämisen myöhempään oppituntiin asti.

RootEntities = {
    "Airlines",
    "Airports",
    "People"
};

Sen jälkeen päivität funktion TripPinNavTable ja luot taulukon sarakkeen kerrallaan. Kunkin entiteetin [Tiedot]-sarake noudetaan kutsumalla TripPin.Feed käyttäen entiteetin täydellistä URL-osoitetta.

TripPinNavTable = (url as text) as table =>
    let
        entitiesAsTable = Table.FromList(RootEntities, Splitter.SplitByNothing()),
        rename = Table.RenameColumns(entitiesAsTable, {{"Column1", "Name"}}),
        // Add Data as a calculated column
        withData = Table.AddColumn(rename, "Data", each TripPin.Feed(Uri.Combine(url, [Name])), Uri.Type),
        // Add ItemKind and ItemName as fixed text values
        withItemKind = Table.AddColumn(withData, "ItemKind", each "Table", type text),
        withItemName = Table.AddColumn(withItemKind, "ItemName", each "Table", type text),
        // Indicate that the node should not be expandable
        withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each true, type logical),
        // Generate the nav table
        navTable = Table.ToNavigationTable(withIsLeaf, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

Kun luot dynaamisesti URL-polkuja, varmista, että olet selvillä siitä, missä vinoviivat (/) ovat! Huomaa, että Uri.Combine käyttää polkuja yhdistettäessä seuraavia sääntöjä:

  • relativeUri Kun parametrin alussa on /, se korvaa parametrin koko polun baseUri
  • relativeUri Jos parametri ei ala merkkijonolla / ja baseUri päättyy merkkijonoon /, polku liitetään
  • relativeUri Jos parametri ei ala merkkijonolla / eikä baseUri sen lopussa ole /, polun viimeinen segmentti korvataan.

Seuraavassa kuvassa on esimerkkejä tästä:

Esimerkki Uri.Combinesta.

Entiteettikohtaisten funktioiden poistaminen

Liittimen ylläpidon helpottamiseksi poistat entiteettikohtaiset muotoilufunktiot, joita käytit edellisessä osiossa –GetAirlineTables ja GetAirportsTable. Sen sijaan päivität TripPin.Feed käsittelemään JSON-vastauksen tavalla, joka toimii kaikissa entiteeteissäsi. Otat etenkin palautettujen OData JSON -tietojen kentän ja muunnat value sen tietueluettelosta taulukoksi.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source),
        // The response is a JSON record - the data we want is a list of records in the "value" field
        value = json[value],
        asTable = Table.FromList(value, Splitter.SplitByNothing()),
        // expand all columns from the record
        fields = Record.FieldNames(Table.FirstValue(asTable, [Empty = null])),
        expandAll = Table.ExpandRecordColumn(asTable, "Column1", fields)
    in
        expandAll;

Muistiinpano

Yleinen tapa käsitellä entiteettejä aiheutuu siitä, että entiteettien siistit muotoilu- ja tyyppitiedot menetetään. Tämän opetusohjelman myöhemmässä osiossa kerrotaan, miten voit pakottaa rakenteen REST-ohjelmointirajapinnan kutsuissa.

Yhteenveto

Tässä opetusohjelmassa siistit ja yksinkertaistit liitintä korjaamalla tietolähteen polun arvon ja siirtymällä siirtymistaulukon joustavampaan muotoon. Kun nämä vaiheet on suoritettu (tai tässä hakemistossa on käytetty mallikoodia), TripPin.Contents funktio palauttaa siirtymistaulukon Power BI Desktopissa.

Merenkulkija.

Seuraavat vaiheet

TripPin,osa 5 – Sivutus