Megosztás a következőn keresztül:


TripPin 4. rész – Adatforrás elérési útjai

Ez a többrészes oktatóanyag a Power Query új adatforrásbővítményének létrehozását ismerteti. Az oktatóanyagot egymás után kell elvégezni – minden lecke az előző leckékben létrehozott összekötőre épül, és növekményesen új képességeket ad hozzá az összekötőhöz.

Ebben a leckében a következőt fogja:

  • Az összekötő kapcsolati logikájának egyszerűsítése
  • A navigációs tábla felhasználói élményének javítása

Ez a lecke leegyszerűsíti az előző leckében létrehozott összekötőt a szükséges függvényparaméterek eltávolításával, valamint a felhasználói élmény növelésével egy dinamikusan létrehozott navigációs táblára való áttéréssel.

A hitelesítő adatok azonosításának részletes ismertetését a hitelesítés kezelésének adatforrásútvonalai című szakaszában találja.

Adatforrás elérési útjai

Adatforrásfüggvények invokálásakor az M motor az adatforrás típusa és az adatforrás elérési útja értékek alapján végzett kereséssel azonosítja a kiértékelés során használni kívánt hitelesítő adatokat.

Az előző leckében két adatforrásfüggvényt osztott meg, mindkettő egyetlen Uri.Type paraméterrel.

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

Amikor először futtat egy olyan lekérdezést, amely az egyik függvényt használja, egy hitelesítőadat-kérés jelenik meg legördülő listával, amely lehetővé teszi egy elérési út és egy hitelesítési típus kiválasztását.

Hitelesítő adatok elérési utakkal.

Ha ismét ugyanazt a lekérdezést futtatja ugyanazokkal a paraméterekkel, az M motor képes megtalálni a gyorsítótárazott hitelesítő adatokat, és nem jelenik meg hitelesítő adatokra vonatkozó kérés. Ha úgy módosítja az url argumentumot a függvényben, hogy az alap elérési út már ne egyezzen meg, új hitelesítőadat-kérés jelenik meg az új elérési úthoz.

A gyorsítótárazott hitelesítő adatok az M Lekérdezés kimenete ablakban, a Hitelesítő adatok táblában láthatók.

Hitelesítő adatok lap.

A változás típusától függően a függvény paramétereinek módosítása valószínűleg hitelesítőadat-hibát eredményez.

Az összekötő egyszerűsítése

Mostantól egyszerűsítheti az összekötőt az adatforrásfüggvény (TripPin.Contents) paramétereinek eltávolításával. A minősítőt TripPin.Feedis eltávolítjashared, és csak belső függvényként hagyja.

A Power Query egyik tervezési filozófiája, hogy a kezdeti adatforrás párbeszédpanelje a lehető legegyszerűbb legyen. Ha egyáltalán lehetséges, a felhasználónak a navigátor szintjén kell választási lehetőségeket megadnia, nem pedig a kapcsolati párbeszédpanelen. Ha egy felhasználó által megadott érték programozott módon határozható meg, fontolja meg, hogy a navigációs tábla legfelső szintjeként adja hozzá a függvényparaméter helyett.

Ha például relációs adatbázishoz csatlakozik, szükség lehet kiszolgáló-, adatbázis- és táblanevekre. Miután megismerte a kiszolgálót, amelyhez csatlakozni szeretne, és megadta a hitelesítő adatokat, az adatbázis API-jával lekérheti az adatbázisok listáját és az egyes adatbázisokban található táblák listáját. Ebben az esetben, ha a kezdeti csatlakozási párbeszédpanelt a lehető legegyszerűbben szeretné megtartani, csak a kiszolgáló nevének kell megadnia a szükséges paramétert,Database és Table a navigációs táblázat szintjei lesznek.

Mivel a TripPin szolgáltatás rögzített URL-végponttal rendelkezik, nem kell értékeket kérnie a felhasználótól. Eltávolítja az URL-paramétert a függvényből, és definiál egy BaseUrl-változót az összekötőben.

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

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

Megtartja a függvényt TripPin.Feed , de többé nem osztja meg, nem társítja adatforrástípushoz, és egyszerűsíti a deklarációját. Ettől a ponttól kezdve csak a szakaszdokumentumon belül fogja használni.

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

Ha frissíti a hívást a TripPin.Contents() TripPin.query.pq fájlban, és a Visual Studio Code-ban futtatja, egy új hitelesítőadat-kérés jelenik meg. Vegye figyelembe, hogy mostantól egyetlen adatforrás elérési útja van – TripPin.

Elérési út nélküli hitelesítő adatok.

A navigációs táblázat fejlesztése

Az első oktatóanyagban a beépített OData függvényekkel kapcsolódott a TripPin szolgáltatáshoz. Ez egy szép megjelenésű navigációs táblázatot adott a TripPin szolgáltatásdokumentum alapján, és nincs több kód az ön oldalán. Az OData.Feed függvény automatikusan megtette a kemény munkát. Mivel az OData.Feed helyett a Web.Contents használatával "csiszolja", ezt a navigációs táblázatot saját maga kell létrehoznia.

OData Kezelő.

A következő módosításokat fogja végrehajtani:

  1. Megjelenítendő elemek listájának definiálása a navigációs táblában
  2. Ne használja az entitásspecifikus függvényeket (GetAirlineTables és GetAirportsTable)

Navigációs tábla létrehozása listából

Felsorolja a navigációs táblázatban megjeleníteni kívánt entitásokat, és létrehozza a megfelelő URL-címet a hozzáféréshez. Mivel az összes entitás ugyanazon gyökérútvonal alatt található, ezeket az URL-címeket dinamikusan hozhatja létre.

A példa egyszerűsítése érdekében csak a három entitáskészletet (Légitársaságok, Repülőterek, Személyek) fogja elérhetővé tenni, amelyek az M-táblákként lesznek közzétéve, és kihagyja a rekordként közzéteendő önálló (Me) halmazt. Egy későbbi leckéig kihagyja a függvények hozzáadását.

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

Ezután frissíti a függvényt TripPinNavTable , hogy egyszerre egy oszlopot hozzon létre a táblában. Az egyes entitások [Data] oszlopát az entitás teljes URL-címének meghívásával TripPin.Feed kéri le a rendszer.

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;

Az URL-útvonalak dinamikus létrehozásakor győződjön meg arról, hogy a perjelek (/) hol találhatók! Vegye figyelembe, hogy az Uri.Combine az alábbi szabályokat használja az útvonalak kombinálásakor:

  • Amikor a relativeUri paraméter egy /-val kezdődik, az a paraméter teljes elérési útját lecseréli baseUri
  • Ha a relativeUri paraméter nem egy /-val kezdődik, és baseUri /-val végződik, az elérési út hozzá lesz fűzve
  • Ha a relativeUri paraméter nem /-val kezdődik, és baseUri nem végződik /-val, az elérési út utolsó szegmense lesz lecserélve

Az alábbi képen példák láthatók erre:

Uri.Combine példa.

Az entitásspecifikus függvények eltávolítása

Az összekötő könnyebb karbantartása érdekében eltávolítja az előző leckében használt entitásspecifikus formázási függvényeket–GetAirlineTables és GetAirportsTable. Ehelyett frissítenie TripPin.Feed kell a JSON-választ úgy, hogy az az összes entitás esetében működjön. Pontosabban a value visszaadott OData JSON hasznos adatok mezőjét veszi fel, és egy rekordlistából táblázattá konvertálja.

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;

Feljegyzés

Az entitások feldolgozására szolgáló általános megközelítés használatának hátránya, hogy elveszíti az entitások formázási és típusadatait. Az oktatóanyag egy későbbi szakasza bemutatja, hogyan kényszerítheti ki a sémát REST API-hívásokon.

Összegzés

Ebben az oktatóanyagban az adatforrás elérési útjának értékének javításával és a navigációs táblázat rugalmasabb formátumára való áttéréssel megtisztította és egyszerűsítette az összekötőt. A lépések elvégzése (vagy a könyvtárban található mintakód használata) után a TripPin.Contents függvény egy navigációs táblát ad vissza a Power BI Desktopban.

Navigátor.

Következő lépések

TripPin 5. rész – Lapozás