分享方式:


運算子和識別碼

注意

Microsoft Power Fx 是畫布應用程式語言的新名稱。 當我們從畫布應用程式中擷取語言,將其與其他 Microsoft Power Platform 產品整合並打造開放原始碼時,這些文章仍會持續進行。 從 Microsoft Power Fx 概覽開始以取得對該語言的介紹。

Microsoft Power Fx 中的作業描述如下。 其中有些運算子相依於作者的語言。 如需詳細資訊,請參閱全球應用程式

符號 類型​​ 語法 名描述
. 屬性選取器 Slider1.值
Color.Red
從資料表、控制項、訊號或列舉中擷取屬性。 若要回溯相容性,可以使用 !
.
語言依賴
小數分隔符號 1.23 數字的整數和小數部分之間的分隔符號。 此字元取決於語言。
( ) 括號 過濾器(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 不等於
& 字串串連運算子 “你好”&“”&“世界” 讓多個字串連續出現
&&或 邏輯運算子 價格 < :100 & Slider1.值 = 20
價格 < 100 和 Slider1.Value = 20
邏輯結合,相當於 And 函式
||   價格 < 100 ||Slider1.Value = 20Price < 100 或 Slider1.Value = 20 邏輯分離,相當於 Or 函式
取得!Not   !(價格 < 100) 或不 (價格 < 100) 邏輯否定,相當於 Not 函式
精確蛋白 成員資格運算符 Gallery1.選定的精確 SavedItems 屬於集合或資料表
精確蛋白   “Windows”exactin“要在 Windows 操作系統中顯示視窗...” 子字串測試 (區分大小寫)
  Gallery1.在 SavedItems 中選擇 屬於集合或資料表
  “鍵盤和顯示器...”中的“The” 子字串測試 (不區分大小寫)
@ 消歧義操作員 我的表[@fieldname] 欄位消除混淆
@   [@MyVariable] 全域消除混淆
,
[語言相依]
清單分隔字元 if(x < 10,“低”,“好”)
{ X:12,Y:32 }
[ 1, 2, 3 ]
分隔︰ 此字元取決於語言。
;
[語言相依]
公式鏈結 收集 (T,A);導覽(S1,“”) 行為屬性中函式的個別引動過程。 鏈結運算子取決於語言。
作為操作員 AllCustomers 作為客戶 覆寫資源庫中的 ThisItemThisRecord 及記錄範圍函數。 As 對於提供更好的特定名稱非常有用,並且在嵌套方案中尤其重要。
自我 自行操作員 Self.Fill 自我填充 存取目前控制項的屬性
父系 父系操作員 父級填充 存取控制項容器的屬性
ThisItem(此項) ThisItem 操作員 ThisItem.FirstName 存取資源庫或表單控制項的欄位
thisrecord(此記錄) ThisItem 操作員 ThisRecord.FirstName 存取 ForAllSumWith 和其他記錄範圍函數中之記錄的完整記錄和個別欄位。 可以使用 As 運算子覆寫。

in 和 exactin 運算子

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

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

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

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

  3. 將資源庫的 Items 屬性變更為以下公式︰
    篩選條件(Inventory,“E”exactin ProductName)

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

ThisItem、ThisRecord 和 As 運算子

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

運算子 適用於: 描述
ThisItem(此項) Gallery 控件
編輯表單 控制件
顯示表單 控制件
Gallery或表單控制項中目前記錄的預設名稱。
thisrecord(此記錄) ForAllFilterWithSum記錄範圍 函數 ForAll 及其他記錄範圍函數中目前記錄的預設名稱。
作為名稱 Gallery 控件
ForAllFilterWithSum 等記錄範圍函數
定義目前記錄的名稱,取代預設的 ThisItemThisRecord。 使用 As 讓公式在巢狀時更易於了解並解決多義性。

ThisItem 運算子

例如,在下列資源庫控制項中,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.Fill 是指目前控制項的填充色彩。
父系操作員 某些控制項可承載其他控制項,例如 ScreenGallery 控制項。 我們將裝載控制項稱為內含控制項的父系。 與 Self 運算子一樣,Parent 運算子提供了輕鬆相對於容器控制項的相對參考。

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

self 和 父系 are 運算子,而不是控件本身的屬性。 不支援參考 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 字元,而且可能當地語系化為其他語言。 與上述範例相對應,顯示名稱可以是自訂欄位,且文字之間有空格。

由於顯示名稱更容易理解,因此 Power Fx 會建議將它們作為選擇,而不建議邏輯名稱。 雖然不建議使用邏輯名稱,但在間接輸入時仍然可以使用它們。

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

已新增自訂欄位的客戶實體,顯示「自訂欄位」顯示名稱以及「cr5e3_customfield」的邏輯名稱。

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

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

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

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

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

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

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

注意

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

名稱消除混淆

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

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

名稱消除混淆字串會在其他出現名稱衝突 (例如實體、選項組及其他 Dataverse 項目的名稱) 的情況中加入。

消除混淆運算子

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

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

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