Note
Microsoft Power Fx 是畫布應用程式語言的新名稱。 這些文章仍在進行中,Microsoft 正在從 canvas 應用程式中擷取該語言,並將其整合至其他 Microsoft Power Platform 產品,並以開放原始碼形式提供。 從 Microsoft Power Fx 概覽開始以取得對該語言的介紹。
Microsoft Power Fx 表格將資料組織成記錄、欄位和欄位,來源包括 Microsoft Excel、SharePoint 和 SQL Server。 學習這些結構,撰寫公式,有效存取、塑造並操作表格資料。
- 記錄包含一或多種個人、場所或事物的相關資訊。 例如,記錄可能包含單一客戶的名稱、電子郵件地址和電話號碼。 其他工具將記錄稱為「資料列」或「項目」。
- 表格會保存一或多筆記錄,其中包含相同類別的資訊。 例如,資料表可能包含 50 個客戶的名稱、電子郵件地址和電話號碼。
您可以建置各種公式,採用資料表的名稱做為引數,就像 Excel 中的公式採用一或多個儲存格參考做為引數一樣。 Power Fx 中的某些公式會傳回資料表,反映您指定的其他引數。 例如,您可能建立一個公式︰
- 來更新資料表中的記錄,方法為指定該資料表做為 Patch 函式中多個引數中的其中一個
- 新增、移除和重新命名資料表中的資料行,方法為指定該資料表做為 AddColumns、DropColumns 或 RenameColumns 函式的引數。 那些函式都不會修改原始的表格。 函式反而會根據您指定的其他引數傳回另一個資料表。
資料表的元素
記錄
每一筆記錄都包含至少一種關於個人、場所或事物的資訊。 前述範例顯示每種產品(巧克力、 麵包和 水)的記錄,以及每個資訊類別(價格、 手頭數量、 訂單數量)的欄位。
在公式中,您可以使用大括號參照表格內容外的記錄本身。 例如,此紀錄 { Name: "Strawberries", Price: 7.99 } 與資料表沒有關聯。 請注意,該範例中的欄位名稱(例如名稱和價格) 並未含括在雙引號中。
欄位
欄位是記錄中的個別資訊片段。 您可以視覺化這類欄位,做為特定記錄資料行中的值。
跟使用控制項一樣,您可以使用記錄上的 .運算子來引用記錄的欄位。 例如,First(Products).Name 會傳回產品資料表中第一筆記錄的名稱欄位。
欄位可以包含另一筆記錄或資料表,如 GroupBy 函式的範例所示。 您可以依照需求巢狀建立多層記錄和表格。
行
資料行指的是表格中一或多筆記錄的相同欄位。 在前述範例中,每個產品都有一個價格欄位,且該價格欄位包含所有產品。 前表有四欄,橫向顯示於頂部:
- 名稱
- 價格
- 現有庫存數量
- 訂單數量
資料行的名稱反映該資料行中的欄位。
資料行內的所有值都屬於相同的資料類型。 在前述範例中,「手頭數量」欄位總是包含數字,且不能包含字串,例如「12 單位」,代表單一紀錄。 任何欄位的值也可能是空白。
你可能在其他工具中稱欄位為「欄位」。
資料表
資料表包含一或多筆記錄,每筆記錄都有多個欄位,它們在各個記錄中都具有一致的名稱。
任何儲存在資料來源或集合中的表格都有名稱 (用來稱呼表格),並將它傳遞至採用表格做為引數的函式。 表格也可以是函式或公式的結果。
如下列範例所示,您可以使用在公式表示資料表,方法為搭配使用 Table 函式與一組您用大括號表示的記錄︰
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
您也可以定義單一資料行的表格,以方括弧括住。 另一種撰寫上述公式的方式︰
[ "Strawberry", "Vanilla" ]
表格公式
在 Excel 和 Power Fx 中,您可以使用公式,以類似方式操作數字和字串︰
- 在 Excel 中,於儲存格 A1 中輸入一值(例如 42),然後在另一個儲存格中輸入公式 (例如 A1 + 2),以顯示 44 的值。
- 在 Power Apps 中,將 Slider1 的 Default 屬性設為 42,並將標籤的 Text 屬性設為 Slider1.Value + 2 已顯示 44 的值。
在這兩種案例中,如果您變更引數的值(例如,資料格 A1 中的數字或 Slider1 的值),則算出的值會自動變更。
同樣地,您可以使用公式存取和操作表格和記錄中的資料。 您可以使用資料表的名稱做為某些公式(例如 Min(Catalog, Price))中的引數,以顯示目錄資料表中價格資料行的最低值。 其他公式提供整個資料表為傳回值,例如 RenameColumns(Catalog, "Price", "Cost"),會傳回目錄資料表中的所有記錄,但會將價格資料行的名稱變更為成本。
和數字一樣,當基礎表格或記錄變更時,涉及表格和記錄的公式會自動重新計算。 如果目錄資料表中的產品成本降低而低於前一個最小值,則 Min 公式傳回的值將自動變更以符合它。
資料表函式和控制項屬性
想想 Lower 函式。 如果變數 welcome 包含文字字串 "Hello,world",則公式 Lower( welcome ) 會傳回 "hello, world"。 這個函數不會改變該變數的值。 Lower 是純函式,因為它只會處理輸入並產生輸出。 這就是全部;它不會有任何副作用。 Excel 中的所有函式以及 Power Fx 中大部分的函式都是純函式,允許自動重新計算活頁簿或應用程式。
Power Fx 提供一組函式,這些函式會以相同的方式在資料表上執行。 這些函式會將採用表格做為輸入並篩選、排序、轉換、減少和摘要整個表格格。 事實上,通常採用單一值的 Lower 和許多其他函式,也可以採用單一資料行資料表做為輸入。
許多函數會以單一資料行資料表做為輸入。 如果整個資料表只有一個資料行,您可以依名稱指定它。 如果資料表有多個資料行,您可以使用 Table.Column 語法來指定其中一個資料行。 例如,產品.名稱會傳回只有產品資料表中名稱值的單一資料行資料表 。
您可以使用 AddColumns、RenameColumns、ShowColumns 或 DropColumns 函數來隨心所欲地徹底改變資料表的形狀。 同樣地,這些函式只會變更其輸出,而不會變更其來源。
行為公式
其他函式是專門用來修改資料且有副作用。 因為這些函式並不純,所以您必須小心地建立它們,而且它們在應用程式中不能參與自動重新計算值。 您可以只在行為公式 內使用這些函式。
記錄範圍
有些函式是透過逐一評估表格中所有紀錄的公式來運作。 該公式的結果有多種使用方式:
- AddColumns - Formula 提供新欄位的值。
- Average、Max、Min、Sum、StdevP 和 VarP - 公式會提供要加總的值。
- Filter 和 Lookup - 公式會判定輸出中是否應該包括記錄。
- Concat - 公式會決定要一起串連的字串。
- Distinct - 公式會傳回一值,用來識別重複記錄。
- ForAll - 公式可以傳回任何值,可能會有副作用。
- Sort - 公式會提供排序記錄時要依據的值。
- With - 公式可以傳回任何值,可能會有副作用。
在這些公式內,您可以參考正在處理之記錄的欄位。 其中每一個函式都會建立一個用以評估公式的「記錄範圍」,其中記錄的欄位可以做為最上層識別碼。 您也可以由整個應用程式中參照控制項屬性及其他值。
例如,取得置於全域變數中的產品資料表:
Set( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
為了判斷這些產品中是否有需求量超過現有需求:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
Filter 的第一個引數為操作所在之記錄資料表,而第二個引數為公式。 Filter 會建立一個記錄範圍,用於評估此公式,其中每筆記錄的欄位均可用,在此情況下,指的是 產品、要求量和可用數量。 比較的結果會判定函式結果中是否應該包含每一筆記錄︰
補充這個例子,你可以計算每種產品要訂購多少:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
這裡你要在結果中加入一個計算過的欄位。 AddColumns 有自己的記錄範圍,用來計算請求內容與可用資料之間的差異。
最後,你可以將結果表縮減為只包含你想要的欄位:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
請注意,在前面的例子中,有些地方使用雙引號(「),其他地方則使用單引號(')。 當參考物件的值時,例如欄位或資料表,且物件名稱包含空格,則必須使用單引號。 當你不是在參考物件的值,而是在談論它時,特別是在物件尚未存在的情況下,例如像 AddColumns 的情況,請使用雙引號。
消除歧義
你用記錄範圍新增的欄位名稱會覆蓋應用程式其他地方的相同名稱。 當此覆蓋發生時,你仍可透過消@歧義運算子從記錄範圍外存取值:
- 要從巢狀記錄範圍存取值,請使用 @ 帶有你所操作資料表名稱的運算子,遵循以下模式:
Table[@FieldName] - 若要存取全域值 (例如資料來源、集合和內容變數),請使用模式 [@ObjectName] (不含資料表指定)。
如果你操作的表格是一個表達式,例如 Filter(Table, ...) ,你不能使用消歧義運算子。 只有最內層的記錄範圍能透過不使用消歧義運算子,從此表表達式存取欄位。
舉例來說,假設你有一個集合 X:
您可以使用 ClearCollect( X, [1, 2] ) 建立此集合。
還有另一個集合 Y:
您可以使用 ClearCollect(Y, [“A”, “B”] ) 來建立此集合。
此外,使用此公式:UpdateContext( {Value: "!"}),定義名為 Value 的 context 變數
總而言之, 在此內容中,下列公式︰
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
會產生此資料表︰
這其中發生了什麼狀況? 最外層的 ForAll 函式定義了 X 的記錄範圍,因此你可以在每筆記錄處理時存取其 Value 欄位。 您可以直接使用「 Value 」一詞或使用 X[@Value]。
最內層的 ForAll 函數為 Y 定義了另一個記錄範圍。由於此表中也定義了 Value 欄位,這裡的 Value 指的是 Y 記錄中的欄位,而非 X 的欄位。要存取 X 的 Value 欄位,必須使用帶有消歧義運算子的較長版本。
由於 Y 是最內側的記錄範圍,存取此表欄位不需要消歧義,因此你可以用這個公式得到相同的結果:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
所有的 ForAll 記錄範圍均會覆寫全域範圍。 你定義的 Value 上下文變數如果沒有消歧義運算子,名稱就無法提供。 若要存取此值,請使用 [@Value]。
Ungroup 會壓平合併結果,因為巢狀的 ForAll 函式將產生巢狀結果資料表。
單一資料行表格
若要從資料表中執行單一資料行,請使用 ShowColumns 函式,如此範例所示:
ShowColumns( Products, "Product" )
此公式會產生這個單一資料行資料表:
若需要較短的替代選項,請指定 Table.Column,這會只提取資料表中的資料行,形成單一資料行資料表。 例如,此公式所產生的結果與使用 ShowColumns 完全相同 。
Products.Product
內嵌記錄
您可以使用包含具名欄位值的大括號來表示記錄。 例如,您可以使用此公式,表示本主題開頭表格中的第一筆記錄︰
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
您也可以使用其他公式內嵌公式,如下列範例所示︰
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
您可以使用巢狀大括號建立巢狀記錄,如下列範例所示︰
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
以單引號括住每個包含特殊字元 (例如空格或冒號)的資料行名稱。 若要在資料行名稱內使用單引號,請按兩下。
請注意,價格資料行中的值不包括貨幣符號,例如美元符號。 該格式會在顯示值時套用。
嵌入式表格
您可以使用 Table 函式和一組記錄建立資料表。 您可以使用下列公式,表示本主題開頭的表格︰
Table(
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 }
)
您也可以建立巢狀表格︰
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
嵌入值表格
您可以透過在方括號中指定值,來建立單一資料行表格。 產生的資料表具有單一資料行,名為值。
例如,[ 1, 2, 3, 4 ] 等同於 Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) 並傳回此資料表: