資料表
注意
Microsoft Power Fx 是畫布應用程式語言的新名稱。 當我們從畫布應用程式中擷取語言,將其與其他 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 是一個純函數,因為它只處理 input 併產生 output。 這就是全部;它不會有任何副作用。 Excel 中的所有函式以及 Power Fx 中大部分的函式都是純函式,允許自動重新計算活頁簿或應用程式。
Power Fx 提供一組函式,這些函式會以相同的方式在資料表上執行。 這些函式會將採用表格做為輸入並篩選、排序、轉換、減少和摘要整個表格格。 事實上,通常採用單一值的 Lower 和許多其他函式,也可以採用單一資料行資料表做為輸入。
許多函數會以單一資料行資料表做為輸入。 如果整個資料表只有一個資料行,您可以依名稱指定它。 如果資料表有多個資料行,您可以使用 Table.Column 語法來指定其中一個資料行。 例如,產品.名稱會傳回只有產品資料表中名稱值的單一資料行資料表 。
您可以使用 AddColumns、RenameColumns、ShowColumns 或 DropColumns 函數來隨心所欲地徹底改變資料表的形狀。 同樣地,這些函式只會變更其輸出,而不會變更其來源。
其他函式是專門用來修改資料且有副作用。 因為這些函式並不純,所以您必須小心地建立它們,而且它們在應用程式中不能參與自動重新計算值。 您可以只在行為公式 內使用這些函式。
有些函式的運作方式為個別評估跨單一資料表中所有記錄的公式。 公式的結果的使用方式有許多種︰
- AddColumns - 公式提供添加的欄位的值。
- Average,Max,Min,Sum,StdevP,VarP - 公式提供要聚合的值。
- Filter,Lookup - 公式確定是否應將記錄包含在輸出中。
- Concat - 公式確定要連接在一起的字串。
- Distinct - 公式返回一個值,用於標識重複記錄。
- ForAll - Formula 可以返回任何值,但可能會有副作用。
- Sort - Formula 提供對記錄進行排序的值。
- 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 創建一個記錄範圍來評估此公式,其中每條記錄的字段都可用,在本例中 為 Product、 Quantity Requested 和 Quantity Available。 比較的結果會判定函式結果中是否應該包含每一筆記錄︰
加入下列範例,我們可以計算每項產品要訂購的數量︰
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 的案例所示。
隨附記錄範圍新增的欄位名稱會覆寫應用程式中其他位置的相同名稱。 發生這種情況時,您仍然可以使用 @ 消除歧異 運算子存取記錄範圍以外的值︰
- 若要從巢狀記錄範圍中存取值,請搭配使用 @ 運算子與在使用下列模式時操作的資料表名稱:
表格[@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 定義另一個記錄範圍。因為此表格也有已定義的值欄位,所以使用此處的值指的是 Y 記錄中的欄位,而不再是 X中的欄位。在此,若要存取 X 的值欄位,我們必須使用較長版本的消除歧義運算子。
由於 Y 是最內部的記錄範圍,存取此資料表的欄位不需要消除歧義,因而允許我們使用此公式達到相同結果︰
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
所有的 ForAll 記錄範圍均會覆寫全域範圍。 若沒有去除歧義運算子,無法透過名稱使用我們定義的值 context 變數。 若要存取此值,請使用 [@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 } )
並傳回此資料表: