了解畫布應用程式中的表格和記錄
在 Power Apps 中,您可以建立一個畫布應用程式,用來存取 Microsoft Excel、SharePoint、SQL Server,以及數個其他來源(將資料儲存在記錄和表格)中的資訊。 若要最有效地使用這類資料,請檢閱這些結構的基本概念。
- 記錄包含一或多種個人、場所或事物的相關資訊。 例如,記錄可能包含單一客戶的名稱、電子郵件地址和電話號碼。 其他工具將記錄稱為「資料列」或「項目」。
- 表格會保存一或多筆記錄,其中包含相同類別的資訊。 例如,表格可能包含 50 個客戶的名稱、電子郵件地址和電話號碼。
在您的應用程式中,您將使用公式 來建立、更新和操作記錄和表格。 您可能會讀取和寫入資料至外部資料來源 (即擴充的表格)。 此外,您也可以建立一或多個內部表格,稱為集合。
您可以建置各種公式,採用表格的名稱做為引數,就像 Excel 中的公式採用一或多個儲存格參考做為引數一樣。 Power Apps 中的某些公式會傳回表格,反映您指定的其他引數。 例如,您可能建立一個公式︰
- 來更新表格中的記錄,方法為指定該表格做為 Patch 函式中多個引數中的其中一個
- 新增、移除和重新命名表格中的資料行,方法為指定該表格做為 AddColumns、DropColumns 或 RenameColumns 函式的引數。 那些函式都不會修改原始的表格。 函式反而會根據您指定的其他引數傳回另一個表格。
表格的元素
記錄
每一筆記錄都包含至少一種關於個人、場所或事物的資訊。 上述範例顯示每項產品的記錄 (巧克力、麵包和水) 和每個資訊類別的資料行 (價格、庫存量和訂購數量)。
在公式中,您可以使用大括號參照表格內容外的記錄本身。 例如,此紀錄 { Name: "Strawberries", Price: 7.99 } 與表格沒有關聯。 請注意,該範例中的欄位名稱(例如名稱和價格) 並未含括在雙引號中。
欄位
欄位是記錄中的個別資訊片段。 您可以視覺化這類欄位,做為特定記錄資料行中的值。
跟使用控制項一樣,若要參照記錄上的欄位,可以使用 . 運算子(在紀錄上)。 例如,First(Products).Name 會傳回產品表格中第一筆記錄的名稱欄位。
欄位可以包含另一筆記錄或表格,如 GroupBy 函式的範例所示。 您可以依照需求巢狀建立多層記錄和表格。
行
資料行指的是表格中一或多筆記錄的相同欄位。 在上述範例中,每項產品都有一個價格欄位,而且該價格在所有產品中都位於相同的資料行中。 上表有四個資料行,以水平方式顯示在頂端︰
- 名稱
- 價格
- 現有庫存數量
- 訂單數量
資料行的名稱反映該資料行中的欄位。
資料行內的所有值都屬於相同的資料類型。 在上述範例中,記錄的「現有庫存量」資料行一律包含數字,而且不能包含字串,例如「12 單位」。 任何欄位的值也可能是空白。
您可能已在其他工具中將資料行稱為「欄位」。
注意
如果資料來源 (如 SharePoint、Excel 或 Power BI 圖標) 包含有空格的資料行名稱,Power Apps 會將空格取代為 "_x0020_"。 例如,SharePoint、Excel 或 Power BI 圖標中的資料行名稱在資料版面配置中顯示或是在公式中使用時,會在 Power Apps 中顯示為 "Column_x0020_Name"。
Table
表格包含一或多筆記錄,每筆記錄都有多個欄位,它們在各個記錄中都具有一致的名稱。
任何儲存在資料來源或集合中的表格都有名稱 (用來稱呼表格),並將它傳遞至採用表格做為引數的函式。 表格也可以是函式或公式的結果。
如下列範例所示,您可以使用在公式表示表格,方法為搭配使用 Table 函式與一組您用大括號表示的記錄︰
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
您也可以定義單一資料行的表格,以方括弧括住。 另一種撰寫上述公式的方式︰
[ "Strawberry", "Vanilla" ]
表格公式
在 Excel 和 Power Apps 中,您可以使用公式,以類似方式操作數字和字串︰
- 在 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 公式傳回的值將自動變更以符合它。
讓我們逐步解說一些簡單的範例。
建立手機的空白應用程式,並新增可包含其他控制項的垂直**資源庫** 控制項。
根據預設,螢幕會顯示預留位置文字,文字內容來自名為 CustomGallerySample 的表格。 畫面中**資源庫** 控制項的 Items 屬性會自動設定為該表格。
注意
基於圖例用途,某些控制項已重新排列並放大。
不是將 Items 屬性設為表格的名稱,而是將它設為公式,其中包括以表格名稱做為引數,如下列範例所示:
Sort(CustomGallerySample, SampleHeading, SortOrder.Descending)
此公式包含 Sort 函式,它會採用表格的名稱做為其第一個引數,並採用該表格中資料行的名稱做為第二個引數。 函式也支援可選用的第三個引數,其中規定您想要以遞減順序排序資料。
將 Items 屬性設為公式,此公式會採用前一個步驟中的公式做為引數並傳回表格,如下列範例所示:
FirstN(Sort(CustomGallerySample, SampleHeading, SortOrder.Descending), 2)
在此公式中,您使用 FirstN 函式來顯示表格中特定數量的記錄。 您使用 Sort 函式做為 FirstN 的第一個引數,並使用數字(在此例中為 2) 做為第二個引數,來指定要顯示多少筆記錄。
整個公式會傳回表格,其中包含 CustomGallerySample 表格的前兩筆記錄,按 SampleHeading 資料行依遞減順序排序。
表格函式和控制項屬性
想想 Lower 函式。 如果變數 welcome 包含文字字串 "Hello,world",則公式 Lower( welcome ) 會傳回 "hello, world"。 此函數無法以任何方式變更該變數中的值。 Lower 是純函式,因為它只會處理輸入並產生輸出。 這就是全部;它不會有任何副作用。 Excel 中的所有函式以及 Power Apps 中大部分的函式都是純函式,允許自動重新計算活頁簿或應用程式。
Power Apps 提供一組函式,這些函式會以相同的方式在表格上執行。 這些函式會將採用表格做為輸入並篩選、排序、轉換、減少和摘要整個表格格。 事實上,通常採用單一值的 Lower 和許多其他函式,也可以採用單一資料行表格做為輸入。
- Sort、Filter - 排序和篩選記錄。
- FirstN、LastN - 傳回表格的前 N 筆或後 N 筆記錄。
- Abs、Sqrt、Round、RoundUp、RoundDown - 單一資料行表格中每筆記錄上的算術運算,能產生一個結果的單一資料行表格。
- Left、Mid、Right、Replace、Substitute、Trim、Lower、Upper、Proper - 單一資料行表格中每筆記錄上的字串操作,會產生一個字串的單一資料行表格。
- Len - 若為資料行的字串,會傳回包含每個字串長度的單一資料行表格。
- Concatenate - 串連多個資料行的字串,產生字串的單一資料行表格。
- AddColumns、DropColumns、RenameColumns 和 ShowColumns - 表格的資料行操作,產生具有不同資料行的新表格。
- Distinct - 移除重複記錄。
- Shuffle - 隨機重新排列記錄。
- HashTags - 搜尋字串中的主題標籤。
- Errors - 當您使用資料來源時,提供錯誤資訊。
這些函式中有許多都會採用單一資料行表格成為其輸入。 如果整個表格只有一個資料行,您可以依名稱指定它。 如果表格有多個資料行,您可以使用 Table.Column 語法來指定其中一個資料行。 例如,產品.名稱會傳回只有產品表格中名稱值的單一資料行表格 。
您可以使用 AddColumns、RenameColumns、ShowColumns 或 DropColumns 函式來隨心所欲完全改變表格的形狀。 同樣地,這些函式只會變更其輸出,而不會變更其來源。
控制項的屬性也可以是表格:
- Items - 適用於資源庫、清單方塊及下拉式方塊。 此屬性會定義資源庫或清單所顯示的表格。
- SelectedItems - 適用於清單方塊及下拉式方塊。 此屬性定義使用者在 SelectMultiple 啟用時所選取的表格項目。
行為公式
其他函式是專門用來修改資料且有副作用。 因為這些函式並不純,所以您必須小心地建立它們,而且它們在應用程式中不能參與自動重新計算值。 您可以只在行為公式 內使用這些函式。
- Collect、Clear 和 ClearCollect - 建立、清除集合和新增資料至集合。
- Patch - 修改記錄中的一或多個欄位。
- Update 和 UpdateIf - 更新符合您所指定之一或多個準則的記錄。
- Remove 和 RemoveIf - 刪除符合您所指定之一或多個準則的記錄。
記錄公式
您也可以建置能計算個別記錄資料的公式、採用個別記錄做為引數,以及提供個別記錄做為傳回值。 回到上述的資源庫範例,讓我們使用 Gallery1.Selected 屬性,以顯示使用者在該資源庫中所選取之任何記錄的資訊。
新增一個按鈕,並將其 OnSelect 屬性設為此公式:
Collect( SelectedRecord, Gallery1.Selected )按住 Alt 鍵時,選取按鈕。
在檔案功能表中,選取集合。
此公式會傳回一筆記錄,其中不只包含目前在資源庫中所選取之記錄的資料,還包括該資源庫中的每一個控制項。 例如,記錄同時包含範例文字資料行(符合原始表格中的範例文字資料行),以及底稿 1 資料行 (代表顯示該資料行中資料的標籤)。 選取底稿 1 資料行中的表格圖示來深入研究該資料。
注意
如果您已新增本主題所指定之元素以外的元素,則可能會將底稿 1 資料行命名為底稿 2 或類似名稱。
既然您已選取記錄,就可以從中擷取個別欄位,方法是使用 . 運算子。
您已採用 Selected 屬性(為一筆記錄),並從中擷取 SampleHeading 屬性。
您也可以使用記錄做為相關具名值的一般用途容器。
- 如果您根據 UpdateContext 和 Navigate 函式建置公式,請使用記錄來蒐集您想要更新的 context variables。
- 使用**編輯表單** 控制項上的 Updates 屬性來蒐集使用者已在表單中所做的變更。
- 使用 Patch 函式,不僅可以更新資料來源,還可以合併記錄。
在這些情況下,記錄永遠不會是表格的一部分。
記錄函式和控制項屬性
傳回記錄的函式︰
- FirstN 和 LastN - 傳回表格的第一筆或最後一筆記錄或數筆記錄。
- Lookup - 傳回符合一或多個準則之表格中的第一筆記錄。
- Patch - 更新資料來源或合併記錄。
- Defaults - 傳回資料來源的預設值。
傳回記錄的屬性︰
- Selected - 適用於資源庫及清單方塊。 傳回目前選取的記錄。
- Updates - 適用於資源庫。 同時拉出使用者在資料輸入表單中進行的所有變更。
- Update - 適用於輸入控制項,例如文字輸入控制項和滑桿。 針對資源庫設定要同時拉出的個別屬性。
記錄範圍
有些函式的運作方式為個別評估跨單一表格中所有記錄的公式。 公式的結果的使用方式有許多種︰
- AddColumns - 公式會提供已新增之欄位的值。
- Average、Max、Min、Sum、StdevP 和 VarP - 公式會提供要加總的值。
- Filter 和 Lookup - 公式會判定輸出中是否應該包括記錄。
- Concat - 公式會決定要一起串連的字串。
- Distinct - 公式會傳回一值,用來識別重複記錄。
- ForAll - 公式可以傳回任何值,可能會有副作用。
- Sort - 公式會提供排序記錄時要依據的值。
- With - 公式可以傳回任何值,可能會有副作用。
在這些公式內,您可以參考正在處理之記錄的欄位。 其中每一個函式都會建立一個用以評估公式的「記錄範圍」,其中記錄的欄位可以做為最上層識別碼。 您也可以由整個應用程式中參照控制項屬性及其他值。
例如,採用產品的表格:
若要在應用程式中建立此範例表,請插入按鈕,將其 OnSelect 屬性設為此公式,然後選取按鈕(在 Power Apps Studio 中,當您在按住 ALT 鍵的同時按一下該按鈕):
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 定義另一個記錄範圍 。因為此表格也有已定義的值欄位,所以使用此處的值指的是 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 } )
並傳回此表格: