แชร์ผ่าน


ค่าไดนามิก

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

มีสองวิธีในการสร้างค่า ไดนามิก :

  • การใช้ฟังก์ชัน ParseJSON
  • การใช้ตัวเชื่อมต่อที่ส่งกลับชนิด "แบบไดนามิก"

Note

ไดนามิกเดิมเรียกว่า UntypedObject เฉพาะชื่อเท่านั้นที่เปลี่ยนแปลง จะไม่มีการเปลี่ยนแปลงในตรรกะ ตําแหน่งเดียวที่ชื่อจะปรากฏในสูตรอยู่ในเวอร์ชันทดลองของฟังก์ชันที่ผู้ใช้กําหนดเองและชนิดที่ผู้ใช้กําหนดเอง

ชนิดอย่างง่าย

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

ตัวอย่างต่อไปนี้แปลงค่าของตัวแปร แบบไดนามิก ที่ DynValueชื่อ

Text(DynValue)
Value(DynValue)

ตารางต่อไปนี้แสดงรายการชนิดข้อมูลและฟังก์ชันที่สอดคล้องกันเพื่อแปลง ไดนามิก เป็นชนิดข้อมูลนั้น

ชนิดข้อมูล Function Description
แบบบูลีน Boolean() เมื่อแปลง ไดนามิก เป็น บูลีน ค่าพื้นฐานจะต้องเป็นตัวแทนบูลีนหรือชนิดที่สามารถแปลงได้โดยอัตโนมัติ (เช่น สตริง "true")
Color ColorValue() หรือ RGBA() สีสามารถแสดงในเครื่องหมายข้อกำหนดสีของแผ่นงานที่จัดรูปแบบเป็นลำดับ (CSS) เป็นสตริงหรือเป็นส่วนประกอบ RGBA แต่ละรายการ ไดนามิกสามารถแปลงได้โดยตรงจากสตริงนิยามสี Cascading Style Sheet (CSS) โดยใช้ฟังก์ชัน ColorValue() หรือจากตัวเลข RGBA แต่ละรายการเป็นสีโดยใช้ฟังก์ชัน RGBA()
สกุลเงิน, ตัวเลข Value() เมื่อแปลง Dynamic เป็น Number ค่าพื้นฐานจะต้องแสดงตัวเลขหรือชนิดที่สามารถแปลงได้โดยอัตโนมัติ (เช่น สตริง "123.456")
วันที่, วันที่เวลา, เวลา DateValue(), TimeValue() หรือ DateTimeValue() วันที่ เวลา และวันที่เวลา สามารถแปลงได้โดยตรงจาก ไดนามิก เป็นประเภทที่เกี่ยวข้อง เมื่อแสดงในรูปแบบ ISO 8601 รูปแบบอื่นๆ เป็นข้อความก่อนโดยใช้ฟังก์ชัน Text() แล้วส่งผ่านฟังก์ชัน DateValue(), TimeValue() หรือ DateTimeValue() ซึ่งโดยค่าเริ่มต้นจะใช้ภาษาของการตั้งค่าปัจจุบันของผู้ใช้ในการตีความวันที่และเวลา
GUID GUID() สามารถแปลงค่า ไดนามิก เป็น GUID โดยตรงถ้าวัตถุพื้นฐานแสดง GUID หรือหากแสดงสตริง
ไฮเปอร์ลิงก์, รูปภาพ, สื่อ Text() ชนิดข้อมูลเหล่านี้เป็นชนิดข้อมูลข้อความและสามารถแปลงเป็นข้อความแล้วนำไปใช้ใน Power Fx
ตัวเลือก, สองตัวเลือก Switch() หรือ If() ตัวเลือก และ สองตัวเลือก นำเสนอเป็นสตริงที่แปลเป็นภาษาท้องถิ่นใน Power Fx ตัวเลือก มีการสนับสนุนด้วยตัวเลขและ สองตัวเลือก เป็นแบบบูลีน ไม่มีการแปลงโดยตรงจากแบบบูลีน ตัวเลข หรือสตริงเป็น ตัวเลือก หรือ สองตัวเลือก แต่ฟังก์ชัน Switch() หรือ If() สามารถใช้ฟังก์ชันกับค่าแบบบูลีน ข้อความ หรือตัวเลขเพื่อกำหนดค่า ตัวเลือก หรือ สองตัวเลือก ได้อย่างถูกต้อง
เรกคอร์ด ไม่มีข้อมูล ไม่มีการแปลงโดยตรงจาก Dynamic เป็นโครงสร้างเรกคอร์ด แต่สามารถดึงข้อมูลฟิลด์แต่ละรายการจาก Dynamic เพื่อสร้างเรกคอร์ดใหม่ได้
การอ้างอิงเรกคอร์ด ไม่มีข้อมูล การอ้างอิงระเบียนไม่ซ้ํากันกับแหล่งข้อมูล และไม่มีการแสดงที่มีความหมายใน Dynamic
Table Table() และ ForAll() Dynamic สามารถแสดงอาร์เรย์ ซึ่งสามารถแปลงเป็นตารางได้ ออบเจ็กต์เหล่านี้อาจเป็นอาร์เรย์ของเรกคอร์ด หรืออาร์เรย์ของค่าที่เป็นตารางแบบคอลัมน์เดียวได้อย่างมีประสิทธิภาพ ForAll() สามารถใช้เพื่อสร้างตารางที่มีเรกคอร์ดที่ระบุชนิดครบถ้วน ตรวจสอบตัวอย่างเพิ่มเติมในบทความนี้สำหรับข้อมูลเพิ่มเติม
ข้อความ Text() ข้อความสามารถแปลงได้โดยตรง ถ้าค่า ไดนามิก แสดงตัวเลข คุณจําเป็นต้องแปลง ไดนามิก เป็นตัวเลขก่อนโดยใช้ Value() ก่อนที่จะแปลงเป็นข้อความ

ชนิดของเรกคอร์ด

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

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

ตัวอย่างต่อไปนี้ใช้เขตข้อมูลจากตัวแปร แบบไดนามิก ที่ DynRecordชื่อ

Text(DynRecord.StringField)
Value(DynRecord.Field.ChildField)

ในกรณีที่ชื่อฟิลด์ประกอบด้วยชื่อตัวระบุที่ไม่ถูกต้อง ตัวอย่างเช่น เมื่อชื่อฟิลด์เริ่มต้นด้วยตัวเลขหรือมีอักขระที่ไม่ถูกต้อง เช่น ยัติภังค์ คุณสามารถใส่ชื่อฟิลด์ในเครื่องหมายคำพูดเดี่ยว:

dynamic.'01'
dynamic.'my-field'

การเข้าถึงคอลัมน์แบบไดนามิก

บางครั้งชื่อของคอลัมน์ในเรกคอร์ดจะเป็นแบบไดนามิก ใช้ฟังก์ชัน ColumnNames เพื่อกำหนดชื่อคอลัมน์ที่พร้อมใช้งานในเรกคอร์ด แล้วใช้ฟังก์ชัน Column เพื่อดึงค่าของคอลัมน์ที่มีชื่อ

ตัวอย่าง

LettersUsed = ParseJSON( "{ ""d"": 2, ""p"": 3 }" );

Concat( ColumnNames( LettersUsed ) As Names, Names.Value, ", " )
// returns "d, p"

Sum( ForAll( ColumnNames( LettersUsed ) As Names, Column( LettersUsed, Names.Value ) ), Value )
// returns 5

อาร์เรย์

ตัวแปร แบบไดนามิก สามารถมีอาร์เรย์ได้ แม้ว่าอาร์เรย์อาจเป็นอาร์เรย์ของเรกคอร์ดหรืออาร์เรย์ของชนิดง่าย แต่การแปลงอาร์เรย์ แบบไดนามิก เป็นตารางโดยใช้ฟังก์ชัน Table() จะส่งผลให้มีตารางแบบคอลัมน์เดียวของ Dynamic เสมอ ฟังก์ชั่น เช่น ForAll() และ Index() ไม่ต้องการให้คุณสร้าง Table() และด้วยเหตุนี้คุณจึงไม่ต้องการให้คุณใช้ฟิลด์ Value คอลัมน์เดียว

ตัวอย่างเช่น เมื่อต้องการรับตัวเลขที่สองในอาร์เรย์ของ Dynamic ที่มีค่าตัวเลข ( [1, 2, 3] ) คุณสามารถใช้สูตรต่อไปนี้เพื่อดึงข้อมูลแถวที่สองในตาราง และแปลงคอลัมน์เป็นตัวเลข:

Value( Index( UOArray, 2 ) )

ถ้า Dynamic ถูกแปลงเป็น Table() ก่อน แถวที่สองในตารางผลลัพธ์แบบคอลัมน์เดียวคือ Value คอลัมน์ที่มี Dynamic:

Value( Index( Table( UOArray ), 2 ).Value )

สำหรับอาร์เรย์ของเรกคอร์ดที่มีคอลัมน์ข้อความที่เรียกว่า Field ใช้ตรรกะเดียวกัน สามารถเข้าถึงไดนามิกได้โดยตรง หรือถ้าใช้ฟังก์ชัน Table() จะส่งผลให้มีตารางแบบคอลัมน์เดียวของ Dynamic

คอลัมน์Fieldสามารถเข้าถึงได้โดยตรงจากฟังก์ชัน Dynamic ที่ส่งกลับโดยฟังก์ชัน Index()

Text( Index( UORecordArray, 2 ).Field )

เมื่อใช้ฟังก์ชัน Table() ก่อนอื่นจะดึงข้อมูลคอลัมน์เดียว Value เพื่อรับ Dynamic จากนั้นเข้าถึง Field คอลัมน์:

Text( Index( Table( UORecordArray ), 2 ).Value.Field )

หากต้องการแปลงอาร์เรย์ของเรกคอร์ดเป็นตารางระบุชนิด คุณสามารถใช้ฟังก์ชัน ForAll() และแปลงแต่ละฟิลด์

ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )

ถ้า Dynamic ถูกแปลงเป็นตารางอีกครั้ง ตารางแบบคอลัมน์เดียวที่เป็นผลลัพธ์ของ Dynamic จะกําหนดให้คุณใช้ Value คอลัมน์เพื่อรับเขตข้อมูล

ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )

การแปลงเป็นเรกคอร์ดและตารางที่ระบุชนิด

สําคัญ

แทนที่จะแปลงค่าอย่างง่ายแต่ละรายการ คุณสามารถใช้ฟังก์ชัน ParseJSON, IsType และ AsType เพื่อแปลง Dynamic เป็นวัตถุชนิดเป็นกลุ่มได้ ใช้ฟังก์ชัน ชนิด เพื่อสร้างชนิดที่จะแม็ปโครงสร้างแบบไดนามิกกับโครงสร้างที่พิมพ์

ตัวอย่างเช่น ที่นี่เรากำลังตีความสตริง JSON เป็นค่าวันที่และเวลาโดยไม่จำเป็นต้องเรียกฟังก์ชัน DateTimeValue function:

Eclipse = ParseJSON( "{ ""Start"": ""2026-08-12T18:26:00.000Z"", ""End"": ""2026-08-12T18:33:00.000Z"" }",
                     Type( { Start: DateTime, End: DateTime } ) );

DateDiff( Eclipse.Start, Eclipse.End, TimeUnit.Minutes )
// 7