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