Diagnostics.Trace เขียนข้อความติดตาม (trace message) เพื่อใช้ในการแก้ไขจุดบกพร่องและตรวจสอบค่าข้อมูลในขั้นตอนต่างๆ โดยคืนค่าเดิมกลับไปยังถัดไป
=Diagnostics.Trace(traceLevel as number, message as anynonnull, value as any, [delayed as nullable logical]) as any
=Diagnostics.Trace(traceLevel as number, message as anynonnull, value as any, [delayed as nullable logical]) as any
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| traceLevel | number | Yes | ระดับความรุนแรงของข้อความติดตาม (TraceLevel.Critical, TraceLevel.Error, TraceLevel.Warning, TraceLevel.Information, TraceLevel.Verbose) | |
| message | anynonnull | Yes | ข้อความที่ต้องการบันทึกเมื่อมีการติดตาม | |
| value | any | Yes | ค่าที่ต้องการคืนกลับหลังจากการบันทึก | |
| delayed | nullable logical | Optional | null | ตัวเลือกสำหรับเลื่อนการประมวลผล value จนกว่าจะมีการติดตาม (true = เลื่อน, false หรือ null = ปกติ) |
let Source = {1, 2, 3}, Traced = Diagnostics.Trace(TraceLevel.Information, "ค่าสุดท้าย: " & Text.From(List.Count(Source)), Source) in Tracedlet
Source = {1, 2, 3},
Traced = Diagnostics.Trace(TraceLevel.Information, "ค่าสุดท้าย: " & Text.From(List.Count(Source)), Source)
in
Traced
{1, 2, 3} และบันทึกข้อความ "ค่าสุดท้าย: 3"
let Source = Table.FromRows({{1, "A"}, {2, "B"}}, {"ID", "Name"}), Filtered = Table.SelectRows(Source, each [ID] > 1), Traced = Diagnostics.Trace(TraceLevel.War…let
Source = Table.FromRows({{1, "A"}, {2, "B"}}, {"ID", "Name"}),
Filtered = Table.SelectRows(Source, each [ID] > 1),
Traced = Diagnostics.Trace(TraceLevel.Warning, "จำนวนแถวหลังกรอง: " & Text.From(Table.RowCount(Filtered)), Filtered)
in
Traced
ตารางที่มีแถวเดียว และบันทึก "จำนวนแถวหลังกรอง: 1"
let Source = List.Range({1..100}, 0, 50), Traced = Diagnostics.Trace( TraceLevel.Verbose, "รายการที่คำนวณแล้ว", () => List.Sum(Source), true ) in Tracedlet
Source = List.Range({1..100}, 0, 50),
Traced = Diagnostics.Trace(
TraceLevel.Verbose,
"รายการที่คำนวณแล้ว",
() => List.Sum(Source),
true
)
in
Traced
2550 (ผลรวมของ 1 ถึง 50) และบันทึกข้อความหากมีการติดตาม
let Source = {1, 2, 0, 4}, Division = List.Transform(Source, each if _ = 0 then Diagnostics.Trace(TraceLevel.Critical, "พบศูนย์! " & Text.From(_), null) else 10…let
Source = {1, 2, 0, 4},
Division = List.Transform(Source, each if _ = 0 then Diagnostics.Trace(TraceLevel.Critical, "พบศูนย์! " & Text.From(_), null) else 100 / _)
in
Division
รายการที่มีค่า null แทนผลหารสำหรับศูนย์
ผม มี Diagnostics.Trace คืนค่าเดิมกลับไปไม่เปลี่ยนแปลงข้อมูล สำหรับการเขียนไปยัง diagnostic window เท่านั้น ส่วน Diagnostics.LogValue ก็คล้ายกัน แต่ Trace มีความยืดหยุ่นมากกว่าในการเลือก TraceLevel และสามารถใช้ delayed parameter ได้
ผม เปิด Diagnostic Viewer ใน Power Query Editor โดยไปที่ Queries pane → เลือก query → Tools → Diagnostic Viewer หรือบางครั้งอาจต้องใช้ Advanced Editor เพื่อส่วนที่ต้องการติดตาม
ผม แนะนำใช้ delayed = true เมื่อ value เป็นการดำเนินการที่มีค่าใช้จ่ายสูง เช่น List.Sum, Table.RowCount หรือการคำนวณที่ซับซ้อน เพราะว่า delayed จะทำให้การคำนวณเลื่อนไปจนกว่า tracing เปิดใช้งาน
Diagnostics.Trace ใช้สำหรับการบันทึกข้อมูลแก้ไขจุดบกพร่องในขั้นตอนการประมวลผล ฟังก์ชันนี้รับ 4 ตัวแปร: ระดับความรุนแรง (TraceLevel), ข้อความ, ค่าที่ต้องการ, และตัวเลือก delayed เพื่อระบุว่าจะประมวลผลค่านั้นเมื่อใดและคืนค่าเดิมกลับไปหลังการบันทึก
ที่เจ๋งคือ delayed parameter ช่วยให้ประหยัดประสิทธิภาพ เพราะสามารถเลื่อนการประมวลผลค่าถึงเวลาที่มีการติดตามจริงๆ ซึ่งมีประโยชน์สำหรับการดำเนินการที่มีค่าใช้จ่าย (expensive operations) และฟังก์ชันนี้ไม่เปลี่ยนแปลงข้อมูลต้นฉบับ เพียงแค่บันทึกเท่านั้น
ส่วนตัวผม ผมใช้ Diagnostics.Trace บ่อยครั้งเมื่อต้องหา bug ในโปรแกรม Power Query ที่ซับซ้อน โดยเพิ่มขั้นตอนนี้เข้าไปในแต่ละขั้นตอนเพื่อดูว่าข้อมูลเปลี่ยนแปลงไปอย่างไร ตัวอักษร TraceLevel ก็เป็นวิธีง่ายๆ ในการแยกสิ่งที่สำคัญจากสิ่งที่ไม่สำคัญ 😎