Funzioni DAX definite dall'utente

Le funzioni definite dall'utente (UDF) di Data Analysis Expressions (DAX) permettono di integrare nei tuoi modelli logica DAX riutilizzabile e parametrizzata, semplificando la scrittura, la gestione e la condivisione del codice DAX. Invece di ripetere formule nelle misure, nelle colonne calcolate e negli oggetti visivi, le UDF (Funzioni Definite dall'Utente) offrono flessibilità in stile programmazione ai tuoi modelli semantici, consentendo di definire le funzioni una sola volta e usarle ovunque DAX sia supportato.

Le funzioni definite dall'utente DAX sono disponibili a livello generale in Power BI Desktop e nel servizio Power BI a partire dalla versione di giugno 2026. Per altre informazioni, vedere Funzioni definite dall'utente DAX.

Perché usare le funzioni definite dall'utente?

  • Riutilizzabilità e coerenza: definire un calcolo una volta e riutilizzarlo ovunque.
  • Gestibilità: aggiornare la logica in un'unica posizione per correggere o evolvere le regole.
  • Creazione più sicura: gli hint di tipo facoltativi e gli aiuti per il controllo del tipo supportano un codice prevedibile e resistente agli errori.
  • Oggetti modello di prima classe: le UDF (funzioni definite dall'utente) si trovano nel modello e possono essere visualizzate in Esplora modelli.

Definire una funzione

È possibile definire una funzione definita dall'utente in Power BI Desktop usando la vista query DAX (DQV) o la vista TMDL.

Sintassi generale

La sintassi generale per una UDF è:

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

Esempio: Funzione fiscale semplice

Ecco un semplice esempio in DQV che aggiunge l'imposta all'importo specificato. È anche possibile valutare le funzioni definite dall'utente in DQV.

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

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

Dopo aver definito una funzione definita dall'utente, è possibile aggiornare il modello o utilizzare il "code lens" per aggiungere la funzione al modello.

Screenshot della visualizzazione query DAX in Power BI Desktop, evidenziando due posizioni in cui è possibile salvare una funzione definita dall'utente. Il primo è il pulsante Aggiorna modello con modifiche nella parte superiore della visualizzazione. La seconda è una riga di stato nell'editor di codice con etichetta Update model: Add new function.

Lo stesso esempio può essere creato nella visualizzazione TMDL.

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

Dopo aver definito una UDF, puoi applicare le modifiche per aggiungere la funzione al tuo modello.

Screenshot della visualizzazione TMDL in Power BI Desktop, evidenziando il pulsante Applica nella parte superiore della visualizzazione. Questo pulsante è il percorso in cui è possibile salvare una funzione definita dall'utente.

Gestire le funzioni definite dall'utente

Dopo aver definito e aggiunto al modello, è possibile visualizzare e gestire tutte le funzioni definite dall'utente da Esplora modelli nel nodo Funzioni .

Screenshot di un pannello esplora modelli in Power BI Desktop con il nodo Funzioni espanso. Sono elencate tre funzioni definite dall'utente: AddTax, AverageOrderValue e CustomerLifetimeValue.

Nella vista query DAX (DQV) è possibile usare query rapide tramite Esplora modelli per definire e valutare facilmente le funzioni.

Screenshot del riquadro Esplora modelli in Power BI Desktop che visualizza il nodo Funzioni espanso. Sono aperti due menu contestuali: il primo menu include Query rapide, Rinomina, Elimina dal modello, Nascondi nella visualizzazione report, Mostra tutto, Comprimi tutto ed Espandi tutto. Query rapide è evidenziato e selezionato. Il secondo menu è evidenziato e offre le opzioni di Query rapide: Valuta, Definisci e valuta, Definisci una nuova funzione e Definisci tutte le funzioni in questo modello.

Nella visualizzazione TMDL, è possibile trascinare funzioni nell'area di disegno oppure usare Script TMDL per farlo in Esplora modelli.

La schermata del riquadro Esplora modelli in Power BI Desktop visualizza il nodo Funzioni espanso. Sono aperti due menu di scelta rapida: il primo menu include Script TMDL in, Rinomina, Elimina dal modello, Nascondi nella visualizzazione report, Mostra tutto, Comprimi tutto ed Espandi tutto. Script TMDL in è evidenziato e selezionato. Il secondo menu è evidenziato e offre per Script TMDL in le opzioni Scheda Script e Appunti.

Se si usa un Power BI Project, le funzioni vengono archiviate anche nella cartella functions.tmdl all'interno della cartella definition.

Screenshot di Visual Studio Code di un progetto di Power BI. Explorer è aperto alla cartella del modello semantico. 'functions.tmdl' è aperto nell'editor di codice. Vengono visualizzate tre funzioni: CustomerLifetimeValue, AverageOrderValue e AddTax.

Usare funzioni definite dall'utente

Dopo aver aggiunto una UDF al modello, è possibile usarla ovunque DAX sia supportato. Qui viene usato AddTax come esempio.

Usare funzioni definite dall'utente con contesto di filtro completo con misure.

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

Applicare le UDF su ogni riga di una tabella con colonne calcolate.

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

Usa gli UDF direttamente negli oggetti visivi con calcoli visivi.

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

Nidificare le funzioni definite dall'utente per scenari avanzati.

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

Le funzioni definite dall'utente DAX supportano zero o più parametri. Per rendere le funzioni più sicure e prevedibili, è possibile specificare facoltativamente hint per il tipo di parametro:

  • Tipo: tipo di valore accettato dal parametro (AnyVal, Scalar, Table, AnyRefCalendarRef, ColumnRefMeasureRef, , o TableRef).
  • Sottotipo (solo per il tipo scalare): tipo di dati scalare specifico (Variant, Int64, DecimalDouble, String, DateTime, Boolean, o Numeric).
  • ParameterMode: quando l'argomento viene valutato (val per valutazione immediata o expr per valutazione ritardata).

Le annotazioni di tipo seguono la forma: [type] [subtype] [parameterMode]

Esempio: Cast dei tipi

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

Questo esempio usa un Scalar tipo, un Int64 sottotipo e val parameterMode. È anche possibile ottenere lo stesso effetto includendo solo il Int64 sottotipo come illustrato nell'esempio seguente. Le stringhe non numeriche generano un errore.

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

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

Controllo dei tipi

Convalidare i tipi di parametro all'interno della funzione usando funzioni di controllo dei tipi DAX predefinite, ad esempio:

Per un elenco completo delle funzioni di controllo dei tipi disponibili, vedere Funzioni definite dall'utente DAX.

Per altre informazioni sull'uso di funzioni definite dall'utente, vedere le risorse seguenti: