AsType 和 IsType 函式
適用於:畫布應用程式
模型導向應用程式
Power Pages
Power Platform CLI
檢查記錄參考是否為特定資料表類型 (IsType) 並將該參考視為該類型 (AsType)。
注意
PAC CLI pac power-fx 指令不支援 IsType。
Description
AsType 和 IsType 函數可用於將記錄參考 (例如 Dataverse 中的多態查詢) 和非類型化物件轉換為可直接使用的類型化物件。
記錄參考
閱讀 瞭解記錄參考和多態查閱 以取得更廣泛的簡介及更多詳細資料。
查詢欄位通常是指特定資料表中的記錄。 因為資料表類型已經建立,所以使用簡單的點符號就可以存取尋找的欄位。 例如,First( Accounts ).'Primary Contact'.'Full Name' 從帳戶資料表到連絡人資料表中主要連絡人記錄,然後擷取全名欄位。
Microsoft Dataverse 也支援多型查詢欄位,這類查詢欄位可以參考一組資料表中的記錄,如以下範例中所示。
查詢欄位 | 可參閱 |
---|---|
所有人 | 使用者 或 團隊 |
客戶 | 帳戶 或 連絡人 |
相關 | 帳戶、連絡人、知識文章 等。 |
在畫布應用程式公式中,使用記錄參考來處理多型查詢。 由於記錄參考可以參考不同的表,因此在編寫公式時不清楚執行階段哪些欄位可用。 Record.Field 標記法不可用。 那些公式必須適應當應用程式執行時遇到的記錄。
IsType 函數測試記錄參考是否指向特定的資料表類型。 此函數傳回布林值 TRUE 或 FALSE。
AsType 函數將記錄參考視為特定的資料表類型,也稱為轉換。 您可以將結果當作資料表記錄使用,然後再次使用 Record.Field 標記法存取該記錄的所有欄位。 如果參考不是特定類型,就會發生錯誤。
將這些函數一起使用,以先測試記錄的資料表類型,然後將其視為該類型的記錄,這樣就可以使用欄位:
If( IsType( First( Accounts ).Owner, Users ),
AsType( First( Accounts ).Owner, Users ).'Full Name',
AsType( First( Accounts ).Owner, Teams ).'Team Name'
)
僅當存取記錄參考的欄位時才需要這些函數。 例如您可以在 Filter 函數中使用不含 IsType 或 AsType 的記錄參考:
Filter( Accounts, Owner = First( Users ) )
同樣地,您可以使用含有 Patch 函數的記錄參考:
Patch( Accounts, First( Accounts ), { Owner: First( Teams ) } )
當在記錄上下文中使用時 (例如在 Gallery 或 Edit 表單控制項中),可能需要全域消歧運算子來參考資料表類型。 例如此公式對顯示 Company Name 是 Customer 查閱的連絡人清單資源庫有效:
If( IsType( ThisItem.'Company Name', Accounts ),
AsType( ThisItem.'Company Name', Accounts ).'Account Name',
AsType( ThisItem.'Company Name', Contacts ).'Full Name'
)
對於這兩個函數,透過連接到資料表的資料來源的名稱指定類型。 若要讓公式運作,您也必須將資料來源新增至要測試或強制轉換的任何類型應用程式。 例如,如果您想將 IsType 和 AsType 與 Owner 查詢和該資料表中的記錄一起使用,則必須新增使用者資料表做為資料來源。 您只能新增您在應用程式中實際使用的資料來源;您不需要新增查詢所參考的所有表格。
如果記錄參考為 空白,ISTYPE 會傳回 FALSE,而 AsType 會返回 空白。 空白記錄的所有欄位也均為空白。
非類型化物件
重要
- 對非類型化物件使用 AsType 和 IsType 是一項實驗性功能。
- 實驗性功能並非供生產使用,也可能不完整。 這些功能是在正式發行前先行推出,讓您能夠搶先體驗並提供意見反應。 其他資訊:了解畫布應用程式中的實驗性、預覽及已淘汰功能
- 只有在使用者定義型別實驗性功能已於設定 > 即將推出的功能 > 實驗性中開啟 (預設為關閉狀態) 時,才能使用本文所述的行為。
- 您的意見反應對我們很有價值。 在 Power Apps 實驗性功能社群論壇中告訴我們您的想法。
來自 Web API 或 [ParseJSON 函數] 的非類型化物件需要轉換為類型化對象,然後才能在 Power Fx 中使用。 執行此操作的選項包括:
- 在使用欄位時隱式地輸入欄位。 例如,如果物件與
+
運算子一起使用,並且可以轉換為數字,則物件將轉換為數字。 此選項可能會發生意外的轉換,並且無法整體轉換記錄和表。 - 使用 Decimal、Text、DateTime、GUID 和其他類型建構函數明確地輸入每個欄位。 這對您的公式來說是最具侵入性的,因為每個欄位都必須單獨完成。
- 使用 ParseJSON 函數的第二個參數明確輸入 JSON。 這是一個簡單的選項,可以避免需要無類型物件。
- 使用 AsType 函數明確輸入非類型化物件。 您也可以在嘗試使用 IsType 函數進行轉換之前測試類型。
語法
AsType (RecordReference、TableType)
- RecordReference - 必要項目。 記錄參考通常是查詢欄位,可參考任何多資料表中的記錄。
- TableType - 必要。 記錄應轉換到的特定資料表。
AsType ( UntypedObject, TypeSpecification )
- UntypedObject - 必需。 記錄參考通常是查詢欄位,可參考任何多資料表中的記錄。
- TypeSpecification - 必需。 使用 Type 函數定義的類型名稱或類型規格。
IsType (RecordReference、TableType)
- RecordReference - 必要項目。 記錄參考通常是查詢欄位,可參考任何多資料表中的記錄。
- TableType - 必要。 要測試的特定資料表。
IsType( UntypedObject,TypeSpecification )
- UntypedObject - 必需。 記錄參考通常是查詢欄位,可參考任何多資料表中的記錄。
- TypeSpecification - 必需。 使用 Type 函數定義的類型名稱或類型規格。
範例
記錄參考
瞭解記錄參考和多態查閱 包含大量範例。
為平板電腦建立空白的畫布應用程式。
在左窗格中,選取資料>新增資料。 然後新增帳戶和連絡人資料表。
在左窗格中,選取 + (插入) >版面配置>空白垂直資源庫。
選取連接至資料,然後選取連絡人做為資料來源。
將資源庫的版面配置設定為 標題和副標題。
在 Data 窗格中,開啟 Title1 清單,然後選取 Full Name。
選取 Subtitle1 label 控制項。
將 Subtitle1 的 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' )
資源庫中的字幕顯示這些值:
- "--" 如果 'Company Name' 為 空白。
- 如果公司名稱欄位參考帳戶,則為「帳戶:」,然後是帳戶資料表中的帳戶名稱欄位。
- 如果公司名稱欄位參考連絡人,則為「連絡人:」,然後是連絡人資料表中的全名欄位。
您的結果可能會有所不同,因為樣本資料可能已被修改以顯示更多類型的結果。
無類型對象
以下範例展示了 Pac CLI Power Fx REPL 中的 ParseJSON、AsType 和 IsType 以各種方式解釋的簡單 JSON 記錄。
在第一個例子中,沒有向 ParseJSON 提供類型資訊,因此它傳回一個無類型物件。
>> Set( rec, ParseJSON( "{""a"":1}" ) )
rec: <Untyped: Use Value, Text, Boolean, or other functions to establish the type>
在數字上下文中使用時,該欄位會隱式轉換為數字。
>> 1 + rec.a
2
作為替代方案,此範例使用 ParseJSON 的第二個參數將記錄明確轉換為類型化的 Power Fx 記錄
>> ParseJSON( "{""a"":1}", Type( {a: Number} ) )
{a:1}
另一種選擇是,此範例使用 AsType 明確將記錄轉換為類型 Power Fx 記錄。
>> AsType( ParseJSON( "{""a"":1}" ), Type( {a: Number} ) )
{a:1}
最後,如果我們不確定,此範例會在使用 IsType 函數轉換類型之前測試該類型。
>> IsType( ParseJSON( "{""a"":1}" ), Type( {a: Number} ) )
true