共用方式為


瞭解畫布應用程式中的表格和記錄

在 Power Apps 中,您可以建立畫布應用程式,以存取 Microsoft Excel、SharePoint、SQL Server 以及將資料儲存在記錄和資料表中的數個其他來源中的資訊。 若要最有效地使用這類資料,請檢閱這些結構的基本概念。

  • 記錄包含一或多種個人、場所或事物的相關資訊。 例如,記錄可能包含單一客戶的名稱、電子郵件地址和電話號碼。 其他工具將記錄稱為「資料列」或「項目」。
  • 表格會保存一或多筆記錄,其中包含相同類別的資訊。 例如,資料表可能包含 50 個客戶的名稱、電子郵件地址和電話號碼。

在你的應用程式中,使用 公式 來建立、更新和操作記錄和表格。 你可能會將資料讀寫至外部的資料來源,這也就是一個擴充的資料表。 此外,您可以建立一或多個內部表格,稱為 集合

您可以建置各種公式,採用表格的名稱做為引數,就像 Excel 中的公式採用一或多個儲存格參考做為引數一樣。 Power Apps 中的某些公式會傳回反映您指定的其他引數的資料表。 例如,您可能建立一個公式︰

  • 來更新表格中的記錄,方法為指定該表格做為 Patch 函式中多個引數中的其中一個
  • 新增、移除和重新命名表格中的資料行,方法為指定該表格做為 AddColumnsDropColumnsRenameColumns 函式的引數。 那些函式都不會修改原始的表格。 函式反而會根據您指定的其他引數傳回另一個表格。

資料表的元素

表格元素。

記錄​​

每一筆記錄都包含至少一種關於個人、場所或事物的資訊。 上述範例顯示每項產品的記錄 (巧克力麵包) 和每個資訊類別的資料行 (價格庫存量訂購數量)。

在公式中,您可以使用大括號參照表格內容外的記錄本身。 例如,這筆記錄 { Name: "Strawberries", Price: 7.99 } 並未與任何資料表關聯。 欄位名稱,例如該範例中的 NamePrice ,並未用雙引號包圍。

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 中,將 Slider1Default 屬性設為 42,並將標籤的 Text 屬性設為 Slider1.Value + 2 以顯示 44 的值。

在這兩種案例中,如果您變更引數的值(例如,資料格 A1 中的數字或 Slider1 的值),則算出的值會自動變更。

同樣地,您可以使用公式存取和操作表格和記錄中的資料。 您可以使用表格的名稱做為某些公式(例如 Min(Catalog, Price))中的引數,以顯示目錄表格中價格資料行的最低值。 其他公式提供整個表格為傳回值,例如 RenameColumns(Catalog, "Price", "Cost"),會傳回目錄表格中的所有記錄,但會將價格資料行的名稱變更為成本

就像數字一樣,涉及表格和記錄的公式會隨著底層表格或記錄的變動自動重新計算。 如果 目錄表中 某產品的成本低於先前最低值, 最小 值公式的報酬值會自動調整以匹配。

讓我們來看看一些簡單的例子。

  1. 為手機建立空白應用程式,並新增包含其他控制項的垂直 [資源庫] 控制項。

    根據預設,畫面會顯示名為 CustomGallerySample 的資料表中的預留位置文字。 畫面 [資源庫] 控制項的 Items 屬性會自動設定為該資料表。

    畫廊。

    備註

    部分控制鍵會重新排列並放大以供說明使用。

  2. 不要將 Items 屬性設定為資料表的名稱,而是將它設定為包含資料表名稱作為引數的公式,如下列範例所示:

    Sort(CustomGallerySample, SampleHeading, SortOrder.Descending)

    此公式包含 Sort 函數,該函數將表的名稱作為其第一個參數,並將該表中的列名稱作為其第二個參數。 該函數還支援可選的第三個參數,該參數規定您要按降序對資料進行排序。

    對圖庫進行整理排序。

  3. Items 屬性設定為公式,該公式會採用上一個步驟中的公式作為引數,並傳回資料表,如下列範例所示:

    FirstN(Sort(CustomGallerySample, SampleHeading, SortOrder.Descending), 2)

    在此公式中,您可以使用 FirstN 函數在表格中顯示特定數量的記錄。 您可以使用 Sort 函數作為 FirstN 的第一個引數,並使用數字 (在本例中為 2) 作為第二個引數,以指定要顯示的記錄數。

    整個公式會傳回包含 CustomGallerySample 資料表前兩筆記錄的資料表,並依 SampleHeading 資料行遞減排序。

    FirstN 用於畫廊。

表格函式和控制項屬性

想想 Lower 函式。 如果變數 welcome 包含文字字串 "Hello,world",則公式 Lower( welcome ) 會傳回 "hello, world"。 這個函數不會改變該變數的值。 Lower 是純函數,因為它只處理輸入並產生輸出。 它沒有副作用。 Excel 裡的所有函數,以及 Power Apps 裡的大多數函式都是純函數,也就是說,工作簿或應用程式會自動重新計算。

Power Apps 提供一組以相同方式在資料表上運作的函式。 這些函式會將採用表格做為輸入並篩選、排序、轉換、減少和摘要整個表格格。 事實上,通常採用單一值的 Lower 和許多其他函式,也可以採用單一資料行表格做為輸入。

其中許多函式會採用單列資料表作為其輸入。 如果整個表格只有一個資料行,您可以依名稱指定它。 如果表格有多個資料行,您可以使用 Table.Column 語法來指定其中一個資料行。 例如,產品.名稱會傳回只有產品表格中名稱值的單一資料行表格 。

您可以使用 AddColumnsRenameColumnsShowColumnsDropColumns 函式,以您想要的方式完全調整資料表的形狀。 同樣地,這些函式只會變更其輸出,而不會變更其來源。

控制項的屬性也可以是資料表:

  • 項目 - 適用於圖庫、列表框和組合框。 此屬性定義了圖庫或清單顯示的資料表。
  • SelectedItems - 套用至清單方塊和下拉式方塊。 此屬性定義了若啟用 SelectMultible 時,使用者所選擇的項目表。

行為公式

有些函式是專門設計來修改資料,並有副作用。 因為這些功能不純粹,你必須謹慎地建立它們。 他們無法參與應用程式中自動重新計算數值。 您只能在 行為公式中使用這些函數。

  • 收集清除清除 收集 - 建立集合、清除集合,並將資料新增至集合。
  • 修補程式 - 修改記錄中的一或多個欄位。
  • UpdateUpdateIf - 更新符合您指定的一或多個條件的記錄。
  • RemoveRemoveIf - 刪除符合您指定的一或多個準則的記錄。

記錄公式

您也可以建置公式來計算個別記錄的資料、將個別記錄作為引數,並提供個別記錄作為傳回值。 回到圖庫範例,使用 Gallery1.Selected 屬性來顯示使用者在該圖庫中選擇的紀錄中的資訊。

  1. 新增 Button,並將其 OnSelect 屬性設定為下列公式:
    Collect(SelectedRecord,Gallery1.Selected)

  2. 按住 Alt 鍵時,選取按鈕。

  3. [檔案 ] 功能表中,選取 [集合]。

    SelectedRecord 集合。

此公式會傳回記錄,其中不僅包含目前在資源庫中選取之記錄的資料,還包含該資源庫中的每個控制項。 例如,記錄同時包含 SampleText 資料行 (符合原始資料表中的 SampleText 資料行) 和 Subtitle1 資料行 (代表顯示該資料行資料的標籤)。 選取 Subtitle1 資料行中的表格圖示,以切入該資料。

備註

如果你加入了本主題以外的元素, Subtitle1 欄位可能會命名為 Subtitle2 或類似名稱。

現在你已經選中了紀錄,可以用 . 運算子從中擷取個別欄位。

  1. 新增 [標籤] 控制項,然後將它移至圖庫和按鈕的下方。

  2. 將標籤的 Text 屬性設定為此運算式:
    “選取: ” &; Gallery1.Selected.SampleHeading

    具有更新標籤的 Text 屬性。

你取得 Selected 屬性(也就是紀錄),並從中擷取了 SampleHeading 屬性。

您也可以將「記錄」作為包含相關具名值的一般用途容器來使用。

  • 如果您圍繞 UpdateContextNavigate 函數建立公式,請使用記錄來收集您要更新的上下文 變數
  • 使用編輯表單控制項上的「更新」屬性,收集使用者在表單中所做的變更。
  • 使用 Patch 函數來更新資料來源,也可以合併記錄。

在這些情況下,記錄永遠不會是表格的一部分。

記錄功能和控制屬性

傳回記錄的函數:

  • FirstNLastN - 傳回資料表的第一筆或最後一筆或多筆記錄。
  • 查閱 - 從符合一或多個條件的資料表中傳回第一筆記錄。
  • 修補程式 - 更新資料來源或合併記錄。
  • 預設值 - 傳回資料來源的預設值。

傳回記錄的屬性:

  • 已選取 - 套用至圖庫和清單方塊。 傳回目前選取的記錄。
  • 更新 - 適用於圖庫。 將使用者在資料輸入表單中所做的所有變更匯集在一起。
  • 更新 - 適用於輸入控制項,例如文字輸入控制項和滑桿。 針對資源庫設定要同時拉出的個別屬性。

記錄範圍

有些函式是透過逐一評估表格中所有紀錄的公式來運作。 你在每個函數中以不同的方式使用公式的結果:

  • 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

收藏 X。

你可以使用 ClearCollect( X, [1, 2] ) 建立這個集合。

還有另一個集合 Y

集合 Y。

你可以使用 ClearCollect(Y, [“A”, “B”] ) 建立這個集合。

此外,使用此公式:UpdateContext( {Value: "!"} ),定義名為 Value 的 context 變數

總而言之, 在此內容中,下列公式︰

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

會產生此表格︰

XY 表格。

這其中發生了什麼狀況? 最外層的 ForAll 函式定義了 X 的記錄範圍,允許在處理時存取每個記錄的 Value 欄位。 您可以直接使用「 Value 」一詞或使用 X[@Value]

最內層的 ForAll 函數為 Y 定義了另一個記錄範圍。由於此表中也定義了 Value 欄位,這裡的 Value 指的是 Y 記錄中的欄位,而非 X 的欄位。要存取 XValue 欄位,必須使用帶有消歧義運算子的較長版本。

由於 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 } ) 並傳回此表格:

內嵌表格。