Toán tử và định danh trong Power Apps

Áp dụng cho: Ứng dụng canvas Ứng dụng dựa trên mô hình

Một số toán tử này phụ thuộc vào ngôn ngữ của tác giả. Để biết thêm thông tin về hỗ trợ ngôn ngữ trong ứng dụng canvas, hãy xem Ứng dụng toàn cầu.

Ký hiệu Loại Ví dụ: Description
'...' Mã định danh 'Account Name' Định danh có chứa các ký tự đặc biệt, bao gồm khoảng trắng, được đặt trong dấu nháy đơn
"..." Chuỗi văn bản "Xin chào thế giới" Các chuỗi được đặt trong dấu ngoặc kép
$"..." Nội suy chuỗi $"Dear {FirstName}," Các công thức được nhúng trong một chuỗi văn bản
. Bộ chọn thuộc tính Slider1.Value
Color.Red
Acceleration.X
Trích xuất một thuộc tính từ bảng, điều khiển, dấu hiệu hoặc liệt kê. Để tương thích ngược, ! cũng có thể được dùng.
.
[thành phần phụ thuộc ngôn ngữ]
Dấu phân tách thập phân 1.23 Dấu phân cách giữa số nguyên và các phần phân số của một số. Ký tự phụ thuộc vào ngôn ngữ.
( ) Dấu ngoặc đơn Bộ lọc (T, A < 10)

(1 + 2) * 3
Thực thi thứ tự ưu tiên và nhóm các biểu thức con trong một biểu thức lớn hơn
+ Toán tử số học 1 + 2 Cộng
-   2 - 1 Phép trừ và dấu
*   2 * 3 Nhân
/   2 / 3 Chia (xem cả hàm Mod)
^   2 ^ 3 Lũy thừa, tương đương với hàm Power
%   20% Tỷ lệ phần trăm (tương đương với "* 1/100")
= Toán tử so sánh Giá = 100 Bằng
>   Giá > 100 Lớn hơn
>=   Giá >= 100 Lớn hơn hoặc bằng
<   Giá < 100 Nhỏ hơn
<=   Giá <= 100 Nhỏ hơn hoặc bằng
<>   Giá <> 100 Không bằng
& Toán tử nối chuỗi "xin chào" & " " & "thế giới" Làm cho nhiều chuỗi xuất hiện liên tục
&& hoặc Toán tử lô-gic Giá < 100 && Thanh trượt1.Value = 20
hoặc Giá < 100 And Slider1.Value = 20
Kết hợp logic, tương đương với hàm And
|| hoặc Hoặc   Price < 100 || Slider1.Value = 20 or Price < 100 Or Slider1.Value = 20 Tách rời logic, tương đương với hàm Hoặc
! hoặc Không   !(Giá < 100) hoặc Không (Giá < 100) Phủ định logic, tương đương với hàm Not
exactin Toán tử thành viên Gallery1.Selected exactin SavedItems Thuộc về bộ sưu tập hoặc bảng
exactin   "Windows" exactin “To display windows in the Windows operating system...” Kiểm tra chuỗi con (phân biệt chữ hoa chữ thường)
trong   Gallery1.Selected trong SavedItems Thuộc về bộ sưu tập hoặc bảng
trong   "The" in "The keyboard and the monitor..." Kiểm tra chuỗi con (không phân biệt chữ hoa chữ thường)
@ Toán tử định hướng MyTable[@fieldname] Định hướng trường
@   [@MyVariable] Định hướng toàn cầu
,
[thành phần phụ thuộc ngôn ngữ]
Dấu phân tách danh sách Nếu( X < 10, "Thấp", "Tốt" )
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
Dấu phân tách:
  • đối số trong lệnh gọi hàm
  • các trường trong một bản ghi
  • các bản ghi trong một bảng
Ký tự này phụ thuộc vào ngôn ngữ.
;
[thành phần phụ thuộc ngôn ngữ]
Tạo chuỗi công thức Collect(T, A); Navigate(S1, "") Yêu cầu riêng biệt của các hàm trong các thuộc tính hành vi. Toán tử tạo chuỗi phụ thuộc vào ngôn ngữ.
Thành As operator AllCustomers As Customer Ghi đè ThisItemThisRecord trong thư viện và các hàm phạm vi bản ghi. As rất hữu ích để cung cấp một tên cụ thể, tốt hơn và đặc biệt quan trọng trong các tình huống lồng nhau.
Bản thân Toán tử Self Self.Fill Truy cập vào các thuộc tính của điều khiển hiện tại
Cấp độ mẹ Toán tử mẹ Parent.Fill Truy cập vào các thuộc tính của một bộ chứa điều khiển
ThisItem Toán tử ThisItem ThisItem.FirstName Truy cập vào các trường của điều khiển Thư viện hoặc biểu mẫu
ThisRecord Toán tử ThisRecord ThisRecord.FirstName Truy cập vào bản ghi đầy đủ và các trường riêng lẻ của bản ghi trong ForAll, Sum, With và các hàm phạm vi bản ghi khác. Có thể được ghi đè bằng toán tử As.

Lưu ý

Toán tử @ cũng có thể được dùng để xác thực loại đối tượng bản ghi khi đối chiếu với nguồn dữ liệu. Ví dụ: Collect(coll,Account@{'Account Number: 1111')

toán tử trong và chính xác

Sử dụng các toán tử inexactin để tìm một chuỗi trong nguồn dữ liệu, chẳng hạn như một bộ sưu tập hoặc bảng đã nhập. Toán tử trong xác định các kết quả khớp bất kể trường hợp và toán tử chính xác chỉ xác định các kết quả khớp nếu chúng được viết hoa theo cùng một cách. Dưới đây là một ví dụ:

  1. Tạo hoặc nhập bộ sưu tập tên là Hàng tồn kho và hiển thị bộ sưu tập này trong thư viện, như quy trình đầu tiên được mô tả trong phần Hiển thị hình ảnh và văn bản trong thư viện.

  2. Đặt thuộc tính Mục của bộ sưu tập thành công thức sau:
    Filter(Inventory, "E" in ProductName)

    Thư viện hiển thị tất cả các sản phẩm ngoại trừ Callisto vì tên của sản phẩm đó là tên duy nhất không chứa chữ bạn đã chỉ định.

  3. Thay đổi thuộc tính Mục của thư viện thành công thức sau:
    Filter(Inventory, "E" exactin ProductName)

    Thư viện chỉ hiển thị Europa vì chỉ tên của nó chứa chữ cái mà bạn đã chỉ định trong trường hợp bạn đã chỉ định.

Các toán tử ThisItem, ThisRecord và As

Một số điều khiển và hàm áp dụng công thức cho các bản ghi riêng lẻ của bảng. Để tham chiếu đến bản ghi riêng lẻ trong một công thức, hãy sử dụng một trong các cách sau:

Toán tử Áp dụng cho Mô tả
ThisItem Điều khiển Thư viện
Điều khiển Chỉnh sửa biểu mẫu
Điều khiểnHiển thị biểu mẫu
Tên mặc định cho bản ghi hiện tại trong kiểm soát Bộ sưu tập hoặc biểu mẫu.
ThisRecord ForAll, Filter, With, Sum và các hàm phạm vi bản ghi khác Tên mặc định cho bản ghi hiện tại trong ForAll và các hàm phạm vi bản ghi khác.
tên Điều khiển Thư viện
ForAll, Filter, With, Sum và các hàm phạm vi bản ghi khác
Xác định tên cho bản ghi hiện tại, thay thế ThisItem hoặc ThisRecord mặc định. Sử dụng As để làm cho các công thức dễ hiểu hơn và giải quyết sự không rõ ràng khi lồng vào nhau.

Toán tử ThisItem

Ví dụ: trong điều khiển Thư viện sau đây, thuộc tính Mục được đặt cho nguồn dữ liệu Nhân viên (chẳng hạn như bảng Nhân viên có trong mẫu Northwind Traders):

Employees

Nhân viên được trưng bày trong một phòng trưng bày.

Mục đầu tiên trong thư viện là một mẫu được sao chép cho mỗi nhân viên. Trong mẫu, công thức cho hình ảnh sử dụng ThisItem để tham khảo mục hiện tại:

ThisItem.Picture

Công thức cho hình ảnh của một nhân viên.

Tương tự, công thức cho tên cũng sử dụng ThisItem:

ThisItem.'First Name' & " " & ThisItem.'Last Name'

Công thức đầu tiên và họ của một nhân viên.

Toán tử ThisRecord

ThisRecord được sử dụng trong các hàm có phạm vi bản ghi. Ví dụ: chúng ta có thể sử dụng hàm Filter với thuộc tính Mục trong thư viện để chỉ hiển thị các tên đi cùng M:

Filter( Employees, StartsWith( ThisRecord.Employee.'First Name', "M" ) )

Lọc nhân viên dựa trên tên, sử dụng ThisRecord.

ThisRecord là tùy chọn và được ngụ ý bằng cách sử dụng các trường trực tiếp, ví dụ: trong trường hợp này, chúng tôi có thể viết:

Filter( Employees, StartsWith( 'First Name', "M" ) )

Mặc dù tùy chọn, sử dụng ThisRecord có thể làm cho các công thức dễ hiểu hơn và có thể được yêu cầu trong các tình huống mơ hồ trong đó tên trường cũng có thể là tên mối quan hệ. ThisRecord là tùy chọn trong khi ThisItem luôn được yêu cầu.

Sử dụng ThisRecord để tham khảo toàn bộ bản ghi với Patch, Collect và các hàm phạm vi bản ghi khác. Ví dụ: công thức sau đây đặt trạng thái cho tất cả nhân viên không hoạt động thành hiện hoạt:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees,
              Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )

Toán tử As

Sử dụng toán tử As để đặt tên cho bản ghi trong thư viện hoặc hàm phạm vi bản ghi, ghi đè ThisItem hoặc ThisRecord mặc định. Đặt tên bản ghi có thể làm cho công thức của bạn dễ hiểu hơn và có thể được yêu cầu trong các tình huống lồng nhau để truy cập các bản ghi trong phạm vi khác.

Ví dụ: bạn có thể sửa đổi thuộc tính Mục trong thư viện của chúng tôi để sử dụng As để xác định rằng chúng tôi đang làm việc với một Nhân viên:

Employees As Employee

Thư viện nhân viên, sử dụng toán tử As.

Công thức cho hình ảnh và tên được điều chỉnh để sử dụng tên này cho bản ghi hiện tại:

Employee.Picture

Hình ảnh một nhân viên sử dụng tên Nhân viên được đặt bằng toán tử As.

Employee.'First Name' & " " & Employee.'Last Name'

Đầu tiên và họ của một nhân viên sử dụng tên Nhân viên được đặt bằng toán tử As.

As cũng có thể được sử dụng với các hàm phạm vi bản ghi để thay thế tên mặc định ThisRecord. Chúng ta có thể áp dụng điều này cho ví dụ trước để làm rõ bản ghi chúng ta đang làm việc cùng:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees As Employee,
              Patch( Employees, Employee, { Status: 'Status (Employees)'.Active } ) ) )

Khi lồng các thư viện và các hàm phạm vi bản ghi, ThisItemThisRecord luôn đề cập đến phạm vi bên trong nhất, để lại các bản ghi trong phạm vi bên ngoài không khả dụng. Sử dụng As để cung cấp tất cả các phạm vi bản ghi bằng cách đặt cho mỗi phạm vi một tên duy nhất.

Ví dụ: công thức này tạo ra một mẫu bàn cờ dưới dạng một chuỗi văn bản bằng cách lồng hai hàm ForAll:

Concat(
    ForAll( Sequence(8) As Rank,
        Concat(
            ForAll( Sequence(8) As File,
                    If( Mod(Rank.Value + File.Value, 2) = 1, " X ", " . " )
            ),
            Value
        ) & Char(10)
    ),
    Value
)

Thiết lập thuộc tính Văn bản của kiểm soát Nhãn cho công thức này sẽ hiển thị:

Văn bản bàn cờ được hiển thị trong điều khiển nhãn.

Hãy tìm hiểu những gì đang xảy ra ở đây:

  • Chúng ta bắt đầu bằng cách lặp lại một bảng không tên gồm 8 bản ghi được đánh số từ hàm Sequence. Vòng lặp này dành cho mỗi hàng của bảng, thường được gọi là Cấp, vì vậy chúng ta đặt tên này cho nó.
  • Đối với mỗi hàng, chúng ta lặp lại một bảng không tên khác gồm 8 cột và chúng ta đặt tên chung là Tệp.
  • Nếu Rank.Value + File.Value là một số lẻ, hình vuông sẽ nhận được X, nếu không sẽ nhận được dấu chấm. Phần này của công thức tham chiếu đến cả hai vòng lặp ForAll, được thực hiện bằng cách sử dụng As.
  • Concat được sử dụng hai lần, lần đầu để tập hợp các cột, sau đó là các hàng, với Char(10) được đặt vào để tạo dòng mới.

Một ví dụ tương tự có thể xảy ra với các điều khiển Thư viện lồng nhau, thay vì các hàm ForAll. Hãy bắt đầu với thư viện dọc cho Cấp. Điều khiển thư viện này sẽ có một công thức Mục gồm:

Sequence(8) as Rank

Hình minh họa của thư viện bên ngoài cung cấp phép lặp Xếp hạng.

Trong thư viện này, chúng tôi sẽ đặt một thư viện ngang cho Tệp, điều đó sẽ được sao chép cho mỗi Cấp, với một thuộc tính Mục của:

Sequence(8) as File

Hình minh họa thư viện bên trong cung cấp tính năng lặp lại Tệp.

Và cuối cùng, trong thư viện này, chúng ta sẽ thêm một điều khiển Nhãn sẽ được sai chép cho mỗi Tệp và mỗi Cấp. Chúng ta sẽ định kích thước cho vừa toàn bộ không gian và sử dụng thuộc tính Lấp đầy để cung cấp màu với công thức này:

If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )

Kiểm soát nhãn trong hai phòng trưng bày cung cấp các màu xen kẽ cho bàn cờ.

Toán tử Self và Parent

Có ba cách để tham khảo một điều khiển và các thuộc tính của nó trong một công thức:

Phương pháp Mô tả
Theo tên chức năng điều khiển Bất kỳ chức năng điều khiển nào cũng có thể được tham chiếu theo tên từ bất kỳ đâu trong ứng dụng.

Ví dụ: Label1.Fill đề cập đến thuộc tính điền của chức năng điều khiển có tên là Label1.
Toán tử Self Thật thuận tiện khi tham chiếu một thuộc tính khác có cùng chức năng điều khiển khi viết công thức. Thay vì sử dụng một tham chiếu tuyệt đối theo tên, việc sử dụng một tham chiếu tương đối dễ dàng và dễ sử dụng hơnself. Toán tử Self cho phép dễ dàng truy cập vào chức năng điều khiển hiện tại.

Ví dụ: Self.Fill đề cập đến màu tô của chức năng điều khiển hiện tại.
Toán tử mẹ Một số chức năng điều khiển lưu trữ các chức năng điều khiển khác, chẳng hạn như các chức năng điều khiển Màn hìnhThư viện. Chức năng điều khiển lưu trữ của các điều khiển bên trong có tên là parent. Giống như toán tử Self, toán tử Parent cung cấp một tham chiếu tương đối dễ đến chức năng điều khiển bộ chứa.

Ví dụ: Parent.Fill tham chiếu đến thuộc tính điền của chức năng điều khiển là bộ chứa cho chức năng điều khiển hiện tại.

SelfParent là các toán tử chứ không phải là thuộc tính trên các chức năng điều khiển. Tham chiếu đến Parent.Parent, Self.Parent hoặc Parent.Self không được hỗ trợ.

Tên định danh

Tên của các biến, nguồn dữ liệu, cột và các đối tượng khác có thể chứa bất kỳ Unicode nào.

Sử dụng dấu ngoặc đơn quanh tên có chứa khoảng trắng hoặc ký tự đặc biệt khác.
Sử dụng hai dấu nháy đơn cùng với nhau để biểu thị một dấu ngoặc kép trong tên. Tên không chứa ký tự đặc biệt không yêu cầu dấu nháy đơn.

Dưới đây là một số tên cột ví dụ bạn có thể gặp trong bảng và cách chúng được thể hiện trong công thức:

Tên cột trong cơ sở dữ liệu Tham chiếu cột trong một công thức
SimpleName SimpleName
NameWith123Numbers NameWith123Numbers
Tên có dấu cách 'Name with spaces'
Tên với "dấu ngoặc kép" 'Name with "double" quotes'
Tên với 'dấu nháy đơn' 'Name with ''single'' quotes'
Tên có dấu @ 'Name with an @ at sign'

Dấu ngoặc kép được sử dụng để chỉ định chuỗi văn bản.

Tên hiển thị và tên lô-gic

Một số nguồn dữ liệu như SharePoint và Microsoft Dataverse có hai tên khác nhau để chỉ cùng một bảng hoặc cột dữ liệu:

  • Tên logic - Tên được đảm bảo là duy nhất, không thay đổi sau khi được tạo, thường không cho phép khoảng trắng hoặc các ký tự đặc biệt khác và không được bản địa hóa thành các ngôn ngữ khác. Kết quả là, cái tên có thể khó hiểu. Những tên này được sử dụng bởi các nhà phát triển chuyên nghiệp. Ví dụ: cra3a_customfield. Tên này cũng có thể được gọi là tên lược đồ hoặc chỉ tên.

  • Tên hiển thị - Một tên thân thiện với người dùng và được người dùng cuối nhìn thấy. Tên này có thể không phải là duy nhất, có thể thay đổi theo thời gian, có thể chứa khoảng trắng và bất kỳ ký tự Unicode nào và có thể được bản địa hóa thành các ngôn ngữ khác. Tương ứng với ví dụ trên, tên hiển thị có thể là Trường tùy chỉnh với không gian ở giữa các từ.

Vì tên hiển thị dễ hiểu hơn, các ứng dụng Canvas sẽ đề xuất chúng làm lựa chọn và không đề xuất tên logic. Mặc dù tên hợp lý không được gợi ý, chúng vẫn có thể được sử dụng nếu được nhập gián tiếp.

Ví dụ: hãy tưởng tượng bạn đã thêm một Trường tùy chỉnh vào một bảng trong Dataverse. Một tên logic sẽ được gán cho bạn bởi hệ thống mà bạn chỉ có thể sửa đổi khi tạo trường. Kết quả sẽ tương tự như:

Bảng tài khoản đã thêm Trường tùy chỉnh, hiển thị tên hiển thị là

Khi tác giả tham chiếu đến một trường Tài khoản, đề xuất sẽ được đưa ra để sử dụng 'Trường tùy chỉnh' vì đây là tên hiển thị. Các dấu ngoặc đơn phải được sử dụng vì tên này có một khoảng trắng trong đó:

Thanh công thức Studio hiển thị đề xuất cho tên trường của Tài khoản với tên hiển thị 'Trường tùy chỉnh' được làm nổi bật.

Sau khi chọn đề xuất, 'Trường tùy chỉnh' được hiển thị trên thanh công thức và dữ liệu được truy xuất:

Thanh công thức Studio hiển thị cách sử dụng tên hiển thị 'Trường tùy chỉnh' cho trường.

Mặc dù không được đề xuất, chúng ta cũng có thể sử dụng tên logic cho trường này. Điều này sẽ dẫn đến cùng một dữ liệu được lấy. Không cần có dấu ngoặc đơn vì tên này không chứa dấu cách hoặc ký tự đặc biệt:

Thanh công thức Studio hiển thị cách sử dụng tên logic cr5e3_customfield cho trường.

Một ánh xạ được duy trì giữa các tên hiển thị được thấy trong các công thức và các tên logic bên dưới. Vì phải dùng tên logic để tương tác với nguồn dữ liệu, ánh xạ này được sử dụng để tự động chuyển đổi từ tên hiển thị hiện tại sang tên logic và đó là những gì được thấy trong lưu lượng truy cập mạng. Ánh xạ này cũng được sử dụng để chuyển đổi lại thành tên logic để chuyển thành tên hiển thị mới, ví dụ: nếu tên hiển thị thay đổi hoặc nhà sản xuất bằng ngôn ngữ khác chỉnh sửa ứng dụng.

Lưu ý

Tên logic không được dịch khi di chuyển một ứng dụng giữa các môi trường. Đối với bảng hệ thống Dataverse và tên trường, đây không phải là vấn đề vì các tên logic là nhất quán trên các môi trường. Nhưng bất kỳ trường tùy chỉnh nào, chẳng hạn như cra3a_customfield trong ví dụ này ở trên, có thể có tiền tố môi trường khác (cra3a trong trường hợp này). Tên hiển thị được ưu tiên vì chúng có thể được khớp với tên hiển thị trong môi trường mới.

Định hướng tên

Vì tên hiển thị không phải là duy nhất, cùng một tên hiển thị có thể xuất hiện nhiều lần trong cùng một bảng. Khi điều này xảy ra, tên logic sẽ được thêm vào cuối tên hiển thị trong ngoặc đơn cho một trong những tên xung đột hơn. Dựa trên ví dụ trên, nếu có trường thứ hai có cùng tên hiển thị là Trường tùy chỉnh với một tên logic của cra3a_customfieldalt, thì đề xuất sẽ hiển thị:

Thanh công thức của Studio hiển thị cách sử dụng tên logic cr5e3_customfieldalt để phân biệt hai phiên bản của

Chuỗi định hướng tên được thêm vào trong các trường hợp khác xảy ra xung đột tên, chẳng hạn như tên của bảng, lựa chọn và các mục Dataverse khác.

Toán tử định hướng

Một số hàm tạo phạm vi bản ghi để truy cập vào các trường của bảng trong khi xử lý từng bản ghi, chẳng hạn như Filter, AddColumnSum. Tên trường được thêm vào với phạm vi bản ghi ghi đè cùng tên từ nơi khác trong ứng dụng. Khi điều này xảy ra, bạn vẫn có thể truy cập các giá trị từ bên ngoài phạm vi bản ghi với toán tử định hướng @:

  • Để truy cập các giá trị từ phạm vi bản ghi lồng nhau, sử dụng toán tử @ với tên của bảng được vận hành khi sử dụng mẫu này:
    Bảng[@FieldName]
  • Để truy cập các giá trị toàn cầu, chẳng hạn như nguồn dữ liệu, bộ sưu tập và biến bối cảnh, hãy sử dụng mẫu [@ObjectName] (không có bảng chỉ định).

Để biết thêm thông tin và ví dụ, hãy xem phạm vi bản ghi.