Note
Microsoft Power Fx 是畫布應用程式公式語言的新名稱。 這些文章仍在進行中,Microsoft 正在從 canvas 應用程式中擷取該語言,並將其整合至其他 Microsoft Power Platform 產品,並以開放原始碼形式提供。 從 Microsoft Power Fx 概觀開始,以取得該語言的介紹。
了解 Power Fx 變數與 Visual Basic 或 JavaScript 等工具中的變數有何不同,以及何時使用公式會是更好的選擇。 本文說明如何選擇全域變數、上下文變數或集合來管理應用程式的值與狀態。
在其他工具中,您可以明確執行計算並將結果儲存在變數中。 不過,Power Fx 和 Excel 都會隨著輸入資料變更而自動重新計算公式,因此您通常不需要建立和更新變數。 透過這種方式,您就可以隨時更輕鬆地建立、了解和維護您的應用程式。
在某些情況下,你需要在 Power Fx 中使用變數。 Power Fx 透過加入行為公式來擴充 Excel 的模型。 例如,當使用者選取一個按鈕時,就會執行這些公式。 在行為公式中,設定一個變數用於其他公式通常很有幫助。
一般而言,避免使用變數。 但有時候,只有變數才能啟用您想要的體驗。 你隱含地在函式中建立並打入變數,這些變數出現在設定其值的函式中。
將 Excel 轉譯至 Power Fx
Excel
讓我們來檢閱 Excel 的運作方式。 儲存格可以包含值,例如數字或字串,或根據其他儲存格之值的公式。 當使用者在儲存格中輸入不同的值之後,Excel 會自動重新計算任何依據新值的公式。 您不必進行任何程式設計就能啟用這項行為。
在下列範例中,儲存格 A3 設定為公式 A1 + A2。 如果 A1 或 A2 變更,則 A3 會自動重新計算以反映變更。 此行為不需要在公式本身外部進行編碼。
Excel 沒有變數。 包含公式的儲存格值會依據其輸入而變更,但沒有任何方法可記住公式的結果,並將它儲存在儲存格中或其他任何地方。 如果你改變了某個儲存格的數值,整個試算表可能會改變,之前計算過的數值也會消失。 Excel 的使用者可以複製並貼上儲存格,但需使用者手動控制,而且無法套用公式執行。
Power Fx
您在 Power Fx 中建立的邏輯行為非常類似 Excel。 但不需更新儲存格,您可以改在畫面上任何想要的位置新增控制項,並給它們名字以在公式中使用。
如需 Power Apps 中的範例,您可以藉由新增名為 Label1 的標籤控制項,以及兩個名為 TextInput1 和 TextInput2 的文字輸入控制項來複寫應用程式中的 Excel 行為。 如果你把 Label1 的 Text 屬性設為 TextInput1.Text + TextInput2.Text,它就會自動顯示 TextInput1 和 TextInput2 中所有數字的總和。
請注意,已選取該 Label 控制項,在畫面頂端的公式列中顯示其 Text 公式。 這裡有 TextInput1.Text + TextInput2.Text 這個公式。 就像在 Excel 活頁簿中的儲存格之間所建立的相依性一樣,這個公式會建立這些控制項之間的相依性。 讓我們變更 TextInput1 的值:
Label1 的公式會自動重新計算,顯示新的值。
在 Power Fx 中,您使用公式不只可以判斷控制項的主要值,還有格式化等屬性。 在下一個範例中,標籤的 Color 屬性公式會自動以紅色顯示負值。 If 函式從 Excel 看起來應該有點熟悉:
If( Value(Label1.Text) < 0, Color.Red, Color.Black )
您可以在多種情況下使用公式:
- 透過使用裝置的 GPS 和 map 控制項,以及 Location.Latitude 和 Location.Longitude 公式,就可以顯示您目前的位置。 當您移動時,地圖會自動追蹤您的位置。
- 其他使用者可以更新資料來源。 例如,團隊的其他人可能會更新 SharePoint 清單中的項目。 當你刷新資料來源時,任何依賴的公式會自動重新計算以反映更新後的資料。 進一步說明,你可以將圖庫的 Items 屬性設為 Filter(SharePointList ) 這個公式,這樣會自動顯示新篩選的 紀錄集合。
Power Fx 公式的優點
使用公式來打造應用程式有許多優勢:
- 如果您會使用 Excel,便會使用 Power Fx。 模型和公式語言都相同。
- 如果你用其他程式設計工具,請考慮完成這些範例需要多少程式碼。 在 Visual Basic 中,您必須在每個文字輸入控制項上撰寫變更事件的事件處理常式。 這些事件處理器中執行計算的程式碼是多餘的,可能會不同步,或者你必須寫一個共用的子程式。 在 Power Fx 中,你用一句話就能完成所有這些工作。
- 要了解 Label1 文字的來源,你知道該從哪裡找: Text 屬性中的公式。 沒有其他方法可影響此控制項的文字。 在傳統程式設計工具中,任何事件處理常式或副常式皆可能在程式中的任何地方變更標籤的值。 這種做法會讓人難以追蹤變數何時何地被更改。
- 如果使用者變更滑桿控制項,之後改變心意,他們可以將滑桿變更回其原始值。 彷彿什麼都沒變:應用程式顯示的控制值和以前一樣。 沒有實驗延伸性影響和詢問「如果」,如同在 Excel 中也沒有一樣。
一般來說,如果你能透過公式達成效果,那你會比較好。 讓 Power Fx 中的公式引擎為您工作。
知道何時要使用變數
讓我們來變更我們簡單的加法器,讓它如同舊式加法機器一般執行總計功能。 如果你選擇 新增 按鈕,你會在累積總數中加入一個數字。 如果你選擇 清除 按鈕,會將持續的總數重置為零。
| 顯示 | 描述 |
|---|---|
|
當應用程式開始時,總和為 0。 紅點表示使用者在文字輸入方塊中的手指,使用者在其中輸入 77。 |
|
使用者選取新增按鈕。 |
|
77 會新增至總計中。 使用者再次選取新增按鈕。 |
|
再次新增77 至總和,產生 154。 使用者選取清除按鈕。 |
|
總計歸零。 |
我們的加法器會使用 Excel 中不存在的項目︰按鈕。 在此應用程式中,您無法僅使用公式來計算加總,因為它的值取決於一系列使用者採取的動作。 相反地,你必須手動記錄並更新運作中的總分。 大部分的程式設計工具會將此資訊儲存於變數。
有時候,您的應用程式需要變數來進行您想要的行為。 但此方法有些需要注意的事項︰
- 您必須手動更新總計。 自動重新計算不會為您更新總計。
- 你無法根據其他控制項的數值計算持續總數。 這取決於使用者選取新增按鈕的次數,以及每次在文字輸入控制項中的值是什麼。 使用者是輸入 77 並選取新增兩次,還是在每個新增項目中指定 24 以及 130? 總數達到154分後就分不清了。
- 總計的變更可能來自不同的路徑。 在此範例中,新增和清除按鈕皆可以更新總數。 如果應用程式的行為並未如您預期,哪一個按鈕是造成問題的原因?
使用全域變數
要建立你的加法機,你需要一個變數來記錄持續的總數。 Power Fx 中最簡單好用的變數是全域變數。
全域變數如何運作:
- 使用 Set 函式來設定全域變數的值。 Set( MyVar, 1 ) 將全域變數 MyVar 的值設為 1。
- 使用全域變數時,參考你用 Set 函式時使用的名稱。 在此情況下, MyVar 會傳回 1。
- 全域變數可以保留任何值,包括字串、數字、記錄和資料表。
讓我們使用全域變數來重建加法器︰
新增名為 TextInput1 的文字輸入控制項,和名為 Button1 和 Button2 的兩個按鈕。
將 Button1 的 Text 屬性設為 "Add",並將 Button2 的 Text 屬性設為 "Clear"。
每當使用者選取新增按鈕時若要更新計算加總,將其 OnSelect 屬性設為以下公式︰
Set(RunningTotal, RunningTotal + TextInput1.Text)
由於使用 運算子,僅此公式的存在就會讓 + 確立為保存數值的全域變數。 您可以在應用程式中的任何地方參考 RunningTotal。 每當使用者打開此應用程式時,RunningTotal 的初始值均為空白。
當使用者第一次選取新增按鈕且 Set 執行時, RunningTotal 會設定為值 RunningTotal + TextInput1。
每當使用者選取清除按鈕時若要將計算加總設為 0,將其 OnSelect 屬性設為以下公式︰
Set(RunningTotal, 0)
新增標籤控制項,並將其 Text 屬性設定為 RunningTotal。
此公式會自動重新計算並顯示 RunningTotal 的值,並根據使用者選擇的按鈕調整。
預覽應用程式後,你就有了前面描述的加法機。 在文字方塊中輸入數字,然後按新增按鈕數次。 準備好後,使用 Esc 鍵回到創作體驗。
若要顯示全域變數的值,選取檔案功能表,然後在左側窗格中選取變數。
若要顯示所有變數定義及使用的位置,請選取變數。
變數類型
Power Fx 具有兩種變數類型:
| 變數類型 | Scope | 描述 | 函式建立 |
|---|---|---|---|
| 全域變數 | 應用程式 | 最簡單好用。 可儲存數字、文字字串、布林值、記錄、表格等多種功能。 你可以在應用程式的任何地方參考它。 | Set |
| 集合 | 應用程式 | 裡面有一張表格,你可以在應用程式裡任何地方查閱。 你可以修改表格的內容,而不是整個設定。 你可以把它存到本地裝置,以備後續使用。 |
Collect ClearCollect |
當你使用 Power Apps 時,你會看到第三種變數:
| 變數類型 | Scope | 描述 | 函式建立 |
|---|---|---|---|
| 內容變數 | 畫面 | 很適合用於將值傳遞至畫面,如同其他語言中的參數至程序。 你只能從一個畫面參考它。 |
UpdateContext Navigate |
建立和移除變數
當變數出現在 Set、 UpdateContext、 Navigate、 Collect 或 ClearCollect 函式時,你都會隱含地建立它們。 若要宣告變數及其類型,只需將變數包含在應用程式中任何位置的任何這些函數中即可。 這些函數都不會建立變數;它們只會把值填入變數。 您絕不能像在另一個程式工具中那樣,明確地公布變數,而且所有輸入都是隱式的用法。
例如,您可能有一個按鈕控制項,其中有一個 OnSelect公式等於 Set( X, 1 )。 此公式會將 X 建立為數字類型的變數。 您可以在公式中使用 X 作為數字,且在您打開應用程式之後,但選取按鈕之前,該變數的值會是空白。 當您選取按鈕時,會為 X 指定值 1。
如果您新增另一個按鈕,並將其 OnSelect 屬性設定為 Set( X, “Hello” ) ,則會發生錯誤,因為類型 (文字字串) 不符合前一個 Set (數字) 中的類型。 變數的所有隱式定義必須在類型上達成一致。 再說一次,這一切都是因為你在公式中提到 X ,而不是因為那些公式真的執行過。
移除所有隱式建立變數的 Set、UpdateContext、Navigate、Collect 或 ClearCollect 函式,就能移除變數。 沒有這些函式,變數就不存在。 你也必須移除所有對變數的引用,因為它們會造成錯誤。
變數存留時間與初始值
應用程式執行時會將所有變數保存在記憶體中。 應用程式關閉後,保留在變數中的值就會遺失。
您可以使用 Patch 或 Collect 函式,將變數的內容儲存到資料來源 。 您也可以使用 SaveData 函式,在本機裝置上儲存集合中的值 。
當使用者打開應用程式時,所有變數的初始值均為空白。
讀取變數
使用變數的名稱來讀取其值。 例如,您可以使用此公式定義變數:
Set( Radius, 12 )
接著你可以在任何能用數字的地方用半 徑 ,然後用 12 替代:
Pi() * Power( Radius, 2 )
如果給內容變數的名稱與全域變數或集合的名稱相同,則內容變數具有優先權。 不過,如果您使用消除歧義運算子[@Radius],您仍可以參考全域變數或集合。
使用內容變數 (僅限 Power Apps)
以下是如何用上下文變數而非全域變數來建立加法機的方法。
內容變數的運作方式︰
- 使用 UpdateContext 或 Navigate 函數可隱式建立和設定內容變數。 當應用程式開啟時,所有內容變數的初始值均為空白。
- 您可以使用記錄來更新內容變數。 在其他的程式設計工具,您通常使用「=」來指定賦值,如「x = 1」。 在內容變數中,則改用 { x: 1 }。 當您使用內容變數時,請直接使用它的名稱,而不需要有記錄語法。
- 當您使用 Navigate 函數來顯示畫面時,您也可以使用內容變數。 如果您將畫面視為一種程序或副常式,這方法就類似於其他程式設計工具中傳遞的參數。
- 除了 Navigate,內容變數僅限於單一畫面的內容,也就是他們取得其名稱之處。 您無法在此內容之外使用或設定它們。
- 內容變數可以保留任何值,包括字串、數字、記錄和資料表。
讓我們使用內容變數來重建我們的加法器︰
新增名為 TextInput1 的文字輸入控制項,和名為 Button1 和 Button2 的兩個按鈕。
將 Button1 的 Text 屬性設為 "Add",並將 Button2 的 Text 屬性設為 "Clear"。
每當使用者選取新增按鈕時若要更新計算加總,將其 OnSelect 屬性設為以下公式︰
更新上下文( { RunningTotal: RunningTotal + TextInput1.Text } )
由於使用 運算子,僅此公式的存在就會讓 + 確立為保存數值的內容變數。 您可以在畫面中任何地方參考 RunningTotal。 每當使用者打開此應用程式時,RunningTotal 的初始值均為空白。
當使用者第一次選取新增按鈕且 UpdateContext 執行時,RunningTotal 會設定為值 RunningTotal + TextInput1。
每當使用者選取清除按鈕時若要將計算加總設為 0,將其 OnSelect 屬性設為以下公式︰
UpdateContext({ RunningTotal: 0 })
同樣地,UpdateContext 會與 UpdateContext( { RunningTotal: 0 } ) 公式搭配使用。
新增標籤控制項,並將其 Text 屬性設定為 RunningTotal。
此公式會自動重新計算並顯示 RunningTotal 的值,並根據使用者選擇的按鈕調整。
預覽應用程式後,你就有了前面描述的加法機。 在文字方塊中輸入數字,然後按新增按鈕數次。 準備好後,使用 Esc 鍵回到創作體驗。
瀏覽至畫面時,可以設定內容變數的值。 此技術有助於將「上下文」或「參數」從一個螢幕傳遞到另一個螢幕。 若要示範此技術,請插入畫面、插入按鈕,並將其 OnSelect 屬性設定為此公式:
Navigate(Screen1,None,{ RunningTotal:-1000 })
按住 Alt 鍵同時選擇這個按鈕,同時顯示 Screen1 並將上下文變數 RunningTotal 設為 -1000。
若要顯示內容變數的值,請選取檔案功能表,然後在左側窗格中選取變數。
選擇上下文變數,看看它在哪裡被定義和使用。
使用集合
最後,讓我們看看以集合建立加法器的方式。 由於一個集合包含一張你可以輕易修改的表格,這台加法機會在你輸入每個值時保存一張「紙帶」。
集合的運作方式︰
- 使用 ClearCollect 功能來建立和設定集合。 你可以改用 Collect 功能,但實際上需要另一個變數,而不是替換舊變數。
- 集合是一種資料來源,因此是資料表。 若要存取集合中的單一值,請使用 First 函數,然後從產生的記錄中擷取一個欄位。 如果你在 ClearCollect 中使用單一值,這個值就是 Value 欄位,如本範例所示:
First(VariableName).Value
讓我們使用集合重新建立我們的加法器︰
新增名為 TextInput1 的文字輸入控制項,和名為 Button1 和 Button2 的兩個按鈕。
將 Button1 的 Text 屬性設為 "Add",並將 Button2 的 Text 屬性設為 "Clear"。
每當使用者選取新增按鈕時若要更新計算加總,將其 OnSelect 屬性設為以下公式︰
收集( PaperTape, TextInput1.Text )
此公式的光是存在就會將PaperTape建立為保留單一資料行資料表中文字字串的集合。 您可以在應用程式中的任何地方參考PaperTape。 每當使用者打開此應用程式時,PaperTape都是空白資料表。
當此公式執行時,會將新值新增至集合結尾。 因為你只新增一個值, Collect 會自動將其放入單欄資料表,欄位名稱為 Value,之後會用這個名稱。
若要在使用者選取清除按鈕時清除紙帶,請將其 OnSelect 屬性設為以下公式︰
透明( 紙帶 )
若要顯示總計,請新增標籤,並將其 Text 屬性設定為下列公式:
Sum( PaperTape, 數值 )
若要執行加法器,請按下 F5 鍵開啟「預覽」,並在文字輸入控制項中輸入數字,然後選取按鈕。
要回到預設工作區,請按 Esc 鍵。
若要顯示紙帶,請插入資料表格控制項,並將其 Items 屬性設為以下公式:
PaperTape
在右側窗格中,選取編輯欄位,然後選取新增欄位,選取值欄,然後選取新增以顯示。
若要查看您集合中的值,請選取檔案功能表上的集合。
若要儲存和擷取集合,請新增兩個額外的按鈕控制項,並將它們的 Text 屬性設為 Load 和 Save。 將載入按鈕的 OnSelect 屬性設為此公式:
清除( 紙帶 );載入資料( 紙帶, “StoredPaperTape”, true )
您需先清除集合,因 LoadData 會將儲存值附加至集合結尾。
將儲存按鈕的 OnSelect 屬性設為以下公式:
SaveData( PaperTape, “StoredPaperTape” )
再次預覽時,按下 F5 鍵,輸入文字輸入數字,然後選擇按鈕。 選取儲存按鈕。 關閉並重新載入應用程式,然後選取載入按鈕以重新載入集合。