瞭解畫布應用程式中的記錄參照和多態查詢
當您在學校撰寫研究論文時,您可能會在結尾提供參考資料清單。 您並未納入您所使用之背景資料的實體複本,而只是網頁連結、書名和作者或其他資訊,讓其他人可以追蹤搜尋原始來源。 您在單一清單中混用不同種類的來源,把報紙文章放在音訊錄音檔旁邊,其中每個都有自己的特定詳細資料以取得正確的引文。 例如,維基百科文章通常包括很長的參考資料清單 。
在畫布應用程式中,您通常會使用從資料來源下載的記錄複本。 您可以使用 LookUp 和 Filter 函式以及 資源庫控制項的 Selected 屬性來標識所需的特定記錄。 篩選器或已選擇中的所有記錄都將具有相同的表格類型,因此您可以使用帶有簡單欄位符號的欄位。 這些複本通常包含參考資訊,因此您可以使用 Patch 函式來更新原始來源。.
畫布應用程式也支援 記錄參照。 就像研究論文的參考資料一樣,記錄參照是指不包含完整文本的記錄。 這樣的參考資料可以參考任何表格中的記錄。 與研究論文參考文獻一樣,您可以將來自不同表格的記錄混合在一個資料列中。
許多操作記錄參照的方式與處理記錄完全相同。 您可以比較不同記錄參照之間和比較紀錄參考和完整記錄。 您可以使用 Patch 函式來設定記錄參照的值,就像使用完整記錄進行查詢一樣。
有一個重要的用法區別:您不能直接存取記錄參考的欄位,而無需先建立所參考的表格。 這是因為當您撰寫公式時,畫布應用程式要求所有類型都是已知。 因為您在執行應用程式之前不知道記錄參照的類型,所以您無法直接使用簡單的 .Field 標記法。 您必須先使用 IsType 函數,動態確認表格類型,然後在 AsType 函數的結果中使用 .Field 標記。
表格類型是指表格中每條記錄的結構描述。 各種表格都有一組不同名稱和資料類型的唯一欄位。 表格的每條記錄都繼承了該結構;如果兩則記錄來自同一個表格,則具有相同的表格類型。
注意
您可以從許多不同的連接器中進行選擇,以連接到畫布應用程式的不同類型資料來源。 但是,在 Power Apps Studio 中使用畫布應用程式時,Microsoft Dataverse 中的資料欄被稱為欄位,類似於所有其他資料來源。 資料欄僅在參考 Dataverse 中的資料列時使用。 更多資訊:Dataverse 術語更新
多態查詢
Microsoft Dataverse 支援記錄間的關聯。 帳戶表格中的每條記錄都有一個 Primary Contact 查詢列於連絡人表格中的一條記錄中。 查詢只能引用連絡人中的記錄,而不能參考 Teams 表格中的記錄。 最後一個細節很重要,因為您隨時都能知道哪些資料列可用於查詢。
Dataverse 也支持多態查詢,可以引用集合中任何表格中的記錄。 例如,負責人資料欄可以引用使用者表格或 Teams 表格中的記錄。 不同記錄中的相同查詢資料欄可以引用不同表格中的記錄。 在這種情況下,您並非隨時都能知道哪些資料列可用。
畫布記錄參照是設計用來在 Dataverse 中使用多態查詢。 您也可以使用此內容以外的記錄參照,這就是兩種概念有何不同。
在下一個區段中,您將開始使用負責人查詢來探索這些概念 。
顯示記錄負責人的資料欄
Dataverse 中的每個表格都包含一個負責人資料欄。 此資料欄無法刪除,也無法新增其他資料列,並且始終需要一個值。
如果要在帳戶表格中顯示該資料欄:
登入 Power Apps。
在左側窗格欄中,選擇資料 > 表格。
在表格清單中,選擇帳戶。
在右上角,打開篩選清單(預設設定為預設值),然後選取全部。
向下捲動,直到出現負責人資料欄。
此查詢資料欄可以參考 Teams 表格或使用者表格中的記錄。 並非這些表格中的每則記錄都有權成為擁有者;如果遇到問題,請檢查支持的角色。
此圖表顯示了帳戶的簡單資料庫,其中帳戶表格已作為資料來源新增至應用程式中:
重要
在此主題中,圖解會顯示一些名稱和其他值,這些並不屬於 Dataverse 隨附的範例資料。 步驟會準確地示範如何針對特定結果設定控制項,但是您的體驗會隨組織的資料而有所不同。
若要在資源庫中顯示每個帳戶的負責人,您可能會想要使用 ThisItem.Owner.Name 公式。 不過,Team 表格中的名稱欄位是 Team Name,而 User 欄位中的名稱表格是 Full Name。 在執行該應用程式前,應用程式無法知道您正在使用哪種類型的查詢,並且它可能因 Accounts 表格中的記錄而異。
您需要可適用於此變異數的公式。 您也需要為 Owner 的表格類型 (在本範例中為 Users 和 Teams) 新增資料來源。 將這三個資料來源新增至您的應用程式:
當這些資料都就定位後,請使用此公式來顯示使用者或團隊的名稱:
If( IsType( ThisItem.Owner, Teams ),
"Team: " & AsType( ThisItem.Owner, Teams ).'Team Name',
"User: " & AsType( ThisItem.Owner, Users ).'Full Name' )
在此公式中,IsType 函數根據 Teams 表格測試 Owner 欄位。 如果是該表格類型,AsType 函數會將其轉換為 Team 記錄。 此時,您可以使用 .Field 標記存取 Teams 表格的所有欄位,包括 Team Name。 如果 IsType 決定 Owner 並非 Teams 表格中的紀錄,則欄位必須是 Users 表格中的紀錄,因為 Owner 欄位為必要 (並非空白)。
若要使用記錄參考的任何欄位,您必須首先使用 AsType 函數將其轉換為特定的表格類型。 您無法直接從 Owner 欄位存取欄位,因為系統不知道您要使用哪種表格類型。
如果 Owner 欄位與要求的表格類型不匹配,AsType 函數將傳回錯誤,因此您可以使用 IfError 函數來簡化此公式。 首先,打開實驗性功能公式層級錯誤管理:
然後以下列公式取代先前的公式:
IfError(
"Team: " & AsType( ThisItem.Owner, Teams ).'Team Name',
"User: " & AsType( ThisItem.Owner, Users ).'Full Name' )
根據負責人進行篩選
恭喜,您已完成使用記錄參照環節中最難的部分。 其他使用案例更為直接,因為它們不會存取記錄的欄位。 篩選是個很適合的案例,能讓您探索本節。
在資源庫上方新增一個組合方塊控制項,並設定新控制項的這些屬性:
- Items:
Users
- SelectMultiple:
false
若要依據您在此組合方塊中所選取的特定使用者來篩選該資料庫,請將該庫的 Items 屬性設為此公式:
Filter( Accounts, Owner = ComboBox1.Selected )
重要
如果您完全遵循步驟,則本主題中的指示是正確的。 但是,如果該控制項有不同的名稱,則任何依名稱參考該控制項的公式都會失敗。 若您刪除並新增相同類型的控制項,控制項名稱結尾的數字會變更。 如果任何公式顯示錯誤,請確認它包含所有控制項的正確名稱。
您不需要使用 IsType 或 AsType,因為您正在比較不同的記錄參照或與完整記錄相比較。 此應用程式知道 ComboBox1.Selected 的表格類型,因為其衍生自 Users 表格。 負責人若為團隊的帳戶將不符合篩選準則。
想要花俏一點的話,您可以透過使用者或團隊支援篩選。
讓我們透過調整資源庫和移動組合方塊,在畫面頂端附近清出一些空間,並將單選控制項插到資源庫上方,然後為新控制項設定這些屬性:
- Items:
[ "All", "Users", "Teams" ]
- Layout:
Layout.Horizontal
- Items:
針對組合方塊控制項,請設定此屬性(如果組合方塊消失,請在單選控制項中選取使用者):
- Visible:
Radio1.Selected.Value = "Users"
- Visible:
複製並貼上組合方塊控制項,直接將複本移至原始控制項上方,然後為複本設定這些屬性:
- Items:
Teams
- Visible:
Radio1.Selected.Value = "Teams"
根據單選控制項的狀態而定,應用程式一次只會顯示一個組合方塊。 因為它們就在彼此正上方,所以它們看起來就是變更內容的相同控制項。
- Items:
最後,將資源庫控制項的 Items 屬性設定為此公式︰
Filter( Accounts, Radio1.Selected.Value = "All" Or (Radio1.Selected.Value = "Users" And Owner = ComboBox1.Selected) Or (Radio1.Selected.Value = "Teams" And Owner = ComboBox1_1.Selected) )
有了這些變更,您就可以顯示所有的記錄,或根據使用者或團隊來篩選它們:
公式是完全可委派的。 比較單選按鈕值的部分在所有記錄中都是常量,並在篩選的其餘部分傳送至 Dataverse 之前進行評估。
如果您想要篩選負責人的類型,您可以使用 IsType 函式,但是這還不能委派。
使用 Patch 更新負責人
您可以用在任何其他查詢一樣的方式來更新負責人欄位。 若要將目前選取的帳戶負責人設定為第一個團隊:
Patch( Accounts, Gallery1.Selected, { Owner: First( Teams ) } )
此方法和一般查詢沒什麼不同,因為應用程式知道第一個(團隊) 的類型。 如果您要改為第一個使用者,請將該部分替換為第一個(使用者)。 Patch 函數知道 Owner 欄位可以設置為這兩種表類型中的任何一種。
若要將此功能新增至應用程式:
在樹狀檢視窗格中,同時選取單選控制項和兩個組合方塊控制項。
在省略號功能表中,選取複製這些項目。
在同樣的功能表上,選取貼上。
將複製的控制項移至資源庫的右側。
選取複製的單選控制項,然後變更這些屬性:
- Items:
[ "Users", "Teams" ]
- 預設:
If( IsType( Gallery1.Selected.Owner, Users ), "Users", "Teams" )
- Items:
在單選控制項中,選取使用者,讓條列出使用者的組合方塊控制項能被看到。
選取看到的組合方塊控制項,然後將 DefaultSelectedItems 屬性設定為此公式:
If( IsType( Gallery1.Selected.Owner, Users ), AsType( Gallery1.Selected.Owner, Users ), Blank() )
在單選控制項中,選取團隊,讓條列出團隊的組合方塊控制項能被看到。
選取單選控制項以選取現在使用者看不到的組合方塊控制項以外的項目。
選取團隊看到的組合方塊控制項,然後將其 DefaultSelectedItems 屬性設定為此公式:
If( IsType( Gallery1.Selected.Owner, Teams ), AsType( Gallery1.Selected.Owner, Teams ), Blank() )
插入按鈕控制項,並將它移至組合方塊控制項底下,然後將按鈕的 Text 屬性設定為
"Patch Owner"
。將按鈕的 OnSelect 屬性設為此公式:
Patch( Accounts, Gallery1.Selected, { Owner: If( Radio1_1.Selected.Value = "Users", ComboBox1_2.Selected, ComboBox1_3.Selected ) } )
複製的單選和組合方塊控制項,會顯示資源庫中目前選取之帳戶的負責人。 使用相同的控制項,您可以選取按鈕,將帳戶的負責人設定為任何團隊或使用者:
使用表單來顯示負責人
您可以新增自訂卡片,在表單中顯示負責人欄位。 在撰寫本文時,您無法使用表單控制項來變更欄位的值。
插入編輯表單控制項,然後調整其大小,並將它移至右下角。
在畫面右邊的屬性索引標籤上 ,打開資料來源清單,然後選取帳戶。
將表單的 Items 屬性設為
Gallery1.Selected
。在靠近畫面右側的屬性索引標籤上,選取編輯欄位。
在欄位窗格中,選取省略號,然後選取新增自訂卡片。
新的卡片會出現在表單控制項的下方。
視需要調整卡片大小,以顯示所有文字。
將標籤控制項插入自訂卡片,然後將標籤的 Text 屬性設定為您在資源庫中使用的公式:
If( IsType( ThisItem.Owner, Teams ), "Team: " & AsType( ThisItem.Owner, Teams ).'Team Name', "User: " & AsType( ThisItem.Owner, Users ).'Full Name' )
針對資源庫中的每項選取,更多的帳戶欄位 (包括該記錄的負責人) 會出現在表單中。 如果您使用修補程式按鈕變更負責人,則表單控制項也會顯示這種變更。
顯示客戶的資料欄
在 Dataverse 中, Customer 查詢資料欄是另一個與 Owner 非常相似的多態查詢。
Owner 限制為每個表格一個,但表可以包含零個、一個或多個 Customer 查詢資料欄。 連絡人系統表包括公司名稱資料欄,這是一個客戶查詢資料欄。
透過為新資料欄選擇 Customer 資料類型,您可以向表格中新增更多 Customer 查詢資料欄。
Customer 查詢欄位可以參考 Accounts 表格或 Contacts 表格。 您將對這些表格使用 IsType 和 AsType 函數,因此現在是將它們新增為資料來源的好時機 (您可以保留 Teams 和 Users 到位)。
客戶與負責人欄位的處理方式非常類似,您真的可以複製應用程式(檔案 > 另存為,然後指定不同的名稱),並進行下列簡單的替換就好:
地點 | 負責人範例 | 客戶範例 |
---|---|---|
全境 | 負責人 | '客戶名稱' |
全境 | 使用者 | 客戶 |
全境 | 團隊 | 連絡人 |
資源庫的 Items 屬性 | 客戶 | 連絡人 |
表單的 Items 屬性 | 客戶 | 連絡人 |
修補程式的第一個引數 在按鈕的 OnSelect 屬性中 |
客戶 | 連絡人 |
篩選單選的 Items 屬性 | [ "All", "Users", "Teams" ] | [ "All", "Accounts", "Contacts" ] |
修補單選的 Items 屬性 | [ "Users", "Teams" ] | [ "Accounts", "Contacts" ] |
組合方塊的 Visible 屬性 | "Users" 和 "Teams" | "Accounts" 和 "Contacts" |
例如,新的資源庫應具有此 Items 屬性:
Filter( Contacts,
Radio1.Selected.Value = "All"
Or (Radio1.Selected.Value = "Accounts" And 'Company Name' = ComboBox1.Selected)
Or (Radio1.Selected.Value = "Contacts" And 'Company Name' = ComboBox1_1.Selected)
)
客戶與負責人之間的兩個重要差異需要更新資源庫及表單中的公式:
當您按照名稱參考這些表格類型時,Accounts 和 Contacts 之間的一對多關係優先。 請使用 [@Accounts],而不是 Accounts;請使用**[@Contacts]**,而不是 Contacts。 使用全域消歧運算子,您就能確保您參考 IsType 和 AsType 的表格類型。 這個問題只存在於資源庫和表單控制項的記錄上下文中。
負責人欄位必須有一個值,但客戶欄位可以是空白。 若要在不使用類型名稱的情況下顯示正確的結果,請使用 IsBlank function 測試此案例,並改為顯示空白文字字串。
這兩個變更都在相同的公式中,會出現在表單的自訂卡片中,以及資源庫標籤控制項的 Text 屬性中。
If( IsBlank( ThisItem.'Company Name' ), "",
IsType( ThisItem.'Company Name', Accounts ),
"Account: " & AsType( ThisItem.'Company Name', Accounts ).'Account Name',
"Contact: " & AsType( ThisItem.'Company Name', Contacts ).'Full Name'
)
透過這些變更,您就能查看並變更 Contacts 表格中的 Company Name 欄位。
了解相關查詢資料欄
相關查詢資料欄與您在本主題中已經使用過的查詢資料列略有不同。 您將先套用本主題之前描述的模式,然後再學習其他技巧。
您可以從 Faxes 表格開始。 表格有一個多態的相關查詢欄位,可以引用客戶、連絡人和其他表格。 您可以參考客戶的應用程式,並將其修改為傳真。
地點 | 客戶範例 | 傳真範例 |
---|---|---|
全境 | '客戶名稱' | 相關 |
資源庫的 Items 屬性 | 連絡人 | 傳真 |
表單的 Items 屬性 | 連絡人 | 傳真 |
修補程式的第一個引數 在按鈕的 OnSelect 屬性中 |
連絡人 | 傳真 |
再一次,您又需要新增資料來源:這次是為了傳真。 在檢視索引標籤上,選取資料來源:
相關的重要區別在於它不局限於客戶和連絡人。 事實上,表格清單可透過自訂表格進行擴展。 大部分的應用程式都可以不經修改就接受此點,但是您必須更新資源庫標籤及表單的公式:
If( IsBlank( ThisItem.Regarding ), "",
IsType( ThisItem.Regarding, Accounts ),
"Account: " & AsType( ThisItem.Regarding, Accounts ).'Account Name',
IsType( ThisItem.Regarding, Contacts ),
"Contacts: " & AsType( ThisItem.Regarding, Contacts ).'Full Name',
""
)
在您進行這些變更之後,您可以像處理負責人和客戶查詢一樣,使用相關查詢。
瞭解相關關係
相關與負責人和客戶不同,因為前者涉及多對一關係。 根據定義,反向和一對多關係允許您撰寫 First( Accounts ).Faxes。
讓我們備份並查看表格定義。 在 Dataverse 中,Faxes、Tasks、Emails、Notes、Phone Calls、Letters 和 Chats 等表格被指定為活動。 您也可以建立專屬的自訂活動表格。 當您查看或建立活動表格時,其設定會顯示在更多設定下。
如果其他表格在表格的設定中作為活動工作啟用,則可以與活動表相關。 Accounts、Contacts和許多其他標準表格都是如此指定的 (再次提醒,要在 More settings 之下)。
所有活動表格和活動工作表格都具有隱含關係。 如果將畫面頂部的篩選器變更為 All,請選擇 Faxes 表格,然後選擇 Relationships 選項卡片,將所有可以作為目標的表格 Regarding 查詢出現。
如果您顯示了 Accounts 表格的關係,所有可以作為 Regarding 查詢欄位來源的表格都會出現。
這全部代表什麼意思?
- 在編寫公式時,您必須考慮到活動表的清單不是固定的,您可以建立專屬活動表。 此公式必須適當地處理您沒有預料到的活動表。
- 活動工作和活動具有一對多關係。 您可以輕易地要求所有與帳戶有關的傳真。
若要在應用程式中探索此概念:
新增其他畫面。
插入資源庫控制項、調整它的大小,然後將它移至畫面的左側。
在畫面右邊附近的屬性索引標籤上 ,將資源庫的項目設為帳戶。
將資源庫的版面配置設定為標題,然後將標題欄位設定為帳戶名稱。
新增第二個資源庫、調整它的大小,然後將它移至畫面的右側。
將新資源庫的 Items 屬性設為
Gallery2.Selected.Faxes
。此步驟會為給定的帳戶傳回篩選過的傳真清單。
將資源庫的版面設定為標題和副標題,然後設定標題欄位以顯示主旨欄位(可能為小寫主旨)。
當您在帳戶清單中選取一個項目時,傳真清單只會顯示該帳戶的傳真。
活動表格
如前一節所述,您可以顯示某個帳戶的所有傳真。 但是,您也可以顯示某個帳戶的所有活動,包括傳真、電子郵件訊息、通話及其他互動。
對於第二種情況,您要使用 Activity 表格。 您可以透過開啟右上角的 All,從表格清單中刪除篩選器來顯示此表格。
活動表格是特別的。 每當您向 Faxes 表格新增一條記錄時,系統也會在 Activity 表格中建立一則記錄,其中資料欄在所有活動表中都是通用的。 在這些資料欄中,Subject 是最有趣的資料欄之一。
您可以透過只變更前一個範例中的一行,就可以顯示所有活動。 把 Gallery2.Selected.Faxes
替換為 Gallery2.Selected.Activities
。
記錄來自 Activity 表格,但您仍然可以使用 IsType 函數來識別它們是哪種類型的活動。 同樣地,在表格類型使用 IsType 前,必須新增資料來源。
透過使用此公式,您可以在資料庫中的標籤控制項上顯示記錄類型:
If( IsType( ThisItem, Faxes] ), "Fax",
IsType( ThisItem, 'Phone Calls' ), "Phone Call",
IsType( ThisItem, 'Email Messages' ), "Email Message",
IsType( ThisItem, Chats ), "Chat",
"Unknown"
)
您也可以使用 AsType 來存取特定類型的欄位。 例如,此公式會決定各種活動的類型,對於電話,會顯示 Phone Numbers 表格中的電話號碼和呼叫方向:
If( IsType( ThisItem, Faxes ), "Fax",
IsType( ThisItem, 'Phone Calls' ),
"Phone Call: " &
AsType( ThisItem, 'Phone Calls' ).'Phone Number' &
" (" & AsType( ThisItem, 'Phone Calls' ).Direction & ")",
IsType( ThisItem, 'Email Messages' ), "Email Message",
IsType( ThisItem, Chats ), "Chat",
"Unknown"
)
因此,應用程式會顯示完整的活動清單。 所有類型的活動都會顯示主旨欄位,不論公式是否將它們考慮為帳戶。 對於您所知道的活動類型,您可以顯示每個活動的類型名稱和類型特定資訊。
備註表
到目前為止,所有 Regarding 範例都以活動為基礎,但 Notes 表格代表了另一種情況。
當您建立表格時,可以啟用附件。
如果選擇啟用附件的核取方塊,您將建立與 Notes 表格相關的關係,如下圖所示為 Accounts 表格:
除了這種差異之外,您使用相關查詢的方式和使用活動的方式相同。 為附件啟用的表格與 Notes 具有一對多關係,如下例所示:
First( Accounts ).Notes
注意
在撰寫本文時,Regarding 查詢不適用於 Notes 表格。 無法根據 Regarding 資料欄讀取或篩選,也無法使用 Patch 設置資料欄。
不過,您可以使用相反的備註一對多關係,這樣就可以為已啟用附件的記錄篩選一份備註清單。 您也可以使用 Relate 函式,將備註新增至記錄的備註表格,但是必須先建立備註,如下列範例所示:
Relate( ThisItem.Notes, Patch( Notes, Defaults( Notes ), { Title: "A new note" } ) )
活動當事人
到撰寫此刻為止,畫布應用程式不支援活動當事人。