Power Apps 中的運算子和識別碼

適用於: 畫布應用程式 模型導向應用程式

其中有些運算子相依於作者的語言。 有關畫布應用程式中支援語言的更多資訊,請參閱全域應用程式

符號 類型 範例 描述
'...' 識別碼 客戶名稱 包含特殊字元 (包括空格) 的識別碼用單引號括起來
"..." 文字字串 "Hello, world" 文字字串會括在雙引號中
$"..." 字串插補 $"親愛的 {FirstName}," 內嵌在文本字串中的公式
. 屬性選取器 Slider1.Value
Color.Red
Acceleration.X
資料表、控制項、訊號或列舉中擷取屬性。 若要回溯相容性,也可以使用 !
.
[語言相依]
小數分隔符號 1.23 數字的整數和小數部分之間的分隔符號。 此字元取決於語言。
( ) 括號 Filter(T, A < 10)

(1 + 2) * 3
強制優先順序,並群組大型運算式中的子運算式
+ 算術運算子 1 + 2 加法
-   2 - 1 減法和正負號
*   2 * 3 乘法
/   2 / 3 除法 (另請參閱 Mod 函式)
^   2 ^ 3 乘冪,相當於 Power 函式
%   20% 百分比 (相當於 "* 1/100")
= 比較運算子 價格 = 100 等於
>   價格 > 100 大於
>=   價格 >= 100 大於或等於
<   價格 < 100 小於
<=   價格 <= 100 小於或等於
<>   價格 <> 100 不等於
& 字串串連運算子 "hello" & " " & "world" 讓多個字串連續出現
&&And 邏輯運算子 Price < 100 && Slider1.Value = 20
價格 < 100 和 Slider1.Value = 20
邏輯結合,相當於 And 函式
||Or   價格 < 100 || Slider1.Value = 20價格 < 100 Or Slider1.Value = 20 邏輯分離,相當於 Or 函式
!Not   !(價格 < 100)Not (價格 < 100) 邏輯否定,相當於 Not 函式
exactin 成員資格運算子 Gallery1.Selected exactin SavedItems 屬於集合或資料表
exactin   "Windows" exactin “To display windows in the Windows operating system...” 子字串測試 (區分大小寫)
  Gallery1.Selected in SavedItems 屬於集合或資料表
  "The" in "The keyboard and the monitor..." 子字串測試 (不區分大小寫)
@ 消除混淆運算子 MyTable[@fieldname] 欄位消除混淆
@   [@MyVariable] 全域消除混淆
,
[語言相依]
清單分隔字元 If( X < 10, "Low", "Good" )
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
分隔︰ 此字元取決於語言。
;
[語言相依]
公式鏈結 Collect(T, A); Navigate(S1, "") 行為屬性中函式的個別引動過程。 鏈結運算子取決於語言。
As 運算子 AllCustomers As Customer 覆寫資源庫中的 ThisItemThisRecord 及記錄範圍函數。 As 對於提供更好的特定名稱很有用,並且在巢狀案例中顯得尤其重要。
自我 Self 運算子 Self.Fill 存取目前控制項的屬性
上層 Parent 運算子 Parent.Fill 存取控制項容器的屬性
ThisItem ThisItem 運算子 ThisItem.FirstName 存取 Gallery 或 form 控制項的欄位
ThisRecord ThisRecord 運算子 ThisRecord.FirstName 存取 ForAllSumWith 和其他記錄範圍函數中之記錄的完整記錄和個別欄位。 可以使用 As 運算子覆寫。

Note

@ 運算子還可用於根據資料來源驗證記錄物件的類型。 例如,Collect(coll,Account@{'Account Number: 1111')

in 和 exactin 運算子

使用 inexactin 運算子,在資料來源 (例如集合或匯入的資料表) 中尋找字串。 in 運算子可識別相符項目 (不管大小寫),而 exactin 運算子只會識別大小寫方式相同的相符項目。 以下是範例:

  1. 建立或匯入名為 Inventory 的集合,並將其顯示在資源庫中,如顯示資源庫中的影像和文字中的第一個程序所述。

  2. 將資源庫的 Items 屬性設定為以下公式︰
    Filter(Inventory, "E" in ProductName)

    資源庫會顯示 Callisto 以外的所有產品,因為該產品的名稱是不包含您所指定字母的唯一產品。

  3. 將資源庫的 Items 屬性變更為以下公式︰
    Filter(Inventory, "E" exactin ProductName)

    資源庫只會顯示 Europa,因為只有其名稱包含您指定在的字母並為指定的大小寫。

ThisItem、ThisRecord 和 As 運算子

一些控制項和函數會將公式套用至表格的個別記錄。 若要參考公式中的個別記錄,請使用下列其中一項:

運算子 適用於: 描述
ThisItem Gallery 控制項
Edit form 控制項
Display form 控制項
Gallery或表單控制項中目前記錄的預設名稱。
ThisRecord ForAllFilterWithSum 及其他記錄範圍函數 ForAll 及其他記錄範圍函數中目前記錄的預設名稱。
名稱 Gallery 控制項
ForAll, FilterWithSum 及其他記錄範圍函數
定義目前記錄的名稱,取代預設的 ThisItemThisRecord。 使用 As 讓公式在巢狀時更易於了解並解決多義性。

ThisItem 運算子

例如,在以下Gallery控制項中,Items 屬性設為員工資料來源 (例如 Northwind Traders 範例中包含的員工資料表):

Employees

在資源庫中顯示的員工。

資源庫中的第一個項目是為每個員工複製的範本。 在範本中,圖片的公式使用 ThisItem來參考目前的項目:

ThisItem.Picture

員工圖片的公式。

同樣地,名稱的公式也會使用 ThisItem

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

員工的名字和姓氏公式。

ThisRecord 運算子

ThisRecord是在具有記錄範圍的函數中使用。 例如,我們可以使用 Filter 函數及資源庫的 Items 屬性,只顯示 M 開頭的名字:

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

使用 ThisRecord,根據名字篩選員工。

ThisRecord 是選擇性的,並可透過欄位直接使用,例如在此案例中,我們可以撰寫:

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

雖然是選擇性的,但是使用 ThisRecord 可讓公式更易於了解,而且在不明確的條件中,欄位名稱也可以是關聯名稱。 ThisRecord 是選擇性的,而 ThisItem 一律是必要的。

使用 ThisRecord 來參考整個記錄,含PatchCollect及其他記錄範圍函數。 例如,下列公式會將所有非使用中員工的狀態設定成使用中:

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

As 運算子

使用 As 運算子來命名資源庫中的記錄或記錄範圍函數,覆寫預設 ThisItemThisRecord。 命名該記錄可讓您的公式更易於了解,而且在巢狀的情形中可能需要此欄位,才能存取其他範圍中的記錄。

例如,您可以修改資源庫的 Items 屬性,以使用 As 判斷我們正在與員工合作:

Employees As Employee

使用 As 運算子的員工資源庫。

圖片與名稱的公式會調整為將此名稱用於目前的記錄:

Employee.Picture

使用 As 運算子設定員工名稱的員工圖片。

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

使用 As 運算子設定員工名稱的員工姓氏。

As 可與記錄範圍函數搭配來取代預設名稱 ThisRecord。 我們可將此其套用至先前的範例,以釐清我們正在處理的記錄:

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

當巢狀資源庫與記錄範圍函數時,ThisItemThisRecord 會始終參考最內層的範圍,而外部範圍中的記錄將無法使用。 使用 As提供每個唯一名稱,讓所有的記錄範圍都能使用。

例如,當您巢狀兩個 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
)

Label 控制項的Text屬性設定為下列公式:

標籤控制項中顯示的棋盤文字。

讓我們了解這裡發生的事情:

  • 首先,我們從 Sequence 函數反覆運算 8 個編號記錄清單的未命名資料表。 此迴圈適用於棋盤的每一列,這通常稱為 Rank,因此我們將此名稱提供給它。
  • 對於每一列,我們重複處理另一個未命名的 8 欄表格,並提供通用名稱 File
  • 如果 Rank.Value + File.Value 值為奇數,則方塊會得到 X,否則是點。 公式的這一部分參考兩個 ForAll 迴圈,使用 As 運算子使之可行。
  • Concat 使用兩次,首先組裝欄,然後是列,並插入 Char(10) 以建立新行。

類似的範例可以包含巢狀的Gallery控制項,取代 ForAll 函數。 讓我們從 Rank 的垂直資源庫開始。 此資源庫控制項將包含下列項目的 Items 公式:

Sequence(8) as Rank

提供 Rank 反覆運算的外部資源庫圖解。

在此資源庫中,我們會放置 File 的水平資源庫,並針對每個 Rank 進行複製,並具有下列項目的 Items 屬性:

Sequence(8) as File

提供 File 反覆運算的內部資源庫圖解。

最後,在此資源庫中,我們將新增一個Label控制項,並針對每個 File 和每個 Rank 進行複製。 我們將調整它的大小以填入整個空格,並使用 Fill 屬性,以使用此公式提供色彩:

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

兩個資源庫中的標籤控制項,提供棋盤的交替色彩。

Self 和 Parent 運算子

有三種方法可以讓您在公式中參考控制項及其屬性:

方法 描述
依照控制項名稱 應用程式中任何位置的名稱都可以參考任何控制項。

例如,Label1.Fill 是指控制項名稱為 Label1 的控制項的 Fill 屬性。
Self 運算子 在撰寫公式時,參考同一個控制項的另一個屬性通常十分方便。 除了使用名稱的絕對參考,您可以更輕鬆和可移植地使用 self 的相對參考。 Self 運算子可讓您輕鬆存取目前的控制項。

例如,Self.Fill 是指目前控制項的填充色彩。
Parent 運算子 某些控制項可承載其他控制項,例如 ScreenGallery 控制項。 其中控制項的託管控制項稱為上層。 與 Self 運算子一樣,Parent 運算子提供了輕鬆相對於容器控制項的相對參考。

例如,Parent.Fill 是指控制項的 fill 屬性,此控制項是目前控制項的容器。

SelfParent 為運算子,而不是控制項本身的屬性。 不支援參考 Parent.ParentSelf.ParentParent.Self

識別碼名稱

變數、資料來源、資料行及其他物件的名稱可以包含任何 Unicode

在包含空格或其他特殊字元的名稱周圍使用單引號。
在名稱中使用兩個單引號一起來表示一個單引號。 不含特殊字元的名稱不需要加上單引號。

以下是您可能會在資料表中遇到的一些範例資料行名稱,以及它們在公式中的表示方式:

資料庫中的資料行名稱 公式中的資料行參考
SimpleName SimpleName
NameWith123Numbers NameWith123Numbers
包含空格的名稱 'Name with spaces'
包含「雙」引號的名稱 'Name with "double" quotes'
包含「單」引號的名稱 'Name with ''single'' quotes'
包含 @ 符號的名稱 'Name with an @ at sign'

雙引號會用來指定文字字串

顯示名稱和邏輯名稱

某些資料來源 (例如 SharePoint 和 Microsoft Dataverse) 會有兩個不同的名稱參考同一個資料表或資料行:

  • 邏輯名稱 - 保證唯一的名稱,在建立之後就不會改變,通常不允許使用空格或其他特殊字元,也不會將它們當地語系化為不同語言。 因此,名稱可能會較難理解。 這些名稱是專業開發人員所使用的名稱。 例如 cra3a_customfield。 此名稱也可以稱為結構描述名稱,或只是稱為名稱

  • 顯示名稱 - 方便使用且可供終端使用者查看的名稱。 此名稱可能不是唯一的、可能隨時間改變、可能包含空格和任何 Unicode 字元,而且可能當地語系化為其他語言。 與上述範例相對應,顯示名稱可以是自訂欄位,且文字之間有空格。

由於顯示名稱較容易理解,因此畫布應用程式建議選擇使用這種名稱,而不建議使用邏輯名稱。 雖然不建議使用邏輯名稱,但如果是間接輸入,則仍然可以使用。

例如,假設您已將自訂欄位新增至 Dataverse 中的資料表。 系統仍然會為您指派邏輯名稱,您只有在建立欄位時才能修改此名稱。 結果看起類似下列範例:

以新增自訂欄位的帳戶資料表,顯示「自訂欄位」的顯示名稱和

製作客戶欄位的參考時,將會建議您使用自訂欄位,因為這是顯示名稱。 必須使用單引號,因為此名稱中有一個空格:

工作室公式列,顯示對客戶欄位名稱的建議,並反白顯示「自訂欄位」這個顯示名稱。

選取建議之後,公式列中顯示「自訂欄位」,而且已擷取資料:

工作室公式列,顯示欄位使用「自訂欄位」這個顯示名稱。

雖然不建議這樣做,但是我們也可以使用這個欄位的邏輯名稱。 這會導致擷取相同的資料。 不需要單引號,因為此名稱不包含空格或特殊字元:

工作室公式列,顯示欄位使用邏輯名稱 cr5e3_customfield。

在幕後,公式中所見的顯示名稱與基礎邏輯名稱之間會維持對應。 由於必須使用邏輯名稱才能與資料來源互動,因此會使用此對應自動從目前的顯示名稱轉換為邏輯名稱,而這正是在網路流量中所看到的情形。 此對應也可用來轉換回邏輯名稱,以切換至新的顯示名稱,例如,如果顯示名稱變更或使用不同語言的製作者編輯應用程式。

Note

在環境之間移動應用程式時,不會翻譯邏輯名稱。 對於 Dataverse 系統資料表和欄位名稱,這應該不是問題,因為邏輯名稱在不同環境中是一致的。 但任何自訂欄位 (例如上述範例中的 cra3a_customfield) 都可能會有不同的環境首碼 (在此案例中為 cra3a)。 最好是使用顯示名稱,因為這些名稱可與新環境中的顯示名稱相符。

名稱消除混淆

因為顯示名稱不是唯一的,所以相同的顯示名稱可能會在同一個資料表中顯示一次以上。 發生這種情況時,系統會針對一個或多個衝突的名稱,在顯示名稱結尾新增加上括號的邏輯名稱。 以上述範例為基礎,如果出現另一個有相同顯示名稱自訂欄位的欄位,其邏輯名稱為 cra3a_customfieldalt 時,建議會顯示:

工作室公式列,示範使用邏輯名稱 cr5e3_customfieldalt 來消除兩個「自訂欄位」版本的混淆。

在發生名稱衝突的其他情況下會新增名稱去除混淆字串,例如資料表、選項和其他 Dataverse 項目的名稱。

消除混淆運算子

有些函式會建立記錄範圍,以便在處理每一筆記錄時存取表格的欄位,例如 FilterAddColumnsSum。 隨附記錄範圍新增的欄位名稱會覆寫應用程式中其他位置的相同名稱。 發生這種情況時,您仍然可以使用 @ 消除混淆運算子存取記錄範圍以外的值︰

  • 若要從巢狀記錄範圍中存取值,請搭配使用 @ 運算子與在使用下列模式時操作的資料表名稱:
    Table[@FieldName]
  • 若要存取全域值 (例如資料來源、集合和內容變數),請使用模式 [@ObjectName] (不含資料表指定)。

如需詳細資訊和範例,請參閱記錄範圍