Jaa kautta


DAX Käyttäjän määrittämät funktiot (esikatselu)

Note

DAX Käyttäjän määrittämät funktiot ovat tällä hetkellä esikatselussa.

DAX Käyttäjän määrittämien funktioiden (UDF) avulla voit pakata DAX logiikkaa ja käyttää sitä uudelleen kuten mitä tahansa muuta DAX funktiota. UDF:t esittelevät uuden FUNCTION avainsanan, valinnaiset parametrit (skalaari, taulukko ja viittaukset) ja tekstintarkistusapuohjelmat , jotka tekevät sisällönluokittelusta turvallisempaa ja selkeämpää. Kun olet määrittänyt UDF:n, voit käyttää sitä mittarissa, lasketussa sarakkeessa, visuaalisessa laskutoimituksessa tai jopa muissa käyttäjän määrittämissä funktioissa. Käyttäjät voivat keskittää liiketoimintasääntöjä, parantaa ylläpidettävyyttä ja kehittää laskelmia turvallisesti ajan myötä. Funktiot ovat ensiluokkaisia malliobjekteja, joita voit luoda ja hallita kyselynäkymässäDAX ja TMDL-näkymässä, ja niitä voi tarkastella MallinhallinnanFunktiot-solmun alla.

Ota käyttöön käyttäjän määrittämät toiminnot

UDF:ien kokeileminen työpöydällä:

  1. Siirry kohtaan Tiedostoasetukset > ja asetukset > Asetukset.
  2. Valitse Esikatsele ominaisuuksia ja tarkista DAX käyttäjän määrittämät toiminnot.
  3. Valitse OK ja käynnistä Power BI Desktop uudelleen .

Määritä ja hallitse käyttäjän määrittämiä toimintoja

Funktioita voidaan määrittää ja hallita useissa paikoissa:

  • DAX kyselynäkymä (DQV). Määritä ja muokkaa funktioita DQV:ssä. DQV sisältää myös pikavalikon pikakyselyt (Arvioi, Määritä ja arvioi ja Määritä kaikki tämän mallin funktiot), joiden avulla voit testata ja hallita UDF:iä nopeasti.
  • TMDL-näkymä. UDF:iä voidaan myös luoda ja muokata TMDL:ssä. TMDL-näkymä sisältää myös pikavalikon Script TMDL to.
  • Mallin tutkimusmatkailija. Aiemmin luotuja funktioita voi tarkastella Mallinhallinnan Funktiot-solmussa .

Kun määrität UDF:ää, noudata näitä nimeämisvaatimuksia:

Toimintojen nimet:

  • On oltava hyvin muotoiltu ja ainutlaatuinen mallissa.
  • Voi sisältää pisteitä (pisteitä) nimivälille (esim. Microsoft.PowerBI.MyFunc). Ei voi alkaa tai päättyä jaksoon tai olla peräkkäisiä jaksoja.
  • Pisteiden lisäksi nimet voivat sisältää vain aakkosnumeerisia merkkejä tai alaviivoja. Välilyöntejä tai erikoismerkkejä ei sallita.
  • Ei saa olla ristiriidassa sisäänrakennettujen DAX funktioiden tai varattujen sanojen kanssa (esim. mittaa, funktio, määritellä).

Parametrien nimet:

  • Voi sisältää vain aakkosnumeerisia merkkejä tai alaviivoja. Jaksot eivät ole sallittuja.
  • Ei saa olla varattu sana.

Kyselynäkymän käyttäminen DAX

Voit määrittää, päivittää ja arvioida käyttäjän määrittämiä funktioita kyselynäkymässä DAX . Lisätietoja kyselynäkymästä DAX on kyselynäkymässäDAX.

Yleinen lomake

DEFINE
    /// Optional description above the function
    FUNCTION <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>

Vihje

Käytä /// toimintojen kuvauksiin. Yksiriviset (//) tai moniriviset (/* */) kommentit eivät näy IntelliSense-funktioiden kuvauksissa.

Esimerkki: Yksinkertainen verofunktio

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

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

Tallentaminen malliin

UDF:n tallentaminen kyselynäkymästä DAX malliin:

  • Valitse Päivitä malli muutoksilla , jos haluat tallentaa kaikki kyselyn UDF:t.
  • Voit myös valita Päivitä malli: Lisää uusi funktio määritetyn funktion yläpuolelle tallentaaksesi yhden UDF:n.

Näyttökuva DAX Power BI Desktopin kyselynäkymästä, jossa korostetaan kaksi sijaintia, joihin voit tallentaa käyttäjän määrittämän funktion. Ensimmäinen on Päivitä malli muutoksilla -painike näkymän yläosassa. Toinen on koodieditorin tilarivi Päivitä malli: Lisää uusi funktio

TMDL-näkymän käyttäminen

Voit määrittää ja/tai päivittää käyttäjän määrittämiä toimintoja TMDL-näkymässä. Lisätietoja TMDL-näkymästä on kohdassa TMDL-näkymä.

Yleinen lomake

createOrReplace
    /// Optional description above the function
    function <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>

Esimerkki: Yksinkertainen verofunktio

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

Tallentaminen malliin

Napsauta näkymän yläreunassa olevaa Käytä-painiketta tallentaaksesi kaikki komentosarjan UDF:t malliin.

Näyttökuva TMDL-näkymästä Power BI Desktopissa, jossa näkyy näkymän yläreunassa oleva Käytä-painike. Tämä on sijainti, johon voit tallentaa käyttäjän määrittämän funktion.

TMDL-komentosarjan käyttäminen Power BI -projektissa

UDF:t sisältyvät myös semanttisen mallin TMDL-komentosarjaan, kun käytetään Power BI -projektia. Ne löytyvät functions.tmdlmäärityskansiosta .

Visual Studio Code -näyttökuva Power BI -projektista. Explorer on avoinna semanttisen mallin kansioon. 'functions.tmdl' on avoinna koodieditorissa. Näkyviin tulee kolme funktiota: CustomerLifetimeValue, AverageOrderValue ja AddTax.

Mallinhallinnan käyttäminen

Voit tarkastella kaikkia mallin käyttäjän määrittämiä funktioita Mallinhallinnan Toiminnot-solmun alla. Lisätietoja mallinhallinnasta on kohdassa Mallinhallinta.

Power BI Desktopin mallinhallintapaneeli, jossa näkyy laajennettu Funktiot-solmu. Luettelossa on kolme käyttäjän määrittämää funktiota: AddTax, AverageOrderValue ja CustomerLifetimeValue.

KyselynäkymässäDAX voit käyttää Pikakyselyt UDF:n hiiren kakkospainikkeen valikossa Mallinhallinnassa funktioiden määrittämiseen ja arviointiin helposti.

Power BI Desktopin Mallinhallinta-ruudussa näkyy laajennettu Funktiot-solmu. Kaksi pikavalikkoa on avoinna: ensimmäisessä valikossa on pikakyselyt, Nimeä uudelleen, Poista mallista, Piilota raporttinäkymässä, Näytä kaikki, Kutista kaikki ja Laajenna kaikki. Pikakyselyt korostetaan ja valitaan. Toinen valikko on korostettu ja tarjoaa pikakyselyvaihtoehdot Arvioi, Määritä ja arvioi, Määritä uusi funktio ja Määritä kaikki tämän mallin funktiot.

TMDL-näkymässä voit luoda komentosarjoja vetämällä ja pudottamalla funktioita pohjalle tai käyttämällä komentosarjaa TMDL UDF:n hiiren kakkospainikkeella Mallinhallinnassa.

Power BI Desktopin Mallinhallinta-ruudussa näkyy laajennettu Funktiot-solmu. Kaksi pikavalikkoa on avoinna: ensimmäisessä valikossa on komentosarjan TMDL, Nimeä uudelleen, Poista mallista, Piilota raporttinäkymässä, Näytä kaikki, Kutista kaikki ja Laajenna kaikki. Komentosarja TMDL:ään on korostettu ja valittu. Toinen valikko on korostettu ja tarjoaa Script to TMDL -vaihtoehdot, Script-välilehden ja Leikepöydän.

DMV:iden käyttäminen UDF:ien tarkastamiseen

Voit tarkistaa mallisi UDF:t dynaamisten hallintanäkymien (DMV) avulla. Näiden näkymien avulla voit kysellä tietoja funktioista, mukaan lukien UDF:t.

Voit käyttää INFOA. FUNCTIONS-toiminto mallin UDF:ien tarkastamiseksi. Jos haluat rajoittaa tuloksen vain UDF:iin, määritä parametriksi ORIGIN .2

EVALUATE INFO.FUNCTIONS("ORIGIN", "2")

Tämä kysely palauttaa taulukon kaikista mallissa tällä hetkellä olevista UDF:istä, mukaan lukien niiden nimen, kuvauksen ja niihin liittyvät metatiedot.

Käyttäjän määrittämän funktion käyttäminen

Kun UDF on määritetty ja tallennettu malliin, voit kutsua sitä mittareista, lasketuista sarakkeista, visuaalisista laskutoimituksista ja muista UDF:istä. Tämä toimii samalla tavalla kuin sisäisten DAX funktioiden kutsuminen.

UDF:n kutsuminen mittarissa

Käytä UDF:ää mittarissa, jos haluat käyttää uudelleenkäytettävää logiikkaa täydessä suodatinkontekstissa.

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

Esimerkkimittari on esitetty alla olevassa taulukossa:

Taulukko, joka näyttää kokonaismyynnin ja kokonaismyynnin veroineen. Kokonaismyynti veroineen on korostettu. Visualisoinnit-ruutu on auki. Kokonaismyynti veroineen on korostettu Sarakkeet-kentässä.

UDF:n kutsuminen lasketussa sarakkeessa

UDF:iä voidaan käyttää lasketussa sarakkeessa uudelleenkäytettävän logiikan soveltamiseen taulukon jokaiseen riviin.

Note

Kun käytät UDF:ää lasketussa sarakkeessa, varmista, että funktio palauttaa yhdenmukaisen skalaarin. Katso lisätietoja kohdasta Parametrit . Muunna tulos tarvittaessa haluttuun tyyppiin käyttämällä CONVERT tai vastaavia funktioita.

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

Näemme tämän esimerkkitoimenpiteen alla olevassa taulukossa:

Taulukko, jossa näkyy myyntisumma ja myyntisumma veroineen. Myyntisumma veroineen on korostettuna. Visualisoinnit-ruutu on auki. Myyntisumma veroineen on korostettu Sarakkeet-kentässä.

UDF:n kutsuminen visuaalisessa laskutoimituksessa

UDF:ien avulla voit käyttää logiikkaa suoraan visualisoinnissa. Lisätietoja visuaalisista laskutoimituksista on kohdassa Visuaaliset laskutoimitukset.

Note

Visuaaliset laskutoimitukset toimivat vain visualisoinnissa olevissa kentissä. He eivät voi käyttää malliobjekteja, jotka eivät ole osa visualisointia, etkä voi välittää malliobjekteja (kuten sarakkeita tai mittareita, jotka eivät ole visualisoinnissa) UDF:ään tässä yhteydessä.

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

Näemme tämän esimerkkitoimenpiteen alla olevassa taulukossa:

Visuaalisen laskennan muokkaustilassa. Taulukko, jossa näkyy myyntisumma ja myyntisumma veroineen. Myyntisumma veroineen on korostettuna. Visuaalinen laskentakaava myyntisummalle ja verolle on korostettu.

UDF:n kutsuminen toisessa UDF:ssä

Voit sijoittaa UDF:iä sisäkkäin kutsumalla funktiota toisesta. Tässä esimerkissä määrittelemme yksinkertaisen AddTax UDF:n ja kutsumme sitä toisessa UDF:ssä, AddTaxAndDiscount.

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

Parametrit

DAX UDF:t voivat hyväksyä nolla tai useampia parametreja. Kun määrität parametreja UDF:lle, voit halutessasi määrittää tyyppivihjeitä kullekin parametrille:

  • Tyyppi: minkä tyyppisen arvon parametri hyväksyy (AnyVal, Scalar, Table, tai AnyRef).
  • Alatyyppi (vain skalaarityyppi): tietty skalaaritietotyyppi (Variant, Int64, , DecimalDouble, String, DateTime, , Booleantai Numeric).
  • ParameterMode: kun argumentti evaluoidaan (val tai expr).

Tyyppivihjeet ovat muodossa: [type] [subtype] [parameterMode]

Voit sisällyttää jokaiseen parametriin kaikki, osan tai ei lainkaan näistä vihjeistä, jotta funktioistasi tulee turvallisempia ja ennustettavampia puhelusivustoissa. Jos jätät kaiken pois ja kirjoitat vain parametrin nimen, se käyttäytyy muodossa AnyVal val, mikä tarkoittaa, että argumentti arvioidaan välittömästi kutsun aikana. Tämä on hyödyllistä yksinkertaisissa toiminnoissa.

Tyyppi

Tyyppi määrittää parametrin hyväksymän argumenttiluokan ja sen, välitetäänkö se arvona vai lausekkeena.

UDF-parametreissa DAX on kaksi tyyppiperhettä: arvotyypit ja lauseketyypit:

  • Arvotyypit: tämä argumentti arvioidaan välittömästi (innokas arviointi), kun funktiota kutsutaan ja tuloksena oleva arvo välitetään funktioon.
    • AnyVal: Hyväksyy skalaarin tai taulukon. Tämä on oletusarvo, jos jätät parametrin tyypin pois.
    • Scalar: Hyväksyy skalaariarvon (voi lisäksi lisätä alityypin).
    • Table: Hyväksyy taulukon.
  • Lauseketyypit: tämä argumentti välittää arvioimattoman lausekkeen (laiska arviointi). Funktio päättää, milloin ja missä yhteydessä se arvioidaan. Tämä on tarpeen viiteparametreille ja hyödyllinen, kun haluat hallita suodatinkontekstia (esim. CALCULATE). expr Tyypit voivat olla viittauksia sarakkeeseen, taulukkoon, kalenteriin tai mittariin.
    • AnyRef: Hyväksyy viittauksen (sarakkeen, taulukon, kalenterin tai mittarin).

Alatyyppi

Alityypin avulla voit määrittää tietyn Scalar tietotyypin. Jos määrität alityypin, sinun ei tarvitse määritellä parametria Scalar eksplisiittisesti tyypiksi, tämä oletetaan automaattisesti.

Alatyypit ovat:

  • Variant: Hyväksyy minkä tahansa skalaarin.
  • Int64: Hyväksyy kokonaisen numeron.
  • Decimal: Hyväksyy kiinteän tarkkuuden desimaaliluvun (kuten Valuutta tai Raha).
  • Double: Hyväksyy liukuluvun desimaalimäärän.
  • String: Hyväksyy tekstin.
  • DateTime: Hyväksyy päivämäärän ja kellonajan.
  • Boolean: Hyväksyy TRUE/FALSE.
  • Numeric: Hyväksyy kaikki numeeriset arvot (Int64, Decimaltai Double alatyypit)

Parametrin tila

ParameterMode määrittää, milloin ja missä parametrilauseke arvioidaan. Ne ovat seuraavat:

  • val (innokas arviointi): Lauseke evaluoidaan kerran ennen funktion käynnistämistä. Tuloksena oleva arvo välitetään sitten funktioon. Tämä on yleistä yksinkertaisille skalaari- tai taulukkosyötteille. Tämä on oletusarvo, jos jätät parametrin parametrin pois.
  • expr (laiska arviointi): Lauseke arvioidaan funktion sisällä, mahdollisesti eri kontekstissa (esim. rivikontekstissa tai suodatinkontekstissa) ja mahdollisesti useita kertoja, jos siihen viitataan useita kertoja tai iteraatioiden sisällä. Tämä on tarpeen viiteparametreille ja hyödyllinen, kun haluat hallita arviointikontekstia.

Tyyppi Scalar voi käyttää joko val tai expr. Käytä tätä val , kun haluat, että skalaari arvioidaan kerran kutsujan kontekstissa. Käytä tätä expr , kun haluat lykätä arviointia ja mahdollisesti käyttää kontekstia funktion sisällä. Katso esimerkki: Taulukkoparametri esimerkkinä.

Tyypin AnyRef on oltava expr sellainen, että sen viittaukset (sarakkeet, taulukot, mittarit jne.) on arvioitava funktion kontekstissa.

Esimerkki: Tyyppi Casting

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

Tämä käyttää tyyppiä, Scalar alatyyppiä Int64 ja val parametritilaa, joka mahdollistaa ennustettavan pyöristyksen ja tekstin pakottamisen numeroksi sekä varmistaa, että kaikki lausekkeet arvioidaan innokkaasti. Voit saavuttaa tämän myös sisällyttämällä Int64 alatyypin alla olevan esimerkin mukaisesti. Ei-numeeriset merkkijonot aiheuttavat virheen.

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

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

Esimerkki: Taulukkoparametri (arvo vs. lauseke)

Jos haluat havainnollistaa, miten UDF-parametriMode vaikuttaa suodatuskontekstiin, tarkastele kahta funktiota, jotka molemmat laskevat Sales-taulukon rivejä. Molemmat käyttävät CALCULATETABLE(t, ALL('Date')) kehossaan, mutta toinen parametri ilmoitetaan ( val innokas arviointi) ja toinen expr (laiska arviointi):

DEFINE
    /// Table val: receives a materialized table, context can't be changed
    FUNCTION CountRowsNow = (
            t : TABLE VAL
        ) =>
        COUNTROWS ( CALCULATETABLE ( t, ALL ( 'Date' ) ) )
    
    /// Table expr: receives an unevaluated expression, context CAN be changed
    FUNCTION CountRowsLater = (
            t : TABLE EXPR
        ) =>
        COUNTROWS ( CALCULATETABLE ( t, ALL ( 'Date' ) ) )

EVALUATE
{
    CALCULATE ( CountRowsNow ( 'Sales' ), 'Date'[Fiscal Year] = "FY2020" ),
    CALCULATE ( CountRowsLater ( 'Sales' ), 'Date'[Fiscal Year] = "FY2020" )
}
// returns 84285, 121253

CountRowsNow palauttaa vain tilikauden 2020 myynnin määrän. Myynti-taulukko on suodatettu jo vuoden mukaan ennen funktioon siirtymistä, joten ALL('Date') funktion sisällä ei ole vaikutusta.

CountRowsLater palauttaa kaikkien vuosien myyntimäärän. Funktio vastaanottaa arvioimattoman taulukon lausekkeen ja arvioi sen kohdassa ALL('Date'), poistaen ulkoisen vuosisuodattimen.

Tyypin tarkistus

UDF:ien tyyppitarkistus voidaan tehdä uusilla ja olemassa olevilla tyypintarkistusfunktioilla, joita voit kutsua funktion rungossa vahvistaaksesi välitettyjen parametrien suorituksenaikaisen tyypin. Tämän avulla UDF:t voivat käyttää kontekstinhallintaa, vahvistaa parametreja etukäteen ja normalisoida syötteet ennen laskentaa.

Note

ParameterMode-parametrien expr tyyppitarkistukset tapahtuvat, kun parametriin viitataan funktion tekstissä (ei funktion kutsun aikana).

Käytettävissä olevat tyypin tarkistustoiminnot

UDF:t voivat käyttää seuraavia funktioita skalaariarvojen testaamiseen. Kukin palautus TRUE/FALSE riippuu siitä, onko annettu arvo kyseistä tyyppiä.

Luokka Funktiot
Numeerinen NUMEERINEN, ISNUMBER
Kaksinkertainen KAKSINKERTAINEN
Kokonaisluku ISINT64, ISINTEGER
Desimaaliluku ISDECIMAL, VALUUTTA
Merkkijono MERKKIJONO, ISTEXT
totuusarvo ISBOOLEAN, ISLOGICAL
Päivämäärä ja aika ISDATETIME

Esimerkki: Tarkista, onko parametri merkkijono

DEFINE
    /// Returns the length of a string, or BLANK if not a string
    FUNCTION StringLength = (
            s
        ) =>
        IF ( ISSTRING ( s ), LEN ( s ), BLANK () )

EVALUATE
{ StringLength ( "hello" ), StringLength ( 123 ) }
// Returns: 5, BLANK

Tämä estää virheet ja antaa sinun päättää, miten funktioon käsitellään ei-merkkijonosyötettä (tässä esimerkissä palauttaa BLANK).

Esimerkki: Hyväksy useita parametrityyppejä

DEFINE
    /// Helper 1: get currency name by int64 key
    FUNCTION GetCurrencyNameByKey = (
            k : INT64
        ) =>
        LOOKUPVALUE ( 'Currency'[Currency], 'Currency'[CurrencyKey], k )
    
    /// Helper 2: get currency name by string code
    FUNCTION GetCurrencyNameByCode = (
            code : STRING
        ) =>
        LOOKUPVALUE ( 'Currency'[Currency], 'Currency'[Code], code )
    
    /// Accepts key (int64) or code (string) and returns the currency name
    FUNCTION GetCurrencyName = (
            currency
        ) =>
        IF (
            ISINT64 ( currency ),
            GetCurrencyNameByKey ( currency ),
            GetCurrencyNameByCode ( currency )
        )

EVALUATE
{ GetCurrencyName ( 36 ), GetCurrencyName ( "USD" ) }
// returns "Euro", "US Dollar"

Tässä esimerkissä näytetään, miten voit käyttää UDF:ien tyypin tarkistusta useiden syötetyyppien turvalliseen hyväksymiseen ja yhden ennustettavan tuloksen palauttamiseen. GetCurrencyName ottaa yhden argumentin currency, joka voi olla joko kokonaislukuinen valuutta-avain tai tekstin valuuttakoodi. Funktio tarkistaa argumentin tyypin komennolla ISINT64. Jos syöte on kokonaisluku, se kutsuu auttajaa GetCurrencyNameByKey , joka etsii valuutan nimen valuutta-avaimen perusteella. Jos syöte ei ole kokonaisluku, se kutsuu apua GetCurrencyNameByCode , joka etsii valuutan nimen valuuttakoodin perusteella.

Määritä useita funktioita kerralla

UDF:ien avulla voit määrittää useita funktioita yhdessä kyselyssä tai komentosarjassa, mikä helpottaa uudelleenkäytettävän logiikan järjestämistä. Tämä on erityisen hyödyllistä, kun haluat kapseloida toisiinsa liittyviä laskutoimituksia tai apurutiineja yhteen. Funktioita voidaan arvioida yhdessä tai yksittäin.

DEFINE
    /// Multiplies two numbers
    FUNCTION Multiply = (
            a,
            b
        ) =>
        a * b

    /// Adds two numbers and 1
    FUNCTION AddOne = (
            x,
            y
        ) =>
        x + y + 1

    /// Returns a random integer between 10 and 100
    FUNCTION RandomInt = () =>
        RANDBETWEEN ( 10, 100 )

EVALUATE
{ Multiply ( 3, 5 ), AddOne ( 1, 2 ), RandomInt () }
// returns 15, 4, 98

Edistynyt esimerkki: Joustava valuuttamuunnos

Osoittaaksemme, miten DAX UDF:t pystyvät käsittelemään monimutkaisempaa logiikkaa, tarkastelemme valuuttamuunnosskenaariota. Tässä esimerkissä käytetään tyypin tarkistusta ja sisäkkäisiä funktioita tietyn summan muuntamiseen kohdevaluutaksi käyttämällä joko tietyn päivämäärän keskimääräistä tai päivän lopun vaihtokurssia.

createOrReplace
	function ConvertDateToDateKey =  
		( 
			pDate: scalar variant 
		) => 
		YEAR ( pDate ) * 10000 + MONTH ( pDate ) * 100 + DAY ( pDate ) 
	
	function ConvertToCurrency = 
		( 
			pCurrency:scalar variant, 
			pDate: scalar variant, 
			pUseAverageRate: scalar boolean, 
			pAmount: scalar decimal 
		) => 
		var CurrencyKey = 
			EVALUATEANDLOG ( 
				IF ( 
					ISINT64 ( pCurrency ), 
					pCurrency, 
					CALCULATE ( 
						MAX ( 'Currency'[CurrencyKey] ), 
						'Currency'[Code] == pCurrency 
					) 
				) 
				, "CurrencyKey" 
			) 

		var DateKey = 
			EVALUATEANDLOG ( 
				SWITCH ( 
					TRUE, 
					ISINT64 ( pDate ), pDate, 
					ConvertDateToDateKey ( pDate ) 
				) 
				, "DateKey" 
			) 

		var ExchangeRate = 
			EVALUATEANDLOG ( 
				IF ( 
					pUseAverageRate, 
					CALCULATE ( 
						MAX ( 'Currency Rate'[Average Rate] ), 
						'Currency Rate'[DateKey] == DateKey, 
						'Currency Rate'[CurrencyKey] == CurrencyKey 
					), 
					CALCULATE ( 
					MAX ( 'Currency Rate'[End Of Day Rate] ), 
						'Currency Rate'[DateKey] == DateKey, 
						'Currency Rate'[CurrencyKey] == CurrencyKey 
					) 
				) 
				, "ExchangeRate" 
			) 

		var Result = 
			IF ( 
				ISBLANK ( pCurrency ) || ISBLANK ( pDate ) || ISBLANK ( pAmount ), 
				BLANK (), 
				IF ( 
					ISBLANK ( ExchangeRate ) , 
					"no exchange rate available", 
					ExchangeRate * pAmount 
				) 
			) 

		RETURN Result

Toiminto ConvertToCurrency hyväksyy joustavat syöttötyypit sekä valuutalle että päivämäärälle. Käyttäjät voivat antaa joko valuutta-avaimen tai päivämääräavaimen suoraan tai antaa valuuttakoodin tai vakiopäivämääräarvon. Funktio tarkistaa kunkin syötteen tyypin ja käsittelee sitä sen mukaisesti: jos pCurrency se on kokonaisluku, sitä käsitellään valuutta-avaimena, muussa tapauksessa funktio olettaa valuuttakoodin ja yrittää selvittää vastaavan avaimen. pDate noudattaa samanlaista kaavaa, jos se on kokonaisluku, sitä käsitellään päivämääräavaimena; Muussa tapauksessa funktio olettaa, että se on vakiopäivämääräarvo ja muunnetaan päivämääränäppäimeksi apufunktiolla ConvertDateToDateKey . Jos funktio ei pysty määrittämään kelvollista vaihtokurssia, se palauttaa viestin "vaihtokurssia ei ole saatavilla".

Tämän logiikan avulla voidaan sitten määrittää mittari, kuten Kokonaismyynti paikallisessa valuutassa.

Total Sales in Local Currency = 
ConvertToCurrency (
    SELECTEDVALUE ( 'Currency'[Code] ),
    SELECTEDVALUE ( 'Date'[DateKey] ),
    TRUE,
    [Total Sales]
)

Tämä voidaan valinnaisesti yhdistää dynaamisen muotoilun merkkijonoon , jotta tulos näytetään sopivassa valuuttamuodossa.

CALCULATE (
    MAX ( 'Currency'[Format String] ),
    'Currency'[Code] == SELECTEDVALUE ( 'Currency'[Code] )
)

Esimerkkitulos näkyy alla olevassa kuvakaappauksessa.

Taulukko, jossa näkyy koko päivämäärä, valuutta, kokonaismyynti paikallisessa valuutassa ja kokonaismyynti.

Huomioitavat asiat ja rajoitukset

Käyttäjän määrittämät funktiot ovat tällä hetkellä esikatselussa, ja esikatselun aikana ota huomioon seuraavat seikat ja rajoitukset:

Yleiset:

  • UDF:iä ei voi luoda tai mallintaa DAX palvelussa.
  • UDF:ää ei voi piilottaa/tuoda näkyviin mallissa.
  • UDF-tiedostoja ei voi sijoittaa näyttökansioihin.
  • Nauhassa ei ole "luo toiminto" -painiketta.
  • UDF:iä ei voi yhdistää käännöksiin.
  • UDF:iä ei tueta malleissa, joissa ei ole taulukoita.

UDF:n määrittäminen:

  • Rekursiota tai molemminpuolista rekursiota ei tueta.
  • Toimintojen ylikuormitusta ei tueta.
  • Eksplisiittisiä palautustyyppejä ei tueta.

UDF-parametrit:

  • Valinnaisia parametreja ei tueta.
  • Parametrien kuvauksia ei tueta.
  • UDF:t eivät voi palauttaa arvoa enum . Valmiit funktiot, jotka hyväksyvät enum arvoja funktioparametreikseen, eivät voi käyttää UDF:iä tässä kontekstissa.
  • Vihje-tyyppisiä expr sitomattomia parametreja ei arvioida.

IntelliSense-tuki:

  • Vaikka UDF-tiedostoja voidaan käyttää reaaliaikaisissa yhteys- tai yhdistelmämalleissa, IntelliSense-tukea ei ole.
  • Vaikka UDF:iä voidaan käyttää visuaalisissa laskutoimituksissa, visuaalisten laskutoimitusten kaavarivillä ei ole IntelliSense-tukea UDF:ille.
  • TMDL-näkymässä ei ole asianmukaista IntelliSense-tukea UDF:ille.

Tunnetut virheet

Seuraavat ongelmat ovat tällä hetkellä tiedossa ja voivat vaikuttaa toiminnallisuuteen:

  • Viittauksia taulukkomalliobjektiin (esim. mittari, taulukko, sarake) UDF:ssä ei päivitetä automaattisesti, kun kyseiset objektit nimetään uudelleen. Jos nimeät uudelleen objektin, josta UDF on riippuvainen, funktion runko sisältää edelleen vanhan nimen. Sinun on muokattava UDF-lauseketta manuaalisesti, jotta kaikki viittaukset uudelleennimettyyn objektiin päivittyvät.
  • Tietyt edistyneet skenaariot, joissa käytetään UDF:iä, voivat johtaa jäsentimen epäjohdonmukaisuuksiin. Käyttäjät voivat esimerkiksi nähdä punaisia alleviivauksia tai vahvistusvirheitä, kun he välittävät sarakkeita expr parametreina tai käyttävät hyväksymättömiä sarakeviittauksia.