在 Power Apps 中,您可以建立畫布應用程式,以存取 Microsoft Excel、SharePoint、SQL Server 以及將資料儲存在記錄和資料表中的數個其他來源中的資訊。 若要最有效地使用這類資料,請檢閱這些結構的基本概念。
- 記錄包含一或多種個人、場所或事物的相關資訊。 例如,記錄可能包含單一客戶的名稱、電子郵件地址和電話號碼。 其他工具將記錄稱為「資料列」或「項目」。
- 表格會保存一或多筆記錄,其中包含相同類別的資訊。 例如,資料表可能包含 50 個客戶的名稱、電子郵件地址和電話號碼。
在你的應用程式中,使用 公式 來建立、更新和操作記錄和表格。 你可能會將資料讀寫至外部的資料來源,這也就是一個擴充的資料表。 此外,您可以建立一或多個內部表格,稱為 集合。
您可以建置各種公式,採用表格的名稱做為引數,就像 Excel 中的公式採用一或多個儲存格參考做為引數一樣。 Power Apps 中的某些公式會傳回反映您指定的其他引數的資料表。 例如,您可能建立一個公式︰
- 來更新表格中的記錄,方法為指定該表格做為 Patch 函式中多個引數中的其中一個
- 新增、移除和重新命名表格中的資料行,方法為指定該表格做為 AddColumns、DropColumns 或 RenameColumns 函式的引數。 那些函式都不會修改原始的表格。 函式反而會根據您指定的其他引數傳回另一個表格。
資料表的元素
記錄
每一筆記錄都包含至少一種關於個人、場所或事物的資訊。 上述範例顯示每項產品的記錄 (巧克力、麵包和水) 和每個資訊類別的資料行 (價格、庫存量和訂購數量)。
在公式中,您可以使用大括號參照表格內容外的記錄本身。 例如,這筆記錄 { Name: "Strawberries", Price: 7.99 } 並未與任何資料表關聯。 欄位名稱,例如該範例中的 Name 和 Price ,並未用雙引號包圍。
Fields
欄位是記錄中的個別資訊片段。 您可以視覺化這類欄位,做為特定記錄資料行中的值。
跟使用控制項一樣,您可以使用記錄上的 .運算子來引用記錄的欄位。 例如,First(Products).Name 會傳回產品表格中第一筆記錄的名稱欄位。
欄位可以包含另一筆記錄或表格,如 GroupBy 函式的範例所示。 您可以依照需求巢狀建立多層記錄和表格。
Columns
資料行指的是表格中一或多筆記錄的相同欄位。 在前述範例中,每個產品都有一個價格欄位,且所有產品在該價格下共用同一欄。 前表有四欄,橫向顯示於頂部:
- 名稱
- 價格
- 現有庫存數量
- 訂購數量
資料行的名稱反映該資料行中的欄位。
資料行內的所有值都屬於相同的資料類型。 在前述範例中,「手頭數量」欄位總是包含數字,且不能包含字串,例如「12 單位」,代表單一紀錄。 任何欄位的值也可以是 空白。
你可能在其他工具中稱欄位為「欄位」。
備註
對於像 SharePoint、Excel 或 Power BI 這類包含欄位名稱與空格的資料來源,Power Apps 會將空格替換為「_x0020_」。 例如,SharePoint、Excel 或 Power BI 圖塊中的"Column Name"在 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"),會傳回目錄表格中的所有記錄,但會將價格資料行的名稱變更為成本。
就像數字一樣,涉及表格和記錄的公式會隨著底層表格或記錄的變動自動重新計算。 如果 目錄表中 某產品的成本低於先前最低值, 最小 值公式的報酬值會自動調整以匹配。
讓我們來看看一些簡單的例子。
為手機建立空白應用程式,並新增包含其他控制項的垂直 [資源庫] 控制項。
根據預設,畫面會顯示名為 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 和許多其他函式,也可以採用單一資料行表格做為輸入。
- 排序、 篩選 - 排序並篩選記錄。
- FirstN, LastN - 回傳表格的前 N 或最後 N 條記錄。
- Abs、Sqrt、四捨五入、無條件進位、向下捨入,對單欄表格的每條記錄進行算術運算,產生單欄結果表。
- 左、中、右、替換、代替、去除空白、轉小寫、轉大寫、首字母大寫 - 對單欄資料表的每筆記錄進行字串操作,產生單欄字串資料表。
- Len - 對於字串資料行,傳回包含每個字串長度的單資料行資料表。
- 串連 - 串連多個字串,產生單欄字串表格。
- AddColumns、 DropColumns、 RenameColumns、 ShowColumns - 對資料表進行欄位操作,產生一個包含不同欄位的新資料表。
- Distinct - 移除重複紀錄。
- Shuffle - 隨機重新排列記錄。
- HashTags - 搜尋字串中的主題標籤。
- 錯誤 - 當您使用資料來源時,提供錯誤資訊。
其中許多函式會採用單列資料表作為其輸入。 如果整個表格只有一個資料行,您可以依名稱指定它。 如果表格有多個資料行,您可以使用 Table.Column 語法來指定其中一個資料行。 例如,產品.名稱會傳回只有產品表格中名稱值的單一資料行表格 。
您可以使用 AddColumns、 RenameColumns、 ShowColumns 或 DropColumns 函式,以您想要的方式完全調整資料表的形狀。 同樣地,這些函式只會變更其輸出,而不會變更其來源。
控制項的屬性也可以是資料表:
- 項目 - 適用於圖庫、列表框和組合框。 此屬性定義了圖庫或清單顯示的資料表。
- SelectedItems - 套用至清單方塊和下拉式方塊。 此屬性定義了若啟用 SelectMultible 時,使用者所選擇的項目表。
行為公式
有些函式是專門設計來修改資料,並有副作用。 因為這些功能不純粹,你必須謹慎地建立它們。 他們無法參與應用程式中自動重新計算數值。 您只能在 行為公式中使用這些函數。
- 收集、 清除、 清除 收集 - 建立集合、清除集合,並將資料新增至集合。
- 修補程式 - 修改記錄中的一或多個欄位。
- Update、 UpdateIf - 更新符合您指定的一或多個條件的記錄。
- Remove、 RemoveIf - 刪除符合您指定的一或多個準則的記錄。
記錄公式
您也可以建置公式來計算個別記錄的資料、將個別記錄作為引數,並提供個別記錄作為傳回值。 回到圖庫範例,使用 Gallery1.Selected 屬性來顯示使用者在該圖庫中選擇的紀錄中的資訊。
新增 Button,並將其 OnSelect 屬性設定為下列公式:
Collect(SelectedRecord,Gallery1.Selected)按住 Alt 鍵時,選取按鈕。
在 [檔案 ] 功能表中,選取 [集合]。
此公式會傳回記錄,其中不僅包含目前在資源庫中選取之記錄的資料,還包含該資源庫中的每個控制項。 例如,記錄同時包含 SampleText 資料行 (符合原始資料表中的 SampleText 資料行) 和 Subtitle1 資料行 (代表顯示該資料行資料的標籤)。 選取 Subtitle1 資料行中的表格圖示,以切入該資料。
備註
如果你加入了本主題以外的元素, Subtitle1 欄位可能會命名為 Subtitle2 或類似名稱。
現在你已經選中了紀錄,可以用 . 運算子從中擷取個別欄位。
你取得 Selected 屬性(也就是紀錄),並從中擷取了 SampleHeading 屬性。
您也可以將「記錄」作為包含相關具名值的一般用途容器來使用。
- 如果您圍繞 UpdateContext 和 Navigate 函數建立公式,請使用記錄來收集您要更新的上下文 變數 。
- 使用編輯表單控制項上的「更新」屬性,收集使用者在表單中所做的變更。
- 使用 Patch 函數來更新資料來源,也可以合併記錄。
在這些情況下,記錄永遠不會是表格的一部分。
記錄功能和控制屬性
傳回記錄的函數:
- FirstN, LastN - 傳回資料表的第一筆或最後一筆或多筆記錄。
- 查閱 - 從符合一或多個條件的資料表中傳回第一筆記錄。
- 修補程式 - 更新資料來源或合併記錄。
- 預設值 - 傳回資料來源的預設值。
傳回記錄的屬性:
- 已選取 - 套用至圖庫和清單方塊。 傳回目前選取的記錄。
- 更新 - 適用於圖庫。 將使用者在資料輸入表單中所做的所有變更匯集在一起。
- 更新 - 適用於輸入控制項,例如文字輸入控制項和滑桿。 針對資源庫設定要同時拉出的個別屬性。
記錄範圍
有些函式是透過逐一評估表格中所有紀錄的公式來運作。 你在每個函數中以不同的方式使用公式的結果:
- AddColumns - 使用公式取得新增欄位的值。
- 平均值、最大值、最小值、總和、母體標準差、母體變異數:使用公式來取得你想要的彙總值。
- 篩選、 查找 ——用公式決定該紀錄是否應該成為輸出的一部分。
- Concat - 用公式決定哪些弦要接在一起。
- 獨特 - 使用公式回傳一個有助於尋找重複紀錄的值。
- ForAll - 使用公式回傳任意值,可能會有副作用。
- 排序 - 使用公式取得排序記錄的值。
- 用 - 使用公式回傳任意值,可能會有副作用。
在這些公式中,你可以參考正在處理的記錄中的欄位。 這些函式各自建立一個「記錄範圍」,公式會在那裡執行。 記錄欄位會以頂層識別碼的形式出現。 您也可以由整個應用程式中參照控制項屬性及其他值。
例如,考慮一張 產品表:
若要在應用程式中建立此範例資料表,請插入按鈕,將其 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 定義了另一個記錄範圍。由於此表中也定義了 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 } ) 並傳回此表格: