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

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

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

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

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

資料表的元素

##

記錄

###

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

在公式中,您可以使用大括號參照資料表內容外的記錄本身。 例如,此記錄 { Name: "Strawberries", Price: 7.99 } 與資料表沒有關聯。

欄位

###

欄位是記錄中的個別資訊片段。 您可以針對特定記錄將這類欄位視覺化為資料行中的值。

就像控制項,您可以在記錄上使用 . 運算子參照記錄的欄位。 例如,First(Products).Name 會傳回 Products 資料表中第一筆記錄的 Name 欄位。

欄位可以包含另一筆記錄或資料表,如 GroupBy 函式的範例所示。 您可以依照需求建立多層記錄和資料表的巢狀。

資料行

###

資料行指的是資料表中一或多筆記錄的相同欄位。 在上述範例中,每項產品都有一個價格欄位,而且該價格位於所有產品的相同資料行中。 上表有四個資料行,以水平方式顯示在頂端︰

  • 名稱
  • 價格
  • 庫存量
  • 訂購數量

資料行的名稱反映該資料行中的欄位。

資料行內的所有值都屬於相同的資料類型。 在上述範例中,記錄的「庫存量」資料行一律包含數字,而且不能包含字串,例如「12 單位」。 任何欄位的值也可能 *空白*。

您可能已在其他工具中將資料行稱為「欄位」。

注意: 對於包含具有空格之資料行名稱的 SharePoint 和 Excel 資料來源,PowerApps 會將空格取代為 "_x0020_"。 例如,SharePoint 或 Excel 中的 "Column Name" 在資料版面配置中顯示或是在公式中使用時,會在 PowerApps 中顯示為 "Column_x0020_Name"

資料表

###

資料表包含一或多筆記錄,每筆記錄都有多個欄位,它們在各個記錄中都具有一致的名稱。

儲存在資料來源或集合中的任何資料表都有名稱 (用來參照資料表),並將它傳遞至採用資料表做為引數的函式。 資料表也可以是函式或公式的結果。

如下列範例所示,您可以使用公式表示資料表,方法為搭配使用 Table 函式與一組您用大括號表示的記錄︰

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

您也可以定義單一資料行的資料表,以方括弧括住。 另一種撰寫上述公式的方式︰

[ "Strawberry", "Vanilla" ]

資料表公式

##

在 Excel 和 PowerApps 中,您可以使用公式,以類似方式操作數字和字串︰

  • 在 Excel 中,於資料格 A1 中輸入一值 (例如 42),然後在另一個儲存格中輸入公式 (例如A1 + 2),以顯示 44 的值。
  • 在 PowerApps 中,將 Slider1Default 屬性設為 42,並將標籤的 Text 屬性設為 Slider1.Value + 2,以顯示 44 的值。

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

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

就像數字,當基礎資料表或記錄變更時,涉及資料表和記錄的公式會自動重新計算。 如果 Catalog 資料表中的產品成本降低而低於前一個最小值,則 Min 公式的傳回值將自動變更以符合它。

讓我們逐步解說一些簡單的範例。

  1. 新增文字資源庫控制項,並將其 Items 屬性設為資料表的名稱。

    依預設,資源庫會顯示預留位置文字,其來自名為 TextualGallerySample 的資料表。 資源庫的 Items 屬性會自動設為該資料表。

    注意︰ 基於圖例用途,已重新排列並放大某些控制項。

  2. 不是將 Items 屬性設為資料表的名稱,而是將它設為公式,以包括資料表的名稱做為引數,如下列範例所示:
    Sort(TextualGallerySample, Heading, Descending)

    此公式包含 Sort 函式,其會採用資料表的名稱做為其第一個引數,並採用該資料表中資料行的名稱做為第二個引數。 函式也支援選擇性第三個引數,其中規定您想要以遞減順序排序資料。

  3. Items 屬性設為公式,此公式會採用前一個步驟中的公式做為引數並傳回資料表,如下列範例所示:
    FirstN(Sort(TextualGallerySample, Heading, Descending), 2)

    在此公式中,您使用 FirstN 函式,顯示資料表中特定數目的記錄。 您使用 Sort 函式做為 FirstN 的第一個引數,並使用數字 (在此情況下,2) 做為第二個引數,指定要顯示多少筆記錄。

    整個公式會傳回資料表,其中包含 TextualGallerySample資料表的前兩筆記錄,按標題資料行依遞減順序排序。

資料表函式和控制項屬性

###

PowerApps 中的許多函式會採用資料表的名稱做為引數、建立第二個包含相同資料的資料表、操作以其他引數為基礎的新資料表,然後傳回結果。 下列函式不會修改原始資料表,即使它是資料來源也一樣。

  • SortFilter - 排序和篩選記錄。
  • FirstNLastN - 傳回資料表的前 N 筆或後 N 筆記錄。
  • AbsSqrtRoundRoundUpRoundDown - 單一資料行資料表的每筆記錄上的算術運算,產生單一資料行資料表的結果。
  • LeftMidRightReplaceSubstituteTrimLowerUpperProper - 單一資料行資料表的每筆記錄上的字串操作,產生單一資料行資料表的字串。
  • Len - 若為資料行的文字,傳回單一資料行資料表,其中包含每個字串的長度。
  • 串連 -串連多個資料行的字串,產生單一資料行資料表的字串。
  • AddColumnsDropColumnsRenameColumnsShowColumns - 資料表的資料行操作,產生具有不同資料行的資料表。
  • Distinct - 移除重複記錄。
  • Shuffle - 隨機重新排列記錄。
  • HashTags - 搜尋字串中的雜湊標記。
  • Errors - 當您使用資料來源時,提供錯誤資訊。

您可以在包含多個資料行的資料表上執行函式,即使函式需要單一資料行做為引數也一樣。 若要從多重資料行的資料表中擷取單一資料行,請使用 ShowColumns 函式做為您想要使用之函式的引數,如下列範例所示︰
Lower( ShowColumns( Products, "Name" ) )

此公式會建立單一資料行的資料表,其中包含 Products 資料表的 Name 資料行中的所有資料,但會將任何大寫字母轉換成小寫字母。 如果您指定資料表做為 AddColumnsRenameColumnsDropColumns 函式的引數,則可以將該資料表完全重新塑造成您想要的形狀。

如果您指定資料來源做為其中一個函式的引數,它將修改該資料來源的記錄,而且通常會傳回資料來源的新值做為資料表。

下列控制項具有其為資料表的屬性︰

  • Items - 適用於資源庫及其清單方塊。 要顯示在資源庫中的資料表。
  • SelectedItems - 適用於清單方塊。 使用者已選取之項目的資料表。

記錄公式

## 您也可以建置公式,計算個別記錄的資料、採用個別記錄做為引數,以及提供個別記錄做為傳回值。 回到上述的資源庫範例,讓我們使用 Gallery1.Selected 屬性,顯示使用者在該資源庫中選取之任何記錄的資訊。

  1. 新增一個按鈕,並將其 OnSelect 屬性設為以下公式:
    Collect( SelectedRecord, Gallery1.Selected )
  2. 如果未選取按鈕,請按一下它以選取,然後再按一下,以執行公式。
  3. 在 [檔案] 功能表中,選取 [集合]

此公式會傳回一筆記錄,其中不只包含目前在資源庫中選取之記錄的資料,還包括該資源庫中的每一個控制項。 例如,記錄同時包含 Body 資料行 (符合原始資料表中的 Body 資料行),以及 Body1 資料行 (其代表的標籤會顯示該資料行中的資料)。 選取 Body1 資料行中的資料表圖示來鑽研該資料。

既然您已選取記錄,就可以使用 . 運算子從中擷取個別欄位 運算子來存取控制項屬性。

  1. 按下 Esc 鍵以返回預設工作區,然後在資源庫下方新增標籤。

  2. 將標籤的 Text 屬性設定為以下公式︰
    Gallery.Selected.Heading

您已採用 Selected 屬性 (其為一筆記錄),並從中擷取 Heading 屬性。

您也可以使用記錄做為相關具名值的一般用途容器。

  • 如果您根據 UpdateContextNavigate 函式建置公式,請使用記錄來蒐集您想要更新的內容變數
  • 使用 編輯表單 控制項上的 Updates 屬性,來蒐集使用者已在表單中所做的變更。
  • 使用 Patch 函式,不僅可以更新資料來源,還可以合併記錄。

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

記錄函式和控制項屬性

###

傳回記錄的函式︰

  • FirstNLastN - 傳回資料表的第一筆或最後一筆記錄或數筆記錄。
  • Lookup - 從符合一或多個條件之資料表中傳回第一筆記錄。
  • Patch - 更新資料來源或合併記錄。
  • Defaults - 傳回資料來源的預設值。

傳回記錄的屬性︰

  • Selected - 適用於資源庫及其清單方塊。 傳回目前選取的記錄。
  • Updates - 適用於資源庫。 同時拉出使用者在資料輸入表單中進行的所有變更。
  • Update - 適用於輸入控制項,例如文字輸入控制項和滑桿。 針對資源庫設定要同時拉出的個別屬性。

記錄範圍

##

有些函式的運作方式為跨資料表的所有記錄個別評估公式。 公式的結果有各種使用方式︰

  • FilterLookup - 公式會判定輸出中是否應該包括記錄。
  • Sort - 公式會提供排序記錄所依據的值。
  • Concat - 公式會決定要一起串連的字串。
  • ForAll - 公式可以傳回任何值,可能有副作用。
  • Distinct - 公式會傳回一值,用來識別重複記錄。
  • AddColumns - 公式會提供已新增之欄位的值。
  • AverageMaxMinSumStdevPVarP - 公式會提供要加總的值。

在這些公式內,您可以參考正在處理之記錄的欄位。 其中每一個函式都會建立一個用以評估公式的「記錄範圍」,其中記錄的欄位可以做為最上層識別碼。 您也可以參考整個應用程式中的控制項屬性和其他值。

例如,採用 Products 的資料表:

若要判斷其中是否有任一項產品要求的超過可用的︰

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Filter 的第一個引數為操作所在之記錄的資料表,而第二個引數為公式。 Filter 會建立一個記錄範圍,用於評估此公式,其中每筆記錄的欄位均可用,在此情況下,指的是 ProductQuantity RequestedQuantity 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 的案例所示。

去除混淆

###

隨附記錄範圍新增的欄位名稱會覆寫應用程式中其他位置的相同名稱。 發生這種情況時,您仍然可以使用 @去除混淆 運算子,從記錄範圍外存取值︰

  • 若要從巢狀記錄範圍中存取值,請使用 @ 運算子,搭配在使用模式 Table[@FieldName] 時進行操作的資料表名稱。
  • 若要存取全域值 (例如資料來源、集合和內容變數),請使用模式 [@ObjectName] (不含資料表指定)。

如果操作所在的資料表是運算式,例如 Filter( table, ... ),則無法使用去除混淆運算子。 只有最內層的記錄範圍可以不使用去除混淆運算子,從這個資料表運算式中存取欄位。

例如,假設有集合 X

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

還有另一個集合 Y

您可以利用 ClearCollect( Y, ["A", "B"] ) 建立這個集合。

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

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

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

會產生此資料表︰

這是怎麼一回事? 最外層的 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 函式將產生巢狀結果資料表。

內嵌語法

##

記錄

###

您可以使用包含具名欄位值的大括號表示記錄。 例如,您可以使用下列公式,表示本主題開頭的資料表中的第一筆記錄︰

{ 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 } }

以單引號括住每個包含特殊字元 (例如空格或冒號) 的資料行名稱。 若要在資料行名稱內使用單引號,請按兩下它。

請注意,Price 資料行中的值不包括貨幣符號,例如錢幣符號。 顯示值時,將套用該格式。

資料表

###

您可以使用 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 } ) } )

值資料表

###

您可以在方括號中指定值,建立單一資料行的資料表。 產生的資料表具有單一資料行,名為 Value

例如,[ 1, 2, 3, 4 ] 等同於 Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ),並傳回下列資料表: