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 จะสามารถค้นหาข้อมูลรับรองที่แคชไว้ และพร้อมท์ไม่มีข้อมูลรับรองใด ๆ แสดงขึ้น ถ้าคุณปรับเปลี่ยนอาร์กิวเมนต์ url ลงในฟังก์ชันของคุณเพื่อให้เส้นทางพื้นฐานไม่ตรงกันอีกต่อไป พร้อมท์ข้อมูลรับรองใหม่จะแสดงให้เส้นทางใหม่

คุณสามารถดูข้อมูลรับรองที่แคชไว้ใด ๆ บนตารางข้อมูลรับรอง ในหน้าต่างผลลัพธ์คิวรี M

แท็บข้อมูลรับรอง

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

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

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

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

ตัวอย่างเช่น เมื่อเชื่อมต่อกับฐานข้อมูลเชิงสัมพันธ์ คุณอาจต้องมีเซิร์ฟเวอร์ ฐานข้อมูล และชื่อตาราง เมื่อคุณทราบว่าเซิร์ฟเวอร์เชื่อมต่อและมีการให้ข้อมูลรับรองแล้ว คุณสามารถใช้ 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 คุณจะเห็นพร้อมท์ข้อมูลรับรองใหม่ โปรดสังเกตว่าขณะนี้มีค่าเส้นทางแหล่งข้อมูลเดียว — TripPin

ข้อมูลรับรองที่ไม่มีเส้นทาง

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

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

ตัวนําทาง OData

คุณจะเปลี่ยนแปลงสิ่งต่อไปนี้:

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

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

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

เมื่อต้องการลดความซับซ้อนของตัวอย่าง คุณจะเปิดเผยชุดเอนทิตีสามชุดเท่านั้น (ในบทความนี้ สนามบิน บุคคล) ซึ่งจะแสดงเป็นตารางใน M และข้าม singleton (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 ไม่ได้ลงท้าย ด้วย /, เซกเมนต์สุดท้ายของเส้นทาง จะถูกแทนที่

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

ตัวอย่าง Uri.Combine

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

เพื่อให้ง่ายต่อการรักษาตัวเชื่อมต่อของคุณ คุณจะลบฟังก์ชันการจัดรูปแบบเฉพาะของเอนทิตีที่คุณใช้ในบทเรียนก่อนหน้า — 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;

หมายเหตุ

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

บทสรุป

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

ตัวนําทาง

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

TripPin ส่วนที่ 5 - การแบ่งหน้า