Chia sẻ qua


Giá trị động

Động là kiểu dữ liệu trong Power Fx có thể chứa bất kỳ cấu trúc dữ liệu nào, phức tạp hoặc đơn giản. Không thể sử dụng trực tiếp và chuyển đổi sang kiểu dữ liệu khác vào thời gian chạy, một cách rõ ràng hoặc ngầm định. Có thể truy nhập các trường của bản ghi trong giá trị Động bằng cách sử dụng dấu chấm và sự tồn tại của các trường chỉ được xác minh ở thời gian chạy.

Có hai cách để tạo giá trị Động :

  • Sử dụng hàm ParseJSON.
  • Sử dụng đường kết nối trả về loại "động".

Lưu ý

Dynamic trước đây được gọi là UntypedObject. Chỉ có tên đã thay đổi, không có thay đổi trong ngữ âm. Vị trí duy nhất mà tên sẽ xuất hiện trong công thức là trong các phiên bản thử nghiệm của Hàm do Người dùng Xác định và Loại do Người dùng Xác định.

Loại đơn giản

Không thể sử dụng trực tiếp giá trị của biến chứa giá trị Động. Bạn luôn phải nhập đúng cách hàm đó bằng cách sử dụng hàm tạo kiểu tương ứng hoặc bằng cách chuyển đổi nó thành một kiểu cụ thể với các hàm AsTypeParseJSON .

Các ví dụ sau chuyển đổi giá trị của một biến Động có tên DynValue.

Text(DynValue)
Value(DynValue)

Bảng sau đây liệt kê các kiểu dữ liệu và hàm tương ứng để chuyển đổi Động thành kiểu dữ liệu đó.

Loại dữ liệu Hàm Description
Boolean Boolean() Khi chuyển đổi Dynamic sang Boolean, giá trị cơ sở phải đại diện cho boolean hoặc loại có thể được tự động chuyển đổi (chẳng hạn như chuỗi "true").
Màu ColorValue() hoặc RGBA() Màu sắc có thể được thể hiện bằng ký pháp định nghĩa màu Cascading Style Sheet (CSS) dưới dạng một chuỗi hoặc dưới dạng các thành phần RGBA riêng lẻ. Dynamic có thể được chuyển đổi trực tiếp từ chuỗi định nghĩa màu Biểu định kiểu xếp tầng (CSS) bằng cách sử dụng hàm ColorValue() hoặc từ các số RGBA riêng lẻ thành màu sử dụng hàm RGBA().
Đơn vị tiền tệ, Số Giá trị() Khi chuyển đổi Dynamic thành Number, giá trị cơ sở phải đại diện cho một số hoặc một loại có thể được tự động chuyển đổi (chẳng hạn như một chuỗi "123,456").
Ngày, Ngày giờ và Giờ DateValue(), TimeValue() hoặc DateTimeValue() Ngày, giờ và ngày giờ có thể được chuyển đổi trực tiếp từ Động sang loại tương ứng, khi được thể hiện ở định dạng ISO 8601. Các định dạng khác phải được chuyển đổi thành văn bản trước tiên bằng cách sử dụng hàm Text() và sau đó chuyển vào hàm DateValue(), TimeValue() hoặc DateTimeValue() sẽ sử dụng ngôn ngữ trong thiết đặt của người dùng hiện tại để diễn giải ngày và giờ theo mặc định.
GUID GUID() Một giá trị Động có thể được chuyển đổi trực tiếp thành GUID nếu đối tượng cơ sở đại diện cho GUID hoặc nếu nó đại diện cho một chuỗi.
Siêu liên kết, Hình ảnh, Phương tiện Chữ() Các loại dữ liệu này là loại dữ liệu văn bản và có thể được chuyển đổi thành văn bản và sau đó sử dụng trong Power Fx.
Lựa chọn, Hai tùy chọn Switch() hoặc If() Các lựa chọnhai tùy chọn được trình bày dưới dạng chuỗi bản địa hóa trong Power Fx. Các lựa chọn được hỗ trợ bởi một số và hai tùy chọn dưới dạng boolean. Không có chuyển đổi trực tiếp từ boolean, số hoặc chuỗi thành lựa chọn hoặc hai tùy chọn, nhưng các hàm Switch() hoặc If() có thể được sử dụng trên giá trị boolean, văn bản hoặc số để gán chính xác giá trị lựa chọn hoặc hai tùy chọn.
Bản ghi không áp dụng Không có chuyển đổi trực tiếp từ Động sang cấu trúc bản ghi nhưng bạn có thể truy xuất từng trường riêng lẻ từ Dynamic để tạo bản ghi mới.
Tham chiếu bản ghi không áp dụng Tham chiếu bản ghi là duy nhất cho nguồn dữ liệu và không có bản trình bày có ý nghĩa trong Động.
Bảng Table()ForAll() Một Dynamic có thể đại diện cho một mảng, mảng này có thể được chuyển đổi thành bảng. Những đối tượng này có thể là mảng bản ghi hoặc mảng giá trị thực sự là bảng một cột. ForAll() có thể được sử dụng để tạo một bảng với các bản ghi được gõ đầy đủ. Xem lại các ví dụ ở phía dưới trong bài viết này để biết thêm thông tin.
Văn bản Chữ() Văn bản có thể được chuyển đổi trực tiếp. Nếu giá trị Động đại diện cho một số, bạn cần chuyển đổi Dynamic thành số trước tiên bằng cách sử dụng Value() trước khi chuyển đổi thành văn bản.

Loại bản ghi

Bạn có thể truy nhập các trường trên một biến đại diện cho một bản ghi Động bằng cách sử dụng ký hiệu dấu chấm thông thường được sử dụng cho các bản ghi. Tuy nhiên, sự tồn tại của các trường sẽ không được xác minh cho đến khi chạy. Kết quả là cũng không có sẵn intellisense. Nếu một trường không tồn tại hoặc có giá trị null bên trong, thì việc truy cập trường đó sẽ dẫn đến một giá trị Blank().

Mỗi trường trên bản ghi cũng có kiểu Động và cần được nhập đúng. Trường có thể là một bản ghi động của loại đơn giản. Trong trường hợp đó là một bản ghi, bạn có thể xâu chuỗi ký pháp dấu chấm. Nếu bất kỳ trường nào trong chuỗi không tồn tại, thì Blank() được trả về.

Các ví dụ sau sử dụng các trường từ một biến Động có tên DynRecord.

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

Trong trường hợp tên trường bao gồm tên mã định danh không hợp lệ, chẳng hạn như khi tên trường bắt đầu bằng một số hoặc chứa các ký tự không hợp lệ, chẳng hạn như dấu gạch nối, thì bạn có thể đặt tên trường trong dấu trích dẫn đơn:

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

Truy cập cột động

Đôi khi tên của các cột trong bản ghi sẽ thay đổi. Sử dụng hàm ColumnNames để xác định tên cột nào có sẵn trong bản ghi, sau đó sử dụng hàm Column để truy xuất giá trị của cột được đặt tên.

Ví dụ:

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

Mảng

Biến động có thể chứa một mảng. Mặc dù mảng có thể là một mảng các bản ghi hoặc mảng các loại đơn giản, việc chuyển đổi mảng Dynamic thành một bảng bằng cách sử dụng hàm Table() sẽ luôn cho kết quả là một bảng một cột là Dynamic. Các hàm như ForAll()Index() không yêu cầu bạn tạo Table() trước tiên và kết quả là không yêu cầu bạn sử dụng trường Value một cột.

Ví dụ, để lấy số thứ hai trong mảng Dynamic chứa giá trị số ( [1, 2, 3] ), công thức sau đây có thể được dùng để truy xuất hàng thứ hai trong bảng và chuyển đổi cột thành số:

Value( Index( UOArray, 2 ) )

Nếu Dynamic đã được chuyển đổi thành Table() đầu tiên, hàng thứ hai trong bảng kết quả một cột là Value một cột có chứa Dynamic:

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

Đối với một mảng bản ghi có cột văn bản được gọi là Field, logic tương tự cũng được áp dụng. Có thể truy nhập trực tiếp vào Động hoặc nếu sử dụng hàm Table() sẽ cho kết quả là bảng một cột là Động.

Cột Field có thể truy nhập trực tiếp từ hàm Dynamic do hàm Index() trả về.

Text( Index( UORecordArray, 2 ).Field )

Khi sử dụng hàm Table(), trước tiên hãy truy xuất cột Value đơn cột để lấy Dynamic, rồi truy nhập cột Field :

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

Để chuyển đổi một mảng bản ghi thành bảng được nhập, bạn có thể sử dụng hàm ForAll() và chuyển đổi từng trường riêng lẻ.

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

Nếu bảng Dynamic được chuyển đổi thành bảng trước tiên, một lần nữa, bảng một cột duy nhất có được của DynamicValue sẽ yêu cầu bạn sử dụng cột đó để tải các trường.

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

Chuyển đổi sang các bản ghi và bảng đã nhập

Quan trọng

Thay vì chuyển đổi từng giá trị đơn giản riêng lẻ, các hàm ParseJSON, IsTypeAsType có thể được sử dụng để chuyển đổi hàng loạt Dynamic thành đối tượng được nhập. Sử dụng hàm Type để tạo loại sẽ ánh xạ cấu trúc động với cấu trúc đã nhập.

Ví dụ, ở đây chúng ta đang diễn giải các chuỗi JSON thành các giá trị ngày giờ mà không cần phải gọi hàm DateTimeValue :

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