Del via


TripPin del 4 – datakildebaner

Denne flerdelte opplæringen dekker opprettelsen av en ny datakildeutvidelse for Power Query. Opplæringen er ment å gjøres sekvensielt – hver leksjon bygger på koblingen som er opprettet i tidligere leksjoner, og legger trinnvis til nye funksjoner i koblingen.

I denne leksjonen vil du:

  • Forenkle tilkoblingslogikken for koblingen
  • Forbedre opplevelsen av navigasjonstabellen

Denne leksjonen forenkler koblingen som ble bygget i forrige leksjon , ved å fjerne de nødvendige funksjonsparameterne og forbedre brukeropplevelsen ved å flytte til en dynamisk generert navigasjonstabell.

Hvis du vil ha en detaljert forklaring på hvordan legitimasjon identifiseres, kan du se delen Datakildebaner i behandling av godkjenning.

Datakildebaner

Når du aktiverer en datakildefunksjon, identifiserer M-motoren hvilken legitimasjon som skal brukes under en evaluering, ved å utføre et oppslag basert på verdiene datakildetype og datakildebane .

I forrige leksjon delte du to datakildefunksjoner, begge med én enkelt Uri.Type-parameter .

[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);

Første gang du kjører en spørring som bruker én av funksjonene, mottar du en ledetekst om legitimasjon med rullegardinmenyer som lar deg velge en bane og en godkjenningstype.

Legitimasjon med baner.

Hvis du kjører den samme spørringen på nytt, med de samme parameterne, kan M-motoren finne den bufrede legitimasjonen, og ingen ledetekst for legitimasjon vises. Hvis du endrer url argumentet til funksjonen slik at basisbanen ikke lenger samsvarer, vises en ny legitimasjonsmelding for den nye banen.

Du kan se all bufret legitimasjon i legitimasjonstabellen i utdatavinduet for M-spørring.

Legitimasjon-fanen.

Avhengig av endringstypen vil endring av parameterne for funksjonen sannsynligvis resultere i en legitimasjonsfeil.

Forenkle koblingen

Du vil nå forenkle koblingen ved å fjerne parameterne for datakildefunksjonen (TripPin.Contents). Du vil også fjerne kvalifikatoren for TripPin.Feed, og la den shared stå som en intern funksjon.

En av utformingsfilosofiene i Power Query er å holde den første datakildedialogboksen så enkel som mulig. Hvis det er mulig, bør du gi brukeren valg på Navigator-nivå, i stedet for i tilkoblingsdialogboksen. Hvis en angitt brukerverdi kan bestemmes programmatisk, bør du vurdere å legge den til som det øverste nivået i navigasjonstabellen i stedet for en funksjonsparameter.

Når du for eksempel kobler til en relasjonsdatabase, trenger du kanskje server-, database- og tabellnavn. Når du vet at serveren skal koble til, og legitimasjon er angitt, kan du bruke databasens API til å hente en liste over databaser og en liste over tabeller i hver database. I dette tilfellet bør bare servernavnet være en nødvendig parameter for å holde den første tilkoblingsdialogboksen så enkel som mulig,Database og Table det vil være nivåer i navigasjonstabellen.

Siden TripPin-tjenesten har et fast url-endepunkt, trenger du ikke å be brukeren om noen verdier. Du fjerner nettadresseparameteren fra funksjonen, og definerer en BaseUrl-variabel i koblingen.

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

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

Du beholder funksjonen, men gjør den ikke lenger delt, knytter den TripPin.Feed ikke lenger til en datakildetype og forenkler deklarasjonen. Fra nå av bruker du det bare internt i dette inndelingsdokumentet.

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

Hvis du oppdaterer samtalen i TripPin.query.pq filen og kjører den TripPin.Contents() i Visual Studio Code, ser du en ny ledetekst om legitimasjon. Vær oppmerksom på at det nå finnes én enkelt verdi for datakildebane – TripPin.

Legitimasjon uten bane.

Forbedre navigasjonstabellen

I den første opplæringen brukte du de innebygde funksjonene til å koble til TripPin-tjenesten OData . Dette ga deg en flott navigasjonstabell, basert på TripPin-tjenestedokumentet, uten mer kode på din side. OData.Feed-funksjonen gjorde automatisk det harde arbeidet for deg. Siden du «roughing it» bruker Web.Contents i stedet for OData.Feed, må du opprette denne navigasjonstabellen på nytt selv.

OData Navigator.

Du skal gjøre følgende endringer:

  1. Definer en liste over elementer som skal vises i navigasjonstabellen
  2. Gjør unna med enhetsspesifikke funksjoner (GetAirlineTables og GetAirportsTable)

Generere en navigasjonstabell fra en liste

Du viser enhetene du vil vise i navigasjonstabellen, og bygger den aktuelle nettadressen for å få tilgang til dem. Siden alle enhetene er under samme rotbane, kan du bygge disse URL-adressene dynamisk.

For å forenkle eksemplet viser du bare de tre enhetssettene (Airlines, Airports, People), som vil bli vist som tabeller i M, og hoppe over singletonen (Me) som vil bli vist som en post. Du hopper over å legge til funksjonene til en senere leksjon.

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

Deretter oppdaterer du TripPinNavTable funksjonen for å bygge tabellen en kolonne om gangen. [Data]-kolonnen for hver enhet hentes ved å ringe TripPin.Feed med hele nettadressen til enheten.

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;

Når du bygger nettadressebaner dynamisk, må du kontrollere at du er klar over hvor skråstrekene (/) er! Vær oppmerksom på at Uri.Combine bruker følgende regler når du kombinerer baner:

  • Når parameteren relativeUri starter med en /, vil den erstatte hele banen til parameteren baseUri
  • Hvis parameteren relativeUri ikke starter med en /og baseUri slutter med en /, legges banen til
  • Hvis parameteren relativeUri ikke starter med en /og baseUri ikke slutter med en /, erstattes det siste segmentet av banen

Følgende bilde viser eksempler på dette:

Eksempel på URI.Combine.

Fjerne enhetsspesifikke funksjoner

Hvis du vil gjøre koblingen enklere å vedlikeholde, fjerner du de enhetsspesifikke formateringsfunksjonene du brukte i forrige leksjon–GetAirlineTables og GetAirportsTable. I stedet oppdateres TripPin.Feed du for å behandle JSON-svaret på en måte som vil fungere for alle enhetene dine. Spesielt tar du feltet for value den returnerte OData JSON-nyttelasten, og konverterer den fra en liste over poster til en tabell.

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;

Merk

En ulempe med å bruke en generell tilnærming til å behandle enhetene dine, er at du mister den fine formateringen og skriver inn informasjon for enhetene dine. En senere del i denne opplæringen viser hvordan du håndhever skjema på REST-API-kall.

Konklusjon

I denne opplæringen har du ryddet opp og forenklet koblingen ved å reparere verdien for datakildebanen og flytte til et mer fleksibelt format for navigasjonstabellen. Når du har fullført disse trinnene (eller brukt eksempelkoden i denne katalogen TripPin.Contents ), returnerer funksjonen en navigasjonstabell i Power BI Desktop.

Navigatør.

Neste trinn

TripPin Del 5 - Sideveksling