資料分析運算式 (DAX) 使用者定義函數 (UDF) 可讓您將可重複使用的參數化 DAX 邏輯封裝到模型中,讓您的 DAX 程式碼更易於撰寫、維護和共用。 UDF 不會跨量值、計算資料行和視覺效果重複公式,而是為您的語意模型帶來程式設計樣式的彈性,讓您定義一次函式,並在支援 DAX 的任何地方使用它們。
DAX UDF自2026年6月版本起,通常可在Power BI Desktop及Power BI服務中取得。 若要深入瞭解,請參閱 DAX 使用者定義函式。
為什麼要使用使用者定義函數?
- 可重複使用性和一致性:定義一次計算,即可在任何地方重複使用。
- 可維護性:在一個地方更新邏輯以修復或演進規則。
- 更安全的編寫:選擇性類型提示和類型檢查協助程式支援可預測的防錯程式碼。
- 第一類模型物件:UDF 位於模型中,可在模型總管中檢視。
定義函數
你可以在 Power BI Desktop 中透過 DAX 查詢視圖(DQV)、TMDL 視圖或模型視圖來定義使用者自訂函式。 你也可以透過 Power BI 服務的網頁建模,在瀏覽器中查看和編輯 UDF。
一般語法
UDF 的一般語法為:
/// Optional description above the function
/// @param {ParameterType} ParameterName - ParameterDescription
/// ...
/// @returns Return description
FUNCTION <FunctionName> = ( [<ParameterName> [: [<ParameterType>] [<ParameterSubtype>] [<ParameterPassingMode>]] [= <DefaultExpression>], ...] ) => <FunctionBody>
範例:簡單的稅務函數
這是 DQV 中的一個簡單範例,它對給定金額加稅。 您也可以在 DQV 中評估 UDF。
DEFINE
/// AddTax takes in amount and returns amount including tax
FUNCTION AddTax = (
amount : NUMERIC
) =>
amount * 1.1
EVALUATE
{ AddTax ( 10 ) }
// Returns 11
定義 UDF 之後,您可以更新模型,或使用程式碼透鏡將函數新增至模型。
同樣的範例也可以在 TMDL 檢視中建立。
createOrReplace
/// AddTax takes in amount and returns amount including tax
function AddTax = (amount : NUMERIC) => amount * 1.1
定義好 UDF 後,你可以對該函數進行修改,將該函式加入你的模型。
管理使用者自訂函式
一旦定義並加入模型,你可以在 模型總管 的 函數 節點下查看和管理所有使用者自訂函數。
在 DAX 查詢檢視( DQV)中,您可以使用模型總管的 快速查詢 ,輕鬆定義與評估函式。
在 TMDL 檢視中,你可以將函式 拖放 到 canvas,或是透過 Model explorer 使用 Script TMDL 。
若使用 Power BI Project,函式也會儲存在 functions.tmdl 資料夾中的 definition 資料夾中。
使用使用者自訂函式
在模型中加入 UDF 後,你可以在任何支援 DAX 的地方使用它。 這裡我們以 AddTax 為例。
使用 UDF 搭配完整的篩選上下文和 度量。
Total Sales with Tax = AddTax ( [Total Sales] )
將 UDF 套用至資料表中的每一列,並使用 計算欄位。
Sales Amount with Tax = CONVERT ( AddTax ( 'Sales'[Sales Amount] ), CURRENCY )
直接在視覺化中使用 UDF,並 透過視覺化計算。
Sales Amount with Tax = AddTax ( [Sales Amount] )
為進階情境設置巢狀 UDF。
DEFINE
/// AddTax takes in amount and returns amount including tax
FUNCTION AddTax = (
amount : NUMERIC
) =>
amount * 1.1
FUNCTION AddTaxAndDiscount = (
amount : NUMERIC,
discount : NUMERIC
) =>
AddTax ( amount - discount )
EVALUATE
{ AddTaxAndDiscount ( 10, 2 ) }
// Returns 8.8
Parameters
DAX UDF 支援零個或多個參數。 為了讓你的函式更安全、更可預測,你可以選擇性地指定參數型別提示:
-
類型:參數接受的值類型(
AnyVal,Scalar,Table,AnyRefCalendarRefColumnRefMeasureRef或)。TableRef -
子類型(僅適用於純量類型):特定的純量資料類型(
Variant、Int64DecimalDoubleStringDateTimeBoolean或)。Numeric -
ParameterMode:引數會在何時求值(
val表示立即,expr表示延遲)。
類型提示的形式如下: [type] [subtype] [parameterMode]
範例:類型轉換
DEFINE
/// returns x cast to an Int64
FUNCTION CastToInt = (
x : SCALAR INT64 VAL
) =>
x
EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5
此範例使用型 Scalar 態、 Int64 子型態與 val 參數模式。 你也可以像下面範例中那樣,直接包含 Int64 子類型來達到同樣效果。 非數字字串會導致錯誤。
DEFINE
/// returns x as an Int64
FUNCTION CastToInt = (
x : INT64
) =>
x
EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5
類型檢查
利用內建的 DAX 型別檢查函式來驗證函式內的參數型別,例如:
欲了解完整的型別檢查功能清單,請參見 DAX 使用者定義函式。
相關內容
欲了解更多使用使用者自訂函式的資訊,請參閱以下資源: