แชร์ผ่าน


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

เนื่องจากบริการ 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 - การแบ่งหน้า