หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
บทช่วยสอนแบบหลายส่วนนี้ครอบคลุมการสร้างส่วนขยายแหล่งข้อมูลใหม่สําหรับ 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 คือการทําให้กล่องโต้ตอบแหล่งข้อมูลเริ่มต้นเรียบง่ายที่สุด หากเป็นไปได้ คุณควรให้ตัวเลือกแก่ผู้ใช้ในระดับ 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
การปรับปรุงตารางการนําทาง
ใน บทช่วยสอนแรก คุณใช้ OData ฟังก์ชันในตัวเพื่อเชื่อมต่อกับบริการ TripPin ฟังก์ชันเหล่านี้ทําให้คุณมีตารางการนําทางที่ดูดีตามเอกสารบริการ TripPin โดยไม่มีโค้ดอยู่เคียงข้างคุณอีกต่อไป ฟังก์ชัน OData.Feed ทํางานหนักให้คุณโดยอัตโนมัติ เนื่องจากคุณกําลัง "คร่าวๆ" โดยใช้ Web.Contents แทนที่จะเป็น OData.Feed คุณจําเป็นต้องสร้างตารางการนําทางนี้ขึ้นมาใหม่ด้วยตัวคุณเอง
คุณจะทําการเปลี่ยนแปลงต่อไปนี้:
- กําหนดรายการที่จะแสดงในตารางการนําทางของคุณ
- กําจัดฟังก์ชันเฉพาะของเอนทิตี (
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ลงท้ายด้วย / ส่วนสุดท้ายของเส้นทางจะถูกแทนที่
รูปภาพต่อไปนี้แสดงตัวอย่างของกฎเหล่านี้:
ลบฟังก์ชันเฉพาะของเอนทิตี
เมื่อต้องการทําให้ตัวเชื่อมต่อของคุณง่ายต่อการบํารุงรักษา คุณจําเป็นต้องลบฟังก์ชันการจัดรูปแบบเฉพาะเอนทิตีที่คุณใช้ในบทเรียนก่อนหน้านี้—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