Funkcje zdefiniowane przez użytkownika w języku DAX

Funkcje zdefiniowane przez użytkownika (UDF) w języku Data Analysis Expressions (DAX) pozwalają na pakowanie logiki DAX, która jest wielokrotnego użytku i sparametryzowana, w modelach, co ułatwia pisanie, utrzymanie i dzielenie się kodem DAX. Zamiast powtarzać formuły w miarach, kolumnach obliczeniowych i wizualizacjach, funkcje zdefiniowane przez użytkownika wnoszą elastyczność programistyczną do modeli semantycznych, pozwalając na jednokrotne definiowanie funkcji i ich wykorzystywanie wszędzie, gdzie obsługiwany jest DAX.

Funkcje definiowane przez użytkownika (UDF) w języku DAX są ogólnie dostępne w programie Power BI Desktop i usłudze Power BI od wersji z czerwca 2026 r. Aby dowiedzieć się więcej, zobacz Funkcje zdefiniowane przez użytkownika w języku DAX.

Dlaczego warto używać funkcji zdefiniowanych przez użytkownika?

  • Możliwość ponownego użycia i spójność: zdefiniuj obliczenie raz i ponownie użyj go wszędzie.
  • Łatwość konserwacji: Zaktualizuj logikę w jednym miejscu, aby naprawić lub rozwijać reguły.
  • Bezpieczniejsze tworzenie: opcjonalne wskazówki dotyczące typów i pomocnicy sprawdzania typów obsługują przewidywalny, odporny na błędy kod.
  • Obiekty modelu pierwszej klasy: funkcje zdefiniowane przez użytkownika, które działają w modelu i można je wyświetlić w Eksploratorze modeli.

Definiowanie funkcji

Funkcję zdefiniowaną przez użytkownika można zdefiniować w programie Power BI Desktop przy użyciu widoku zapytań języka DAX (DQV), widoku języka TMDL lub widoku modelu. Funkcje UDF można również wyświetlać i edytować w przeglądarce za pomocą modelowania w sieci Web w usłudze Power BI.

Składnia ogólna

Ogólna składnia funkcji zdefiniowanej przez użytkownika to:

/// Optional description above the function
/// @param {ParameterType} ParameterName - ParameterDescription
/// ...
/// @returns Return description
FUNCTION <FunctionName> = ( [<ParameterName> [: [<ParameterType>] [<ParameterSubtype>] [<ParameterPassingMode>]] [= <DefaultExpression>], ...] ) => <FunctionBody>

Przykład: Prosta funkcja podatkowa

Oto prosty przykład w DQV , który dodaje podatek do danej kwoty. Można również ocenić UDF w DQV.

DEFINE
    /// AddTax takes in amount and returns amount including tax
    FUNCTION AddTax = (
            amount : NUMERIC
        ) =>
        amount * 1.1

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

Po zdefiniowaniu funkcji UDF, możesz zaktualizować model lub użyć Code Lens, aby dodać funkcję do modelu.

Oświetlanie ekranu widoku zapytania języka DAX w programie Power BI Desktop z wyróżnionymi dwiema lokalizacjami, w których można zapisać funkcję zdefiniowaną przez użytkownika. Pierwszym z nich jest przycisk Aktualizuj model ze zmianami w górnej części widoku. Drugi to wiersz stanu w edytorze kodu z etykietą Update model: Add new function.

Ten sam przykład można utworzyć w widoku TMDL.

createOrReplace
    /// AddTax takes in amount and returns amount including tax
    function AddTax = (amount : NUMERIC) => amount * 1.1

Po zdefiniowaniu funkcji UDF możesz zatwierdzić zmiany, aby dodać tę funkcję do modelu.

Oświetlanie ekranu widoku TMDL w programie Power BI Desktop z wyróżnionym przyciskiem Zastosuj w górnej części widoku. Ten przycisk to lokalizacja, w której można zapisać funkcję zdefiniowaną przez użytkownika.

Zarządzanie funkcjami zdefiniowanymi przez użytkownika

Po zdefiniowaniu i dodaniu do modelu można wyświetlać wszystkie funkcje zdefiniowane przez użytkownika i zarządzać nimi z poziomu Eksploratora modelu w węźle Funkcje .

Zrzut ekranu przedstawiający panel eksploratora modeli w programie Power BI Desktop przedstawiający rozwinięty węzeł funkcje. Wyświetlane są trzy funkcje zdefiniowane przez użytkownika: AddTax, AverageOrderValue i CustomerLifetimeValue.

W widoku zapytań języka DAX (DQV) można używać szybkich zapytań za pośrednictwem Eksploratora modeli, aby łatwo definiować i oceniać funkcje.

Zrzut ekranu przedstawiający okienko eksploratora modeli w programie Power BI Desktop wyświetla rozwinięty węzeł Funkcje. Otwarte są dwa menu kontekstowe: pierwsze menu zawiera szybkie zapytania, Zmień nazwę, Usuń z modelu, Ukryj w widoku raportu, Odkryj wszystkie, Zwiń wszystko i Rozwiń wszystko. Szybkie zapytanie jest wyróżnione i zaznaczone. Drugie menu jest wyróżnione i oferuje opcje Szybkie zapytania Oceń, Zdefiniuj i oceń, Zdefiniuj nową funkcję i Zdefiniuj wszystkie funkcje w tym modelu.

W widoku TMDL można przeciągać i upuszczać funkcje na obszar roboczy lub użyć opcji Skrypt TMDL do wykonania tej czynności w Eksploratorze modelu.

Zrzut ekranu przedstawia okienko eksploratora modelu w programie Power BI Desktop z rozwiniętym węzłem Funkcje. Otwarte są dwa menu kontekstowe: pierwsze menu zawiera polecenia Utwórz skrypt TMDL dla, Zmień nazwę, Usuń z modelu, Ukryj w widoku raportu, Odkryj wszystko, Zwiń wszystko i Rozwiń wszystko. Polecenie Utwórz skrypt TMDL dla jest wyróżnione i wybrane. Drugie menu jest wyróżnione i oferuje opcje polecenia Utwórz skrypt TMDL dla: karta Skrypt i Schowek.

W przypadku używania Power BI Project funkcje są również przechowywane w folderze functions.tmdl w folderze definition.

Zrzut ekranu programu Visual Studio Code przedstawiający projekt usługi Power BI. Eksplorator jest otwarty w folderze modelu semantycznego. Plik

Korzystanie z funkcji zdefiniowanych przez użytkownika

Po dodaniu funkcji zdefiniowanej przez użytkownika do modelu możesz użyć jej w dowolnym miejscu, w którym jest obsługiwany język DAX. W tym miejscu użyjemy AddTax jako przykładu.

Używaj UDF w pełnym kontekście filtrowania w miarach.

Total Sales with Tax = AddTax ( [Total Sales] )

Stosuj funkcje UDF do każdego wiersza w tabeli z kolumnami wyliczanymi.

Sales Amount with Tax = CONVERT ( AddTax ( 'Sales'[Sales Amount] ), CURRENCY )

Używaj funkcji UDF bezpośrednio w wizualizacjach za pomocą obliczeń wizualnych.

Sales Amount with Tax = AddTax ( [Sales Amount] )

Zagnieżdżaj UDF-y na potrzeby zaawansowanych scenariuszy.

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

Funkcje języka DAX definiowane przez użytkownika mogą przyjmować zero lub więcej parametrów. Aby zwiększyć bezpieczeństwo i przewidywalność funkcji, możesz opcjonalnie określić wskazówki dotyczące typu parametru:

  • Typ: jakiego typu wartość przyjmuje parametr (AnyVal, Scalar, , Table, AnyRefCalendarRef, ColumnRef, , MeasureRef, lub TableRef).
  • Podtyp (tylko dla typu skalarowego): określony typ danych skalarnych (Variant, Int64, DecimalDoubleStringDateTimeBooleanlub ).Numeric
  • ParameterMode: kiedy argument jest obliczany (val dla zachłannych lub expr dla leniwych).

Podpowiedzi typów mają postać: [type] [subtype] [parameterMode]

Przykład: rzutowanie typu

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

W tym przykładzie użyto typu Scalar, podtypu Int64 i trybu parametru val. Możesz również osiągnąć ten sam efekt, po prostu uwzględniając podtyp Int64, jak pokazano w poniższym przykładzie. Ciągi znaków nienumeryczne powodują wystąpienie błędu.

DEFINE
    /// returns x as an Int64
    FUNCTION CastToInt = (
            x : INT64
        ) =>
        x

EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5

Sprawdzanie typów

Zweryfikuj typy parametrów wewnątrz funkcji przy użyciu wbudowanych funkcji sprawdzania typów języka DAX, takich jak:

Aby uzyskać pełną listę dostępnych funkcji sprawdzania typów, zobacz Funkcje zdefiniowane przez użytkownika w języku DAX.

Aby uzyskać więcej informacji na temat korzystania z funkcji zdefiniowanych przez użytkownika, zobacz następujące zasoby: