แชร์ผ่าน


TripPin ส่วนที่ 4 - เส้นทางแหล่งข้อมูล

บทช่วยสอนแบบหลายส่วนนี้ครอบคลุมการสร้างส่วนขยายแหล่งข้อมูลใหม่สําหรับ Power Query บทช่วยสอนมีไว้ให้ทําตามลําดับ—แต่ละบทเรียนจะสร้างขึ้นจากตัวเชื่อมต่อที่สร้างขึ้นในบทเรียนก่อนหน้า โดยจะเพิ่มความสามารถใหม่ให้กับตัวเชื่อมต่อของคุณทีละน้อย

ในบทเรียนนี้ คุณ:

  • ลดความซับซ้อนของตรรกะการเชื่อมต่อสําหรับตัวเชื่อมต่อของคุณ
  • ปรับปรุงประสบการณ์การใช้งานตารางการนําทาง

บทเรียนนี้ช่วยลดความยุ่งยากของตัวเชื่อมต่อที่สร้างขึ้นใน บทเรียนก่อนหน้านี้ โดยการลบพารามิเตอร์ฟังก์ชันที่จําเป็น และปรับปรุงประสบการณ์ของผู้ใช้โดยการย้ายไปยังตารางการนําทางที่สร้างขึ้นแบบไดนามิก

สําหรับคําอธิบายเชิงลึกเกี่ยวกับวิธีการระบุข้อมูลประจําตัว ให้ไปที่ส่วนเส้นทางแหล่งข้อมูลของการจัดการการรับรองความถูกต้อง

เส้นทางแหล่งข้อมูล

เมื่อคุณเรียกใช้ฟังก์ชันแหล่งข้อมูล กลไกจัดการ M จะระบุข้อมูลประจําตัวที่จะใช้ในระหว่างการประเมินโดยทําการค้นหาตามค่า ชนิดแหล่งข้อมูล และ เส้นทางแหล่งข้อมูล

ใน บทเรียนก่อนหน้านี้ คุณแชร์ฟังก์ชันแหล่งข้อมูลสองฟังก์ชัน ทั้งคู่มีพารามิเตอร์ Uri.Type เดียว

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

ครั้งแรกที่คุณเรียกใช้แบบสอบถามที่ใช้ฟังก์ชันใดฟังก์ชันหนึ่ง คุณจะได้รับพร้อมท์ข้อมูลประจําตัวที่มีดรอปดาวน์ พร้อมท์นี้ช่วยให้คุณสามารถเลือกเส้นทางและชนิดการรับรองความถูกต้องได้

สกรีนช็อตของแท็บ ข้อผิดพลาด ของผลลัพธ์คิวรี M ที่แสดงข้อความข้อมูลประจําตัว

ถ้าคุณเรียกใช้แบบสอบถามเดียวกันอีกครั้ง ด้วยพารามิเตอร์เดียวกัน กลไกจัดการ M สามารถค้นหาข้อมูลประจําตัวที่แคชไว้ และไม่มีพร้อมท์ข้อมูลประจําตัวที่แสดงขึ้น ถ้าคุณปรับเปลี่ยนอาร์กิวเมนต์ url ให้กับฟังก์ชันของคุณเพื่อให้เส้นทางพื้นฐานไม่ตรงกันอีกต่อไป จะมีพรอมต์ข้อมูลประจําตัวใหม่ปรากฏขึ้นสําหรับเส้นทางใหม่

ข้อมูลประจําตัวที่แคชไว้จะแสดงบนตารางข้อมูลประจําตัวในหน้าต่างเอาต์พุตคิวรี M

สกรีนช็อตของผลลัพธ์คิวรี M ที่แสดงข้อมูลประจําตัวที่แคชไว้ในแท็บข้อมูลประจําตัว

การแก้ไขพารามิเตอร์ของฟังก์ชันของคุณอาจส่งผลให้เกิดข้อผิดพลาดของข้อมูลประจําตัว

ลดความซับซ้อนของตัวเชื่อมต่อ

ตอนนี้ลดความซับซ้อนของตัวเชื่อมต่อของคุณโดยการลบพารามิเตอร์สําหรับฟังก์ชันแหล่งข้อมูล (TripPin.Contents) ของคุณ นอกจากนี้ คุณยังต้องลบ shared ตัวบ่งชี้สําหรับ TripPin.Feedและปล่อยให้เป็นฟังก์ชันภายในเท่านั้น

หนึ่งในปรัชญาการออกแบบของ Power Query คือการทําให้กล่องโต้ตอบแหล่งข้อมูลเริ่มต้นเรียบง่ายที่สุด หากเป็นไปได้ คุณควรให้ตัวเลือกแก่ผู้ใช้ในระดับ Navigator แทนที่จะอยู่ในกล่องโต้ตอบการเชื่อมต่อ ถ้าค่าที่ผู้ใช้ระบุสามารถกําหนดได้โดยทางโปรแกรม ให้พิจารณาเพิ่มค่าเป็นระดับบนสุดของตารางการนําทางของคุณแทนที่จะเป็นพารามิเตอร์ฟังก์ชัน

ตัวอย่างเช่น เมื่อเชื่อมต่อกับฐานข้อมูลเชิงสัมพันธ์ คุณอาจต้องใช้ชื่อเซิร์ฟเวอร์ ฐานข้อมูล และตาราง เมื่อคุณทราบเซิร์ฟเวอร์ที่จะเชื่อมต่อและมีข้อมูลประจําตัวแล้ว คุณสามารถใช้ API ของฐานข้อมูลเพื่อดึงข้อมูลรายการฐานข้อมูลและรายการตารางที่มีอยู่ในแต่ละฐานข้อมูล ในกรณีนี้ เพื่อให้กล่องโต้ตอบการเชื่อมต่อเริ่มต้นของคุณง่ายที่สุดเท่าที่จะเป็นไปได้ ควรมีเพียงชื่อเซิร์ฟเวอร์เท่านั้นที่เป็นพารามิเตอร์Database ที่จําเป็น และ Table จะเป็นระดับของตารางการนําทางของคุณ

เนื่องจากบริการ TripPin มีตําแหน่งข้อมูล URL คงที่ คุณจึงไม่จําเป็นต้องแจ้งให้ผู้ใช้ทราบค่าใดๆ คุณต้องลบพารามิเตอร์ url ออกจากฟังก์ชันของคุณ และกําหนดตัวแปร BaseUrl ในตัวเชื่อมต่อของคุณ

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

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

คุณเก็บฟังก์ชันไว้ TripPin.Feed แต่ไม่ทําให้ใช้ร่วมกันอีกต่อไป และเชื่อมโยงกับชนิดแหล่งข้อมูลอีกต่อไป และลดความซับซ้อนของการประกาศ จากจุดนี้เป็นต้นไป คุณจะใช้ภายในภายในเอกสารส่วนนี้เท่านั้น

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

ถ้าคุณปรับปรุง TripPin.Contents() การเรียกในแฟ้มของคุณและ TripPin.query.pq เรียกใช้ใน Visual Studio Code จะมีพร้อมท์ข้อมูลประจําตัวใหม่ นอกจากนี้ ขณะนี้ยังมีค่าเส้นทางแหล่งข้อมูลเดียว นั่นคือ TripPin

สกรีนช็อตของแท็บ ข้อผิดพลาด ของผลลัพธ์คิวรี M ที่แสดงข้อความข้อมูลประจําตัวที่อ้างอิงเฉพาะเส้นทาง TripPin

การปรับปรุงตารางการนําทาง

ใน บทช่วยสอนแรก คุณใช้ OData ฟังก์ชันในตัวเพื่อเชื่อมต่อกับบริการ TripPin ฟังก์ชันเหล่านี้ทําให้คุณมีตารางการนําทางที่ดูดีตามเอกสารบริการ TripPin โดยไม่มีโค้ดอยู่เคียงข้างคุณอีกต่อไป ฟังก์ชัน OData.Feed ทํางานหนักให้คุณโดยอัตโนมัติ เนื่องจากคุณกําลัง "คร่าวๆ" โดยใช้ Web.Contents แทนที่จะเป็น OData.Feed คุณจําเป็นต้องสร้างตารางการนําทางนี้ขึ้นมาใหม่ด้วยตัวคุณเอง

สกรีนช็อตของตัวนําทาง Power Query ที่แสดงเมื่อใช้ฟังก์ชัน OData ที่มีอยู่แล้วภายใน

คุณจะทําการเปลี่ยนแปลงต่อไปนี้:

  1. กําหนดรายการที่จะแสดงในตารางการนําทางของคุณ
  2. กําจัดฟังก์ชันเฉพาะของเอนทิตี (GetAirlineTables และ GetAirportsTable)

การสร้างตารางการนําทางจากรายการ

คุณต้องแสดงรายการเอนทิตีที่คุณต้องการแสดงในตารางการนําทาง และสร้าง URL ที่เหมาะสมเพื่อเข้าถึงเอนทิตีเหล่านั้น เนื่องจากเอนทิตีทั้งหมดอยู่ภายใต้เส้นทางรากเดียวกัน คุณจึงสร้าง URL เหล่านี้แบบไดนามิกได้

เพื่อลดความซับซ้อนของตัวอย่าง คุณแสดงเฉพาะชุดเอนทิตีสามชุด (สายการบิน สนามบิน ผู้คน) ซึ่งจะแสดงเป็นตารางใน M และข้ามซิงเกิลตัน (Me) ซึ่งจะแสดงเป็นระเบียน คุณสามารถข้ามการเพิ่มฟังก์ชันได้จนกว่าจะถึงบทเรียนในภายหลัง

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

จากนั้นคุณอัปเดตฟังก์ชันของคุณ TripPinNavTable เพื่อสร้างตารางทีละคอลัมน์ คอลัมน์ [ข้อมูล] สําหรับแต่ละเอนทิตีจะถูกดึงโดยการเรียก TripPin.Feed ด้วย URL แบบเต็มไปยังเอนทิตี

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;

เมื่อสร้างเส้นทาง URL แบบไดนามิก ตรวจสอบให้แน่ใจว่าคุณชัดเจนว่าเครื่องหมายทับ (/) ของคุณอยู่ที่ไหน! Uri.Combine ใช้กฎต่อไปนี้เมื่อรวมเส้นทาง:

  • เมื่อ relativeUri พารามิเตอร์ขึ้นต้นด้วย / จะแทนที่เส้นทาง baseUri ทั้งหมดของพารามิเตอร์
  • ถ้า relativeUri พารามิเตอร์ ไม่ ขึ้นต้นด้วย / และ baseUri ลงท้ายด้วย / เส้นทางจะถูกผนวก
  • ถ้าrelativeUriพารามิเตอร์ไม่ขึ้นต้นด้วย / และไม่baseUriลงท้ายด้วย / ส่วนสุดท้ายของเส้นทางจะถูกแทนที่

รูปภาพต่อไปนี้แสดงตัวอย่างของกฎเหล่านี้:

สกรีนช็อตของเส้นทาง URL ที่แสดงกฎสําหรับเครื่องหมายทับเมื่อรวมเส้นทาง

ลบฟังก์ชันเฉพาะของเอนทิตี

เมื่อต้องการทําให้ตัวเชื่อมต่อของคุณง่ายต่อการบํารุงรักษา คุณจําเป็นต้องลบฟังก์ชันการจัดรูปแบบเฉพาะเอนทิตีที่คุณใช้ในบทเรียนก่อนหน้านี้—GetAirlineTables และGetAirportsTable แต่คุณอัปเดต TripPin.Feed เพื่อประมวลผลการตอบสนอง JSON ในลักษณะที่เหมาะกับเอนทิตีทั้งหมดของคุณ โดยเฉพาะอย่างยิ่ง คุณใช้ value ฟิลด์ของเพย์โหลด OData JSON ที่ส่งคืน และแปลงจากรายการเรกคอร์ดเป็นตาราง

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;

Note

ข้อเสียของการใช้วิธีการทั่วไปในการประมวลผลเอนทิตีของคุณคือคุณสูญเสียการจัดรูปแบบและข้อมูลชนิดที่ดีสําหรับเอนทิตีของคุณ ส่วนต่อมาในบทช่วยสอนนี้แสดงวิธีการบังคับใช้ Schema ในการเรียก REST API

บทสรุป

ในบทช่วยสอนนี้ คุณได้ล้างข้อมูลและลดความซับซ้อนของตัวเชื่อมต่อของคุณโดยการแก้ไขค่าเส้นทางแหล่งข้อมูล และย้ายไปยังรูปแบบที่ยืดหยุ่นมากขึ้นสําหรับตารางการนําทางของคุณ หลังจากที่คุณทําตามขั้นตอนเหล่านี้เสร็จแล้ว (หรือใช้โค้ดตัวอย่างในไดเรกทอรีนี้) ฟังก์ชันจะ TripPin.Contents ส่งกลับตารางการนําทางใน Power BI Desktop

สกรีนช็อตของตารางการนําทางที่ส่งคืนโดยฟังก์ชัน TripPin.Contents

ขั้นตอนถัดไป

TripPin ตอนที่ 5 - เพจ