Loại dữ liệu

Lưu ý

Microsoft Power Fx là tên mới của ngôn ngữ công thức ứng dụng canvas. Những bài viết này được thực hiện khi chúng tôi trích xuất ngôn ngữ từ các ứng dụng canvas, tích hợp ngôn ngữ đó với các sản phẩm khác của Microsoft Power Platform và hiển thị dưới dạng nguồn mở. Bắt đầu với Tổng quan về Microsoft Power Fx để được giới thiệu về ngôn ngữ.

Thông tin chạy qua một ứng dụng trong các giá trị nhỏ, rời rạc, rất giống với các ô của bảng tính. Ví dụ: dữ liệu trong trường Sinh nhật và trường Ngày kỷ niệm sẽ chạy qua dưới dạng giá trị Ngày và bao gồm năm, tháng, ngày. Ứng dụng biết cách định dạng các giá trị này, hạn chế nhập dữ liệu phù hợp với từng giá trị và chia sẻ các giá trị với cơ sở dữ liệu. Sinh nhật khác với ngày kỷ niệm với mọi người, nhưng hệ thống xử lý chúng theo cách chính xác. Trong trường hợp này, Ngày là ví dụ về kiểu dữ liệu.

Bài viết này cung cấp thông tin chi tiết về các kiểu dữ liệu mà ứng dụng canvas hỗ trợ. Khi một ứng dụng kết nối với nguồn dữ liệu bên ngoài, mỗi kiểu dữ liệu trong nguồn đó được ánh xạ tới một kiểu dữ liệu cho các ứng dụng canvas.

Loại dữ liệu Mô tả Ví dụ
Boolean Giá trị đúng hoặc sai. Có thể được dùng trực tiếp trong If, Filter và các hàm khác mà không cần so sánh. true
Màu sắc Một thông số màu sắc, bao gồm một kênh alpha. Color.Red
ColorValue( "#102030" )
RGBA( 255, 128, 0, 0.5 )
Loại tiền Một giá trị tiền tệ được lưu trữ trong một số thực dấu phẩy động. Giá trị tiền tệ giống như giá trị số với các tùy chọn định dạng tiền tệ. 123
4.56
Ngày tháng Một ngày không có thời gian, theo múi giờ của người dùng ứng dụng. Date( 2019, 5, 16 )
DateTime Một ngày không có thời gian, theo múi giờ của người dùng ứng dụng. DateTimeValue( "16 tháng 5, 2019 1:23:09 PM" )
Số thập phân Một số có độ chính xác cao, hoạt động cơ sở 10 và phạm vi giới hạn. 123
Thập phân("1.2345")
GUID A Số nhận dạng duy nhất toàn cầu. GUID()
GUID( "123e4567-e89b-12d3-a456-426655440000" )
Siêu liên kết Một chuỗi văn bản chứa siêu liên kết. "https://powerapps.microsoft.com"
Image Mã định danh tài nguyên chung (URI) chuỗi văn bản cho một hình ảnh ở định dạng .jpeg, .png, .svg, .gif hoặc định dạng hình ảnh web phổ biến khác. MyImage được thêm dưới dạng nguồn lực ứng dụng
"https://northwindtraders.com/logo.jpg"
"appres://blobmanager/7b12ffa2..."
Phương tiện sử dụng Một chuỗi văn bản URI để ghi video hoặc âm thanh. MyVideo được thêm dưới dạng nguồn lực ứng dụng
"https://northwindtraders.com/intro.mp4"
"appres://blobmanager/3ba411c..."
Số hoặc Số nổi Một số có độ chính xác tiêu chuẩn, phép tính cơ số 2 và phạm vi rộng. 123
8,903e121
1.234e200
Nhóm chọn Lựa chọn từ một bộ tùy chọn, được hỗ trợ bằng một số. Kiểu dữ liệu này kết hợp nhãn văn bản có thể bản địa hóa với giá trị số. Nhãn xuất hiện trong ứng dụng và giá trị số được lưu trữ và dùng để so sánh. ThisItem.OrderStatus
Record Một bản ghi các giá trị dữ liệu. Kiểu dữ liệu hỗn hợp này chứa các phiên bản của các kiểu dữ liệu khác liệt kê trong chủ đề này. Thông tin thêm: Thao tác với bảng. { Company: "Northwind Traders",
Staff: 35,
NonProfit: false }
Tham chiếu bản ghi Tham chiếu đến bản ghi trong bảng. Những tham chiếu như vậy thường được dùng với tra cứu đa hình. Thông tin thêm: Thao tác với tham chiếu. First(Accounts).Owner
Table Một bảng các bản ghi. Tất cả các bản ghi phải có cùng tên cho các trường của chúng với cùng kiểu dữ liệu, và các trường bị bỏ qua được xem là blank. Kiểu dữ liệu hỗn hợp này chứa các phiên bản của các kiểu dữ liệu khác liệt kê trong chủ đề này. Thông tin thêm: Thao tác với bảng. Table( { FirstName: "Sidney",
LastName: "Higa" },
{ FirstName: "Nancy",
LastName: "Anderson" } )
Chữ Một chuỗi văn bản Unicode. "Xin chào thế giới"
Thời gian Thời gian không có ngày, theo múi giờ của người dùng ứng dụng. Thời gian( 11, 23, 45 )
Hai lựa chọn Lựa chọn từ một bộ 2 tùy chọn, được hỗ trợ bằng giá trị boolean. Kiểu dữ liệu này kết hợp nhãn văn bản có thể bản địa hóa với giá trị boolean. Nhãn xuất hiện trong ứng dụng và giá trị boolean được lưu trữ và dùng để so sánh. ThisItem.Taxable
Đối tượng chưa được phân loại Một đối tượng thuộc loại chưa được khai báo. Đối tượng cơ bản có thể thuộc bất kỳ loại nào hiện có và có thể được chuyển đổi thành những loại tương thích bằng cách sử dụng các hàm như Boolean(), Value(), Table(), v.v. Để biết thêm thông tin, hãy xem phần Đối tượng chưa được phân loạiLàm việc với JSON. ParseJSON("{ ""Field"" : 1234 }").Field

Nhiều kiểu dữ liệu này giống nhau và có cùng cách biểu thị cơ bản, chẳng hạn như trường Siêu liên kết được coi là Văn bản. Các kiểu dữ liệu bổ sung cung cấp trải nghiệm mặc định tốt hơn trong các biểu mẫu và tùy chọn kiểm soát khác.

Trống

Tất cả các kiểu dữ liệu có thể có giá trị là trống (nói cách khác là không có giá trị). Thuật ngữ "null" thường được dùng trong cơ sở dữ liệu cho khái niệm này.

Sử dụng hàm Blank với hàm Set hoặc Patch để đặt biến hoặc trường thành blank. Ví dụ: Set( x, Blank() ) sẽ xóa mọi giá trị trong biến chung x.

Kiểm tra một giá trị blank bằng hàm IsBlank. Thay thế giá trị blank có thể bằng các giá trị không phải là blank bằng cách dùng hàm Coalesce.

Bởi vì tất cả các kiểu dữ liệu đều hỗ trợ blank, nên các kiểu dữ liệu BooleanHai tùy chọn đều có 3 giá trị có thể một cách hiệu quả.

Tất cả 4 kiểu dữ liệu này đều dựa trên chuỗi văn bản Unicode.

Văn bản nhúng

Các chuỗi văn bản nhúng trong một công thức được đặt trong dấu ngoặc kép. Sử dụng hai dấu ngoặc kép cùng với nhau để biểu thị một dấu ngoặc kép trong một chuỗi văn bản. Ví dụ: sử dụng công thức sau trong thuộc tính OnSelect của một tùy chọn kiểm soát Button:

Notify( "Jane said ""Hello, World!""" )

dẫn đến biểu ngữ khi nhấn nút, trong đó dấu ngoặc kép đầu tiên và cuối cùng bị bỏ qua (vì chúng phân định chuỗi văn bản) và dấu ngoặc kép lặp lại xung quanh Hello, World! được thay thế bằng dấu nháy đơn:

thông báo bật lên với thông tin nhắn Jane nói

Dấu nháy đơn được dùng cho tên định danh chứa các ký tự đặc biệt và không có ý nghĩa đặc biệt trong chuỗi văn bản.

Nội suy chuỗi

Sử dụng phép nội suy chuỗi để nhúng các công thức trong một chuỗi văn bản. Việc này thường dễ làm việc và trực quan hóa đầu ra hơn so với việc sử dụng hàm Hàm nối hoặc toán tử & .

Đặt tiền tố cho chuỗi văn bản bằng ký hiệu đô la $ và cho công thức sẽ được nhúng vào dấu ngoặc nhọn { }. Để thêm dấu ngoặc nhọn vào chuỗi văn bản, hãy sử dụng dấu ngoặc nhọn lặp lại: {{ hoặc }}. Bạn có thể sử dụng phép nội suy chuỗi ở bất kỳ đâu mà một chuỗi văn bản tiêu chuẩn có thể được sử dụng.

Ví dụ: hãy xem xét công thức sau đây với các biến toàn cục Apples được đặt thành 3 và Bananas được đặt thành 4:

$"We have {Apples} apples, {Bananas} bananas, yielding {Apples+Bananas} fruit total."

Công thức này trả về chuỗi văn bản We have 3 apples, 4 bananas, yielding 7 fruit total. Các biến ApplesBananas được chèn vào văn bản thay thế dấu ngoặc nhọn, cùng với kết quả của công thức tính Apples+Bananas. Dấu cách và các ký tự khác xung quanh dấu ngoặc nhọn được giữ nguyên.

Những công thức đã nhúng có thể bao gồm bất kỳ hàm hoặc toán tử nào. Yêu cầu duy nhất là kết quả của công thức này có thể được ép thành một chuỗi văn bản. Ví dụ: công thức dưới đây sẽ chèn NickName nếu được cung cấp hoặc FirstName nếu không được cung cấp, vào lời chào:

$"Welcome {Coalesce( NickName, FirstName )}, it's great to meet you!" )

Nếu NickName được đặt là "Joe" thì công thức này sẽ tạo chuỗi văn bản Welcome Joe, it's great to meet you!. Nhưng nếu NickName là giá trị blankFirstName là "Joseph" thì công thức này sẽ tạo chuỗi văn bản Dear Joseph, great to meet you!.

Phép nội suy chuỗi có thể bao gồm các chuỗi văn bản tiêu chuẩn trong công thức đã nhúng. Ví dụ: nếu cả NickName lẫn FirstName đều không được cung cấp thì chúng tôi vẫn có thể cung cấp "Friend" để thay thế:

$"Welcome {Coalesce( NickName, FirstName, "Friend" )}!"

Phép nội suy chuỗi thậm chí có thể được lồng vào nhau. Hãy xem xét ví dụ dưới đây, trong đó tên First, MiddleLast được kết hợp thành một lời chào. Ngay cả khi một hoặc hai trong số các giá trị này là giá trị blank, số dấu cách chính xác sẽ nằm giữa các phần tên. Nếu không có phần nào được cung cấp, phép nội suy chuỗi bên trong sẽ thu gọn thành một chuỗi trống và được thay thế bằng hàm Coalesce thành "Friend".

$"Welcome {Coalesce( Trim( $"{First} {Middle} {Last}"}), "Friend" )}!"
Đầu tiên Giữa Cuối cùng Kết quả
John Qunicy Doe Welcome John Quincy Doe!
John blank Doe Welcome John Doe!
blank blank Doe Welcome Doe!
blank blank blank Welcome Friend!

Dòng mới

Chuỗi văn bản đã nhúng có thể chứa các dòng mới. Ví dụ: hãy cân nhắc việc đặt thuộc tính Text của thành phần kiểm soát Label thành như sau:

"Line 1
Line 2
Line 3"

Công thức trên tạo ra 3 dòng hiển thị trong thành phần kiểm soát nhãn:

Kiểm soát nhãn và chuỗi văn bản nhúng hiển thị ba dòng với Dòng 1, Dòng 2 và Dòng 3.

Dòng mới cũng được hỗ trợ với phép nội suy chuỗi, như minh họa bên dưới:

$"Line {1}
Line {1+1}
Line {1+1+1}"

Công thức trên tạo ra cùng một thông tin đầu ra:

Công thức nội suy chuỗi và điều khiển nhãn hiển thị ba dòng với Dòng 1, Dòng 2 và Dòng 3.

Nguồn lực hình ảnh và phương tiện

Thông qua menu Tệp, bạn có thể thêm hình ảnh, video và tệp âm thanh dưới dạng nguồn lực ứng dụng. Tên của tệp đã nhập trở thành tên nguồn lực trong ứng dụng. Trong hình đồ họa này, logo của Northwind Traders, tên là nwindlogo, đã được thêm vào một ứng dụng:

Tài nguyên gió Bắc.

Để sử dụng nguồn lực này trong ứng dụng, hãy chỉ định nguồn lực trong thuộc tính Image của một tùy chọn kiểm soát Hình ảnh:

Hình ảnh gió Bắc.

URI cho hình ảnh và phương tiện khác

Bạn có thể tìm hiểu sâu hơn về ví dụ cuối cùng đó bằng cách đặt thuộc tính Text của một tùy chọn kiểm soát Nhãn thành nwindlogo. Nhãn sẽ hiển thị một chuỗi văn bản:

Văn bản gió bắc.

Các ứng dụng Canvas tham chiếu từng hình ảnh hoặc tệp phương tiện khác, cho dù đó là trong đám mây hay được thêm dưới dạng nguồn lực ứng dụng, bằng chuỗi văn bản URI.

Ví dụ: thuộc tính Image của thành phần kiểm soát hình ảnh không chỉ chấp nhận tài nguyên ứng dụng mà còn chấp nhận cả đường liên kết đến các hình ảnh trên web, chẳng hạn như "https://northwindtraders.com/logo.jpg". Thuộc tính này cũng chấp nhận các hình ảnh nội tuyến sử dụng lược đồ URI dữ liệu, như trong ví dụ này:

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFAQMAAACtnVQoAAAABlBMVEUAAAB0J3UMNU6VAAAAAXRSTlMAQObYZgAAABRJREFUCNdjUGJgCGVg6GgAkkA2AA8/AffqCEBsAAAAAElFTkSuQmCC"

URI đó hiển thị phiên bản thu nhỏ của hai viên kim cương màu tím:

Kim cương đôi.

Bạn có thể hiển thị hình ảnh gần đây nhất chụp trong kiểm soát Máy ảnh nếu đặt thuộc tính Image của tùy chọn kiểm soát hình ảnh thành thuộc tính Photo của tùy chọn kiểm soát máy ảnh. Ứng dụng lưu giữ hình ảnh trong bộ nhớ, và thuộc tính Photo của tùy chọn kiểm soát máy ảnh trả về tham chiếu URI cho hình ảnh. Ví dụ: bạn có thể chụp ảnh và thuộc tính Photo của máy ảnh có thể trả về "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1".

Bạn sử dụng URI để tham chiếu hình ảnh hoặc tệp phương tiện khác được lưu trữ trong cơ sở dữ liệu. Theo đó, ứng dụng không truy xuất dữ liệu thực tế cho đến khi thực sự cần thiết. Ví dụ: một tệp đính kèm trong bảng Microsoft Dataverse có thể trả về "appres://datasources/Contacts/table/..." Như trong ví dụ về camera, bạn có thể hiển thị hình ảnh này bằng cách đặt thuộc tính Hình ảnh của tùy chọn kiểm soát hình ảnh thành tham chiếu này để truy xuất dữ liệu nhị phân.

Khi bạn lưu kiểu dữ liệu phương tiện, chẳng hạn như hình ảnh, vào cơ sở dữ liệu, ứng dụng sẽ gửi hình ảnh thực tế hoặc dữ liệu phương tiện, chứ không phải tham chiếu URI.

Giới hạn kích thước

Đối với chuỗi văn bản và URI, các kiểu dữ liệu này không có giới hạn độ dài đặt trước.

Dữ liệu nhị phân mà các kiểu dữ liệu này tham chiếu cũng không có giới hạn kích thước đặt trước. Ví dụ: hình ảnh chụp qua kiểm soát camera hiện được tham chiếu là "appres://..." có thể lớn và có độ phân giải cao vì máy ảnh của thiết bị có thể tập hợp. Độ phân giải, tỷ lệ khung hình và các thuộc tính khác của tệp phương tiện không bị giới hạn bởi kiểu dữ liệu, nhưng các kiểm soát cụ thể để phát và chụp phương tiện có thể có hạn chế riêng.

Tuy nhiên, tất cả kích thước của dữ liệu tùy thuộc vào dung lượng bộ nhớ khả dụng trong ứng dụng. Các trình duyệt chạy trên máy tính để bàn thường hỗ trợ hơn 100 megabyte dữ liệu. Tuy nhiên, dung lượng bộ nhớ khả dụng trên thiết bị như điện thoại có thể thấp hơn nhiều, thường là trong khoảng 30-70 megabyte. Để xác định xem ứng dụng của bạn có chạy trong các giới hạn này hay không, hãy kiểm tra các tình huống phổ biến trên tất cả các thiết bị mà ứng dụng sẽ chạy.

Cách tốt nhất là chỉ lưu giữ dữ liệu trong bộ nhớ khi cần thiết. Tải hình ảnh lên cơ sở dữ liệu ngay khi có thể; chỉ tải hình ảnh xuống khi người dùng ứng dụng yêu cầu.

Số

Lưu ý

Power Apps chỉ hỗ trợ Float hôm nay và nó là loại của tất cả các số. Hỗ trợ thập phân sẽ sớm được bổ sung.

Power Fx hỗ trợ hai loại số: Số thập phânSố nổi (có từ đồng nghĩa SốTiền tệ).

Số thập phân là tốt nhất cho hầu hết các tính toán kinh doanh. Nó có thể biểu diễn chính xác các số trong cơ số 10 nghĩa là 0.1 có thể được biểu diễn chính xác và sẽ không dễ xảy ra lỗi làm tròn trong quá trình tính toán. Nó có phạm vi đủ lớn cho mọi nhu cầu kinh doanh, lên tới 1028 với độ chính xác lên tới 28 chữ số. Thập phân là kiểu dữ liệu số mặc định cho hầu hết các máy chủ Power Fx , được sử dụng nếu chỉ ghi 2*2.

Float là cách tốt nhất để tính toán khoa học. Nó có thể biểu thị các số trong phạm vi lớn hơn nhiều, lên tới 10308. Độ chính xác được giới hạn ở 15 chữ số thập phân và toán học dựa trên cơ số 2 nên nó không thể biểu thị chính xác một số giá trị thập phân phổ biến. Float cũng có hiệu suất cao hơn và được ưa chuộng nếu đó là một yếu tố và độ chính xác không quá quan trọng.

Số thập phân

Kiểu dữ liệu Thập phân thường sử dụng kiểu dữ liệu .NET thập phân. Một số máy chủ, chẳng hạn như Dataverse cột công thức chạy trong SQL Serer, sử dụng kiểu dữ liệu thập phân của SQL Server.

Thập phân làm toán theo cách bạn đã học ở trường, sử dụng 10 chữ số cơ số. Điều này rất quan trọng để tránh lỗi làm tròn từ những khác biệt rất nhỏ có thể tích lũy khi sử dụng phép toán cơ số 2 (như được sử dụng bởi Float).

Phạm vi là từ 79,228,162,514,264,337,593,543,950,335 dương đến 79,228,162,514,264,337,593,543,950,335 âm. Dấu tách thập phân có thể được đặt ở bất kỳ đâu trong các số này, cung cấp độ chính xác lên tới 28 chữ số và vẫn được biểu thị chính xác. Ví dụ: 79,228,162,514,264.337593543950335 có thể được biểu diễn chính xác, cũng như 7.9228162514264337593543950335.

Số dấu phẩy động

Loại dữ liệu Float , còn được gọi là Số hoặc Tiền tệ, sử dụng tiêu chuẩn dấu phẩy động có độ chính xác kép IEEE 754. Tiêu chuẩn này cung cấp một lượng lớn để làm việc, từ –1,79769 x 10308 đến 1,79769 x 10308. Giá trị nhỏ nhất có thể được biểu diễn là 5 x 10–324.

Float có thể biểu diễn chính xác các số nguyên (hoặc số nguyên) giữa –9,007,199,254,740,991 (–(253 – 1)) và 9,007,199,254,740,991 (253 – 1), đã bao gồm. Phạm vi này lớn hơn các kiểu dữ liệu số nguyên 32 bit (hoặc 4 byte) mà cơ sở dữ liệu thường sử dụng. Tuy nhiên, các ứng dụng canvas không thể biểu thị các kiểu dữ liệu số nguyên 64 bit (hoặc 8 byte). Bạn nên lưu trữ số trong trường văn bản hoặc dùng một cột đã tính để tạo bản sao của số đó trong trường văn bản, sao cho số đó được ánh xạ vào kiểu dữ liệu Văn bản trong ứng dụng canvas. Theo cách này, bạn có thể lưu giữ, hiển thị và nhập các giá trị này, cũng như so sánh các giá trị để xác định xem có bằng nhau hay không; tuy nhiên, bạn không thể thực hiện các phép tính số trong biểu mẫu này.

Số học dấu phẩy động là gần đúng, do đó, đôi khi có thể tạo ra kết quả bất ngờ qua nhiều ví dụ được ghi lại. Bạn có thể kỳ vọng công thức 55/100*100 trả về chính xác là 55 và (55/100*100)-55 trả về chính xác bằng 0. Tuy nhiên, công thức sau trả về 7,1054 x 10–15, rất nhỏ nhưng không phải bằng 0. Sự khác biệt nhỏ đó thường không gây ra vấn đề và ứng dụng sẽ làm tròn khi hiển thị kết quả. Tuy nhiên, những khác biệt nhỏ có thể kết hợp trong các phép tính tiếp theo và có vẻ đưa ra câu trả lời sai.

Các hệ thống cơ sở dữ liệu thường lưu trữ đơn vị tiền tệ và thực hiện phép tính bằng cách sử dụng phép toán thập phân, mang lại phạm vi nhỏ hơn nhưng kiểm soát chính xác hơn. Theo mặc định, các ứng dụng canvas ánh xạ đơn vị tiền tệ vào hoặc ra các giá trị dấu phẩy động; kết quả có thể khác với các phép tính được thực hiện trong kiểu dữ liệu thập phân gốc. Nếu kiểu sai lệch này gây ra sự cố, bạn nên làm việc với các giá trị này dưới dạng Văn bản, giống như bạn có thể làm với các số nguyên lớn được mô tả ở đầu phần này.

Mặc định và chuyển đổi

Lưu ý

Power Apps chỉ hỗ trợ Float hôm nay và nó là loại của tất cả các số. Hỗ trợ thập phân sẽ sớm được bổ sung.

Hầu hết Power Fx máy chủ sử dụng Thập phân theo mặc định. Điều này tác động:

  • Số chữ trong công thức. Số 1.234 sẽ được hiểu là giá trị Thập phân . Ví dụ: công thức 1.234 * 2 sẽ diễn giải 1.2342 dưới dạng Thập phân và trả về a kết quả Thập phân .
  • Hàm giá trị. Value( "1.234" ) sẽ trả về giá trị Thập phân . Ví dụ: hàm công thức Value( "1.234" ) * 2 hàm Value sẽ diễn giải nội dung của chuỗi văn bản "1.234" dưới dạng a Thập phân.

Để làm việc với các giá trị Float , hàm Float được sử dụng. Mở rộng ví dụ trên, Float( 1.234 ) sẽ chuyển đổi Thập phân1.234 thành Float. Float cũng có thể được sử dụng thay thế cho Giá trị để chuyển đổi một chuỗi chứa số dấu phẩy động chẳng hạn như Float( "1.234" ) thành a giá trị Float , bắt buộc nếu số không thể được biểu diễn dưới dạng Thập phân.

Tóm tắt:

Mức sử dụng Số thập phân Trôi nổi
Số nguyên văn trong công thức 1.234 Float( 1.234 )
Float( "1.234" )
Chuyển đổi từ chuỗi văn bản Value( "1.234" )
Decimal( "1.234" )
Float( "1.234" )
Chuyển đổi giữa các loại số Decimal( float ) Float( decimal )
Chuyển đổi sang chuỗi văn bản Text( decimal ) Text( float )

Trộn các loại số

Các giá trị nổiThập phân có thể được trộn lẫn một cách tự do. Khi kết hợp, giá trị thập phân được chuyển đổi thành giá trị nổi do phạm vi lớn hơn. Vì điều này có thể dẫn đến mất độ chính xác nên điều quan trọng là không trộn lẫn cả hai một cách không cần thiết. Vì Thập phân là kiểu dữ liệu hằng mặc định và hầu hết các hàm số sẽ giữ nguyên kiểu đó nên việc tránh chuyển sang Float là tương đối dễ dàng mà không hề mong muốn.

Ví dụ: hãy xem xét phép tính sau bằng cách sử dụng pac power-fx repl sau khi cài đặt Power Platform CLI. Vì cả hai số đều là Thập phân nên phép tính được thực hiện ở dạng Thập phân và kết quả vẫn giữ được độ chính xác hoàn toàn:

>> 1.0000000000000000000000000001 * 2
2.0000000000000000000000000002

Thay vào đó, toán hạng thứ hai được đổi thành Float thì toàn bộ phép tính sẽ được thực hiện trong Float và phần nhỏ phần phân số sẽ bị mất:

>> 1.0000000000000000000000000001 * Float(2)
2

Ngày, giờ và Ngày giờ

Múi giờ

Các giá trị ngày/giờ thuộc các loại sau:

  • Địa phương của người dùng: Những giá trị này được lưu trữ theo UTC (Giờ phối hợp quốc tế), nhưng múi giờ của người dùng ứng dụng ảnh hưởng đến cách ứng dụng hiển thị các giá trị này và cách người dùng ứng dụng chỉ định chúng. Ví dụ: một thời điểm lại xuất hiện theo cách khác nhau với người dùng ở Canada và người dùng ở Nhật Bản.
  • Múi giờ độc lập: Ứng dụng hiển thị các giá trị này theo cùng một cách và người dùng ứng dụng chỉ định chúng theo cùng một cách, bất kể múi giờ. Một thời điểm xuất hiện theo cách giống nhau với người dùng ở Canada và người dùng ở Nhật Bản. Các tác giả ứng dụng không muốn ứng dụng của họ chạy ở các múi giờ khác nhau sẽ sử dụng những giá trị này vì nhìn chung, chúng đơn giản hơn.

Bảng này cho thấy một số ví dụ:

Kiểu ngày/giờ Giá trị lưu trữ trong cơ sở dữ liệu Giá trị được hiển thị và nhập 7 giờ về phía tây của UTC Giá trị được hiển thị và nhập 4 giờ về phía đông của UTC
Địa phương của người dùng Chủ nhật,19tháng 5,2019
4:00 SA
Thứ bảy,18tháng 5,2019
9:00 CH
Chủ nhật,19tháng 5,2019
8:00 SA
Múi giờ độc lập Chủ nhật,19tháng 5,2019
4:00 SA
Chủ nhật,19tháng 5,2019
4:00 SA
Chủ nhật,19tháng 5,2019
4:00 SA

Đối với ngày/giờ Địa phương của người dùng, các ứng dụng canvas sử dụng múi giờ của trình duyệt hoặc thiết bị, nhưng ứng dụng dựa trên mô hình sử dụng thiết đặt của người dùng trong Dataverse. Những thiết đặt này thường khớp, nhưng kết quả sẽ khác nếu các thiết đặt khác nhau.

sử dụng các hàm DateAddTimeZoneInformation để chuyển giờ địa phương sang UTC và ngược lại. Xem ví dụ ở cuối tài liệu về các hàm này.

Số tương đương

Ứng dụng Canvas lưu giữ và tính toán tất cả các giá trị ngày/giờ, cho dù là Địa phương của người dùng hay Múi giờ độc lập theo UTC. Ứng dụng chuyển các giá trị theo múi giờ của người dùng ứng dụng khi hiển thị và khi người dùng ứng dụng chỉ định các giá trị đó.

Khi một ứng dụng canvas đọc một giá trị Múi giờ độc lập từ nguồn dữ liệu hoặc ghi giá trị đó vào nguồn dữ liệu, ứng dụng sẽ tự động điều chỉnh giá trị để bù cho múi giờ của người dùng ứng dụng. Sau đó, ứng dụng sẽ coi giá trị là giá trị UTC, phù hợp với tất cả các giá trị ngày/giờ khác trong ứng dụng. Do việc bù này, giá trị Múi giờ độc lập ban đầu sẽ xuất hiện khi ứng dụng điều chỉnh giá trị UTC cho múi giờ của người dùng ứng dụng.

Bạn có thể quan sát hành vi này chặt chẽ hơn bằng cách dùng hàm Value để truy cập vào giá trị số cơ bản của một giá trị ngày/giờ. Hàm này trả về giá trị ngày/giờ dưới dạng số milli giây kể từ ngày 1 tháng 1, 1970 00:00:00.000 UTC.

Vì mọi giá trị ngày/giờ được lưu trữ theo UTC, công thức Value( Date( 1970, 1, 1 ) ) sẽ không trả về số 0 ở hầu hết các nơi trên thế giới vì hàm Date trả về ngày theo UTC. Ví dụ: công thức sẽ trả về 28,800,000 theo múi giờ được bù 8 giờ so với UTC. Số đó phản ánh số milli giây trong 8 giờ.

Trở về ví dụ của chúng tôi ở trên:

Kiểu ngày/giờ Giá trị lưu trữ trong cơ sở dữ liệu Giá trị được hiển thị và nhập 7 giờ về phía tây của UTC Hàm Value trả về
Địa phương của người dùng Chủ nhật,19tháng 5,2019
4:00 SA
Thứ bảy,18tháng 5,2019
9:00 CH
1,558,238,400,000
(Chủ nhật,19tháng 5,2019
4:00 SA UTC)
Múi giờ độc lập Chủ nhật,19tháng 5,2019
4:00 SA
Chủ nhật,19tháng 5,2019
4:00 SA
1,558,263,600,000
(Chủ nhật,19tháng 5,2019
11:00 SA UTC)

Chuyển đổi giờ Unix

Giờ Unix phản ánh số giây kể từ ngày 1 tháng 1, 1970 00:00:00 UTC. Vì các ứng dụng canvas sử dụng mili giây thay vì giây, bạn có thể chuyển đổi giữa hai ứng dụng bằng cách nhân hoặc chia cho 1.000.

Ví dụ: giờ Unix hiển thị ngày 9 tháng 9 năm 2001, lúc 01:46:40 UTC là 1.000.000.000. Để hiển thị giá trị ngày/giờ đó trong ứng dụng canvas, hãy nhân số đó với 1.000 để chuyển thành mili giây, sau đó sử dụng trong hàm Text. Công thức Text(1000000000*1000,DateTimeFormat.UTC) trả về chuỗi 2001-09-09T01:46:40.000Z.

Tuy nhiên, hàm đó trả về Thứ bảy, ngày 8 tháng 9, 2001 18:46:40 nếu bạn dùng định dạng DateTimeFormat.LongDateTime24 theo múi giờ bù -7 giờ so với UTC (7 giờ về phía tây của UTC). Kết quả này cho biết giá trị DateTime một cách chính xác dựa trên múi giờ địa phương.

Để chuyển sang giờ Unix, hãy chia kết quả từ Value cho 1.000:
RoundDown( Value( UnixTime ) / 1000, 0 )

Nếu bạn cần giờ Unix ở giá trị Ngày để tính toán thêm hoặc hiển thị trong Power Apps, hãy sử dụng công thức này:
DateAdd( Date( 1970,1,1 ), UnixTime, Seconds )

SQL Server

Máy chủ SQL có Datetime, Datetime2 và các kiểu dữ liệu ngày/giờ khác không bao gồm phần bù múi giờ và không cho biết các kiểu dữ liệu thuộc múi giờ nào. Các ứng dụng Canvas giả định những giá trị này được lưu trữ trong UTC và xem chúng là Địa phương của người dùng. Nếu giá trị có nghĩa là độc lập về múi giờ, hãy sửa các bản dịch UTC bằng cách dùng hàm TimeZoneOffset.

Các ứng dụng Canvas sử dụng thông tin múi giờ đi kèm trong trường Datetimeoffset khi chuyển đổi giá trị thành cách biểu thị UTC nội bộ của ứng dụng. Các ứng dụng này luôn sử dụng UTC làm múi giờ (bù múi giờ bằng 0) khi ghi dữ liệu.

Ứng dụng Canvas đọc và ghi giá trị của kiểu dữ liệu Giờ trong máy chủ SQL khi chuỗi văn bản ở định dạng thời lượng ISO 8601. Ví dụ: bạn phải phân tích định dạng chuỗi này và sử dụng hàm Time để chuyển chuỗi văn bản "PT2H1M39S" thành giá trị Giờ:

With(
    Match( "PT2H1M39S", "PT(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ),
    Time( Value( hours ), Value( minutes ), Value( seconds ) )
)
// Result: 2:01 AM (as shown in a label control, use the Text function to see the seconds)

Kết hợp thông tin ngày và giờ

Ngày, GiờNgày giờ có tên khác nhau nhưng đều có cùng thông tin về ngày và giờ.

Giá trị Ngày có thể bao gồm thông tin thời gian, thường là nửa đêm. Giá trị Giờ có thể chứa thông tin ngày, thường là 1 tháng 1 năm 1970. Dataverse cũng lưu trữ thông tin thời gian bằng trường Chỉ ngày nhưng chỉ hiển thị thông tin ngày theo mặc định. Tương tự, các ứng dụng canvas đôi khi phân biệt giữa những kiểu dữ liệu này để xác định các định dạng và tùy chọn kiểm soát mặc định.

Không nên thêm và trừ các giá trị ngày và giờ trực tiếp vì múi giờ và các phép chuyển đổi khác có thể gây ra kết quả khó hiểu. Sử dụng hàm Value để chuyển đổi giá trị ngày/giờ thành mili giây trước rồi xem xét múi giờ của người dùng ứng dụng hoặc sử dụng các hàm DateAddDateDiff để thêm hoặc trừ từ một trong các giá trị này.

Lựa chọn và Có/Không

Lựa chọn và kiểu dữ liệu hai tùy chọn cung cấp hai hoặc nhiều lựa chọn cho người dùng ứng dụng. Ví dụ: một lựa chọn Trạng thái đơn hàng có thể cung cấp các lựa chọn Mới, Đã vận chuyển, Đã lập hóa đơnĐã đóng. Kiểu dữ liệu hai tùy chọn chỉ cung cấp 2 lựa chọn.

Cả hai kiểu dữ liệu này đều hiển thị nhãn của chúng trong ngữ cảnh chuỗi văn bản. Ví dụ: tùy chọn kiểm soát nhãn hiển thị một trong các tùy chọn trạng thái đơn hàng nếu thuộc tính Văn bản của tùy chọn kiểm soát này được đặt thành một công thức tham chiếu đến lựa chọn đó. Các nhãn tùy chọn có thể được bản địa hóa cho người dùng ứng dụng ở các vị trí khác nhau.

Khi người dùng ứng dụng chọn một tùy chọn và lưu thay đổi đó, ứng dụng sẽ truyền dữ liệu đến cơ sở dữ liệu, nơi lưu trữ dữ liệu đó trong một cách biểu thị không phụ thuộc vào ngôn ngữ. Một tùy chọn trong một lựa chọn được truyền và lưu trữ dưới dạng số, còn một tùy chọn trong kiểu dữ liệu hai tùy chọn được truyền và lưu trữ dưới dạng giá trị boolean.

Các nhãn chỉ dành cho mục đích hiển thị. Bạn không thể thực hiện so sánh trực tiếp với các nhãn vì chúng dành riêng cho một ngôn ngữ. Thay vào đó, mỗi lựa chọn có một kiểu liệt kê hoạt động với số cơ bản hoặc giá trị boolean. Ví dụ: bạn không thể sử dụng công thức này:

If( ThisItem.OrderStatus = "Active", ...

Nhưng bạn có thể sử dụng công thức này:

If( ThisItem.OrderStatus = OrderStatus.Active, ...

Đối với các lựa chọn chung (bảng nào sẽ chia sẻ), tên của kiểu liệt kê tập hợp tùy chọn sẽ khớp với tên của lựa chọn chung. Đối với các lựa chọn cục bộ (trong phạm vi một bảng), tên có thể chứa tên của bảng. Hành vi này giúp tránh xung đột nếu nhiều bảng có các lựa chọn trùng tên. Ví dụ: bảng Tài khoản có thể có lựa chọn Trạng thái đơn hàng và tên của lựa chọn đó có thể là Trạng thái đơn hàng (Tài khoản). Tên đó chứa một hoặc nhiều dấu cách và dấu ngoặc đơn, vì vậy bạn phải bao quanh bằng một dấu ngoặc đơn nếu tham chiếu trong một công thức.

Ngoài ra, các giá trị hai tùy chọn cũng có thể hoạt động như các giá trị boolean. Ví dụ: giá trị hai tùy chọn tên là TaxStatus có thể có nhãn Chịu thuếKhông chịu thuế, tương ứng với đúngsai. Để minh họa, bạn có thể sử dụng công thức sau:

If( ThisItem.Taxable = TaxStatus.Taxable, ...

Bạn cũng có thể dùng công thức tương đương sau:

If( ThisItem.Taxable, ...