DAX kullanıcı tanımlı işlevler (önizleme)

Uyarı

DAX kullanıcı tanımlı işlevler şu anda önizleme aşamasındadır.

DAX kullanıcı tanımlı işlevler (UDF) mantığı paketlemenize DAX ve diğer DAX işlevler gibi yeniden kullanmanıza olanak tanır. UDF'ler yeni FUNCTION bir anahtar sözcük, isteğe bağlı parametreler (skaler, tablo ve başvurular) ve yazma işlemini daha güvenli ve daha net hale getiren yazım denetimi yardımcılarını tanıtır. UDF'yi tanımladıktan sonra ölçü,hesaplanmış sütun, görsel hesaplama ve hatta kullanıcı tanımlı diğer işlevlerde kullanabilirsiniz. Kullanıcılar iş kurallarını merkezileştirebilir, sürdürülebilirliği geliştirebilir ve hesaplamaları zaman içinde güvenli bir şekilde geliştirebilir. İşlevler, sorgu görünümünde ve DAX oluşturup yönetebileceğiniz birinci sınıf model nesneleridir ve model gezginindeİşlevler düğümü altında görüntülenebilir.

Kullanıcı tanımlı işlevleri etkinleştirme

Masaüstünde UDF'leri denemek için:

  1. Dosya > Seçenekleri ve ayarlar > Seçenekleri'ne gidin.
  2. Önizleme özellikleri'ne tıklayın ve kullanıcı tanımlı işlevleri denetleyinDAX.
  3. Tamam'ı seçin ve Power BI Desktop'ı yeniden başlatın.

Kullanıcı tanımlı işlevleri tanımlama ve yönetme

İşlevleri tanımlamak ve yönetmek için çeşitli konumlar vardır:

  • DAX sorgu görünümü (DQV). DQV'de işlevleri tanımlama ve değiştirme. DQV, UDF'leri hızlı bir şekilde test edip yönetmenize yardımcı olmak için bağlam menüsü Hızlı sorguları (Değerlendir, Tanımla ve değerlendir ve Bu modeldeki tüm işlevleri tanımla) içerir.
  • TMDL görünümü. UDF'ler TMDL'de de yazılabilir ve düzenlenebilir. TMDL görünümünde ayrıca Betik TMDL'sine bağlam menüsü bulunur.
  • Model gezgini. Yeni işlevler oluşturulabilir ve mevcut işlevler formül çubuğu kullanılarak değiştirilebilir. Mevcut işlevler, Model gezginindeki İşlevler düğümü altında görüntülenebilir.

UDF tanımlarken lütfen şu adlandırma gereksinimlerini izleyin:

İşlev adları:

  • Model içinde düzgün biçimlendirilmiş ve benzersiz olmalıdır.
  • Adlar için nokta (nokta) içerebilir(örneğin, Microsoft.PowerBI.MyFunc). Bir noktayla başlayamaz veya bir noktayla bitiremez ya da ardışık noktalar içeremez.
  • Noktalar haricinde, isimler yalnızca alfasayısal karakterler veya alt çizgi içerebilir. Boşluk veya özel karaktere izin verilmez.
  • Yerleşik DAX işlevlerle veya ayrılmış sözcüklerle (örneğin ölçü, işlev, tanımlama) çakışmamalıdır.

Parametre adları:

  • Yalnızca alfasayısal karakterler veya alt çizgi içerebilir. Dönemlere izin verilmez.
  • Rezerv edilmiş bir kelime olmamalıdır.

Sorgu görünümünü kullanma DAX

Sorgu görünümünde kullanıcı tanımlı işlevleri DAX tanımlayabilir, güncelleştirebilir ve değerlendirebilirsiniz. Sorgu görünümü hakkında DAX ek bilgi için bkz DAX . sorgu görünümü.

Genel form

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

Tavsiye

JSDoc blok etiketlerini kullanarak işlevlerinizi açıklamalar, parametre adları ve türleriyle belgeleyin ve kullanımı kolaylaştırmak için bilgi döndürün. /// İşlev açıklamalarını not edin. IntelliSense işlev açıklamalarında tek satırlı (//) veya çok satırlı (/* */) açıklamalar görünmez.

Örnek: Basit vergi işlevi

DEFINE
    /// AddTax takes in amount and returns amount including tax
    /// @param {NUMERIC} amount - The pre-tax value to which tax will be applied
    /// @returns The amount including 10% tax
    FUNCTION AddTax = 
        ( amount : NUMERIC ) =>
            amount * 1.1

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

Modele kaydetme

DAX sorgu görünümünden modele UDF kaydetmek için:

  • Sorgudaki tüm UDF'leri kaydetmek için Modeli değişikliklerle güncelleştir'e tıklayın.
  • Ya da Modeli güncelleştir: Tek bir UDF kaydetmek için tanımlı işlevin üzerine yeni işlev ekleyin'e tıklayın.

DAX Power BI Desktop'ta kullanıcı tanımlı bir işlevi kaydedebileceğiniz iki konumu vurgulayan sorgu görünümünün ekran görüntüsü. Birincisi, görünümün üst kısmındaki Değişiklikleri içeren modeli güncelleştir düğmesidir. İkincisi, kod düzenleyicisinde Modeli güncelleştir: Yeni işlev ekle etiketli bir durum satırıdır

TMDL görünümünü kullanma

TMDL görünümünde kullanıcı tanımlı işlevleri tanımlayabilir ve/veya güncelleştirebilirsiniz. TMDL görünümü hakkında ek bilgi için bkz. TMDL görünümü.

Genel form

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

Örnek: Basit vergi işlevi

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

Modele kaydetme

Betikteki tüm UDF'leri modele kaydetmek için görünümün üst kısmındaki Uygula düğmesine tıklayın.

Power BI Desktop'ta TMDL görünümünün ekran görüntüsü, görünümün üst kısmındaki Uygula düğmesini vurgular. Bu, kullanıcı tanımlı bir işlevi kaydedebileceğiniz konumdur.

Power BI Projesinde TMDL betiğini kullanma

UDF'ler, Power BI projesi kullanılırken anlam modeli TMDL betiğine de eklenir. Bunlar functions.tmdl klasöründe bulunabilir.

Power BI projesinin Visual Studio Code ekran görüntüsü. Explorer semantik model klasörüne açıktır. 'functions.tmdl' kod düzenleyicisinde açık. Üç işlev görüntülenir: CustomerLifetimeValue, AverageOrderValue ve AddTax.

Model gezginini kullanma

Model gezgininden İşlevler düğümü altındaki modeldeki tüm kullanıcı tanımlı işlevleri görüntüleyebilirsiniz. Model gezgini hakkında ek bilgi için bkz. Model gezgini.

Power BI Desktop'ta genişletilmiş İşlevler düğümünü gösteren model gezgini paneli. Kullanıcı tanımlı üç işlev listelenir: AddTax, AverageOrderValue ve CustomerLifetimeValue.

SorguDAX görünümünde, işlevleri kolayca tanımlamak ve değerlendirmek için Model gezginindeki bir UDF'nin sağ tıklama menüsündeki Hızlı sorguları kullanabilirsiniz.

Power BI Desktop'taki model gezgini bölmesinde genişletilmiş İşlevler düğümü görüntülenir. İki bağlam menüsü açık: İlk menüde Hızlı sorgular, Yeniden Adlandır, Modelden sil, Rapor görünümünde gizle, Tümünü göster, Tümünü daralt ve Tümünü genişlet yer alır. Hızlı sorgular vurgulanır ve seçilir. İkinci menü vurgulanır ve Hızlı sorgular Değerlendirme, Tanımlama ve değerlendirme, Başvurularla tanımla ve değerlendir, Yeni işlev tanımla ve Bu modeldeki tüm işlevleri tanımla seçenekleri sunar.

TMDL görünümünde, işlevleri tuvale sürükleyip bırakabilir veya betik oluşturmak için Model gezginindeki UDF'nin sağ tıklama menüsündeki TMDL Betikle kullanabilirsiniz.

Power BI Desktop'taki model gezgini bölmesinde genişletilmiş İşlevler düğümü görüntülenir. İki bağlam menüsü açıktır: İlk menüde Betik TMDL'ye, Yeniden Adlandır, Modelden Sil, Rapor Görünümünde Gizle, Tümünü Göster, Tümünü Daralt ve Tümünü Genişlet sunulmaktadır. Betik TMDL'ye seçeneği vurgulanır ve seçilir. İkinci menü vurgulanır ve TMDL'ye Betikle seçenekleri olan Betik Sekmesi ve Pano sunar.

UDF'leri incelemek için DMV'leri kullanma

Dinamik Yönetim Görünümlerini (DMV) kullanarak modelinizdeki UDF'leri inceleyebilirsiniz. Bu görünümler UDF'ler de dahil olmak üzere işlevler hakkındaki bilgileri sorgulamanıza olanak sağlar.

INFO.USERDEFINEDFUNCTIONS işlevini, modeldeki UDF'leri incelemek için kullanabilirsiniz. Bu işlev tam meta verileri döndürür ve yazma izni gerektirir.

EVALUATE INFO.USERDEFINEDFUNCTIONS()

Alternatif olarak BİlGİ'yi kullanabilirsiniz. İŞLEVLER işlevi, UDF adlarını ve sınırlı meta verileri döndürür.

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

Kullanıcı tanımlı işlev kullanma

UDF tanımlanıp modele kaydedildikten sonra ölçülerden, hesaplanmış sütunlardan, görsel hesaplamalardan ve diğer UDF'lerden çağırabilirsiniz. Bu, yerleşik DAX işlevleri çağırmayla aynı şekilde çalışır.

Bir ölçüde Kullanıcı Tanımlı Fonksiyon (UDF) çağırma

Tam filtre bağlamıyla yeniden kullanılabilir mantık uygulamak için bir ölçüde UDF kullanın.

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

Örnek ölçü aşağıdaki tabloda gösterilmiştir:

Toplam Satış ve Vergili Toplam Satışları gösteren tablo. Vergi ile Toplam Satışlar vurgulanır. Görselleştirmeler bölmesi açık. Sütunlar alan kutusunda Vergi ile Toplam Satışlar vurgulanır.

Hesaplanmış bir sütunda UDF'yi çağırma

UDF'ler, tablodaki her satıra yeniden kullanılabilir mantık uygulamak için hesaplanmış sütunda kullanılabilir.

Uyarı

Hesaplanmış sütunda UDF kullanırken işlevin tutarlı türde bir skaler döndürdüğünden emin olun. Daha fazla bilgi için bkz . Parametreler . Gerekirse, CONVERT veya benzeri işlevler kullanarak sonucu istenen türe dönüştürün.

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

Aşağıdaki tabloda kullanılan bu örnek ölçüyü görebiliriz:

Satış Tutarı ve Vergili Satış Tutarı'nı gösteren tablo. Vergili Satış Tutarı vurgulanmıştır. Görselleştirmeler bölmesi açık. Vergili Satış Tutarı, Sütunlar alanında vurgulanmıştır.

Görsel hesaplamada UDF çağırma

Görsel hesaplamasında UDF'leri kullanarak doğrudan görsele mantık uygulayabilirsiniz. Görsel hesaplamalar hakkında ek bilgi için bkz. Görsel Hesaplamalar.

Uyarı

Görsel hesaplamalar yalnızca görselde bulunan alanlarda çalışır. Görselin parçası olmayan model nesnelerine erişemezler ve bu bağlamda model nesnelerini (görselde bulunmayan sütunlar veya ölçüler gibi) UDF'ye geçiremezsiniz.

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

Aşağıdaki tabloda bu örnek ölçüyü görebiliriz:

Görsel hesaplama düzenleme modunda. Vergi ile Satış Tutarı ve Satış Tutarı'nı gösteren tablo. Vergi ile Satış Tutarı vurgulanır. Vergi ile Satış Tutarı için görsel hesaplama formülü vurgulanır.

Başka bir UDF'de UDF çağırma

Bir işlevi başka bir işlevden çağırarak UDF'leri iç içe yerleştirebilirsiniz. Bu örnekte basit AddTax UDF'mizi tanımlayacak ve başka bir UDF'de çağıracağız. 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

Parametreler

DAX UDF'ler sıfır veya daha fazla parametre kabul edebilir. UDF için parametreler tanımlarken, isteğe bağlı olarak her parametre için tür ipuçları belirtebilirsiniz:

  • Tür: parametresinin kabul istediği değer türü (AnyVal, Scalar, Table, AnyRef, CalendarRef, ColumnRefveya MeasureRefTableRef).
  • Alt tür (yalnızca skaler tür için): belirli skaler veri türü (Variant, Int64, Decimal, Double, String, , DateTime, Booleanveya Numeric).
  • ParameterMode: bağımsız değişken değerlendirildiğinde (val veya expr).

Tür ipuçları şu biçimdedir: [type] [subtype] [parameterMode]

İşlevlerinizi çağrı sitelerinde daha güvenli ve tahmin edilebilir hale getirmek için her parametre için bu tür ipuçlarının tümünü, bazılarını veya hiçbirini ekleyebilirsiniz. Her şeyi atlayıp yalnızca AnyVal val gibi davranan parametre adını yazarsanız, bu, bağımsız değişkenin çağrı anında hemen değerlendirileceği anlamına gelir. Bu, basit işlevler için kullanışlıdır.

Türü

Tür, parametrenizin kabul edilen bağımsız değişken kategorisini ve değer olarak mı yoksa ifade olarak mı geçirildiğini tanımlar.

UDF parametrelerinde DAX iki tür ailesi vardır: değer türleri ve ifade türleri:

  • Değer türleri: İşlev çağrıldığında ve sonuçta elde edilen değer işleve geçirildiğinde bu bağımsız değişken hemen değerlendirilir (hevesli değerlendirme).
    • AnyVal: Skaler veya tablo kabul eder. Bir parametrenin türünü atlarsanız, varsayılan değer budur.
    • Scalar: Bir skaler değer kabul eder (ayrıca bir alt tür ekleyebilir).
    • Table: Bir tabloyu kabul eder.
  • İfade türleri: Bu bağımsız değişken değerlendirilmemiş bir ifadeyi (gecikmeli değerlendirme) geçer. İşlev, ne zaman ve hangi bağlamda değerlendirileceğine karar verir. Bu, başvuru parametreleri için gereklidir ve filtre bağlamı denetlemeniz gerektiğinde (örneğin, içinde CALCULATE) kullanışlıdır. expr türleri bir sütuna, tabloya, takvime veya ölçüye başvuru olabilir.
    • AnyRef: Herhangi bir referansı kabul eder. İfade türü belirtmemeye eşdeğerdir.
    • CalendarRef: Bir takvime referans kabul eder.
    • ColumnRef: Bir sütuna referans kabul eder.
    • MeasureRef: Bir ölçüye referans kabul eder.
    • TableRef: Bir tabloya referans kabul eder.

Değer türleri (AnyVal, Scalar, Table) örtük tür atamasını destekler. İfade türleri (AnyRef, CalendarRef, ColumnRef, MeasureRef, TableRef) bunu yapmaz.

Alt

Alt tür, belirli Scalar bir veri türünü tanımlamanızı sağlar. Bir alt tür tanımlarsanız, parametreyi açıkça tür Scalar olarak tanımlamanız gerekmez, bu otomatik olarak kabul edilir.

Alt türleri şunlardır:

  • Variant: Herhangi bir skaler kabul eder.
  • Int64: Bir numner'ın tamamını kabul eder.
  • Decimal: Sabit hassasiyetli ondalık sayı (Para Birimi veya Para gibi) kabul eder.
  • Double: Kayan nokta ondalık değerini kabul eder.
  • String: Metni kabul eder.
  • DateTime: Tarih/saati kabul eder.
  • Boolean: Kabul eder TRUE/FALSE.
  • Numeric: Herhangi bir sayısal değeri (Int64, Decimalveya Double alt türlerini) kabul eder

Parametre Modu

ParameterMode, parametre ifadesinin ne zaman ve nerede değerlendirilip değerlendirilmeyeceği denetler. Bunlar şunlardır:

  • val (hevesli değerlendirme): İfade, işlevi çağırmadan önce bir kez değerlendirilir. Sonuçta elde edilen değer işleve geçirilir. Bu, basit skaler veya tablo girişlerinde yaygındır. Parametre için parameterMode değerini atlarsanız bu varsayılan değerdir.
  • expr (gecikmeli değerlendirme): İfade, işlevin içinde değerlendirilir ve muhtemelen farklı bir bağlamda (örneğin, satır bağlamı veya filtre bağlamı) ve birden fazla kez başvurulduğunda veya yineleme sırasında birden fazla kez değerlendirilebilir. Bu, başvuru parametreleri için gereklidir ve değerlendirme bağlamı denetlemeniz gerektiğinde kullanışlıdır.

Scalar türü ya val ya da expr kullanabilir. Çağıranın bağlamında skaler değerinin bir kez değerlendirilmesini istediğinizde kullanın val . Değerlendirmeyi ertelemek ve işlev içinde bağlam uygulamak istediğinizde kullanın expr . Örnek: Örnek olarak tablo parametresi bölümüne bakın.

İfade türlerinin (AnyRef, ColumnRef vb.) expr olarak belirlenmesi gerekir çünkü başvurularının (sütunlar, tablolar, ölçüler vb.) işlevin bağlamında değerlendirilmesi gerekmektedir.

Aşağıdaki tablo, effective/allowed parameterMode'u özetlemektedir.

Türü ParameterMode belirtilmedi ParametreModu: val ParametreModu: expr
(Belirtilmedi) / AnyVal val val expr
Scalar, Table val val expr
AnyRef expr İzin verilmiyor expr
CalendarRef, ColumnRef, MeasureRef, TableRef expr İzin verilmiyor expr

Örnek: Tür dönüştürme

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

Bu, tahmin edilebilir yuvarlama ve metinden sayıya zorlama için bir Scalar tür, Int64 alt tür ve val parameterMode kullanır ve tüm ifadelerin hevesle değerlendirilmesini sağlar. Bunu, aşağıdaki örnekte gösterildiği gibi sadece Int64 alt türünü ekleyerek gerçekleştirebilirsiniz. Sayısal olmayan dizeler hataya neden olur.

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

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

Örnek: Tablo parametresi (değer ve ifade)

UDF parameterMode'un filtre bağlamını nasıl etkilediğini göstermek için her ikisi de 'Sales' tablosundaki satırları sayan iki işlevi göz önünde bulundurun. CALCULATETABLE(t, ALL('Date')) Her ikisi de gövdelerinde kullanılır, ancak bir parametre val (hevesli değerlendirme) ve diğeri expr (gecikmeli değerlendirme) olarak bildirilir.

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 yalnızca FY2020 için satış sayısını döndürür. 'Sales' tablosu işleve girmeden önceki yıla göre filtrelenmiş olduğundan işlevin ALL('Date') içinde hiçbir etkisi yoktur.

CountRowsLater, tüm yılların satış sayısını döndürür. İşlev, değerlendirilmemiş bir tablo ifadesi alır ve ALL('Date') altında değerlendirir, dış yıl filtresini kaldırır.

Tip denetimi

UDF'lerde tür denetimi, geçirilen parametrelerin çalışma zamanı türünü onaylamak için işlev gövdesi içinde çağırabileceğiniz yeni ve mevcut tür denetimi işlevleriyle yapılabilir. Bu sayede UDF'ler bağlam denetimini kullanabilir, parametreleri önceden doğrulayabilir, hesaplamadan önce girişleri normalleştirebilir.

Uyarı

expr parameterMode parametreleri için, parametreye işlev gövdesinde başvurulduğunda (işlev çağrı zamanında değil) tür denetimleri gerçekleşir.

Kullanılabilir tür denetimi işlevleri

UDF'ler skaler değerleri test etmek için aşağıdaki işlevleri kullanabilir. Her biri, sağlanan değerin bu türde olup olmadığına bağlı olarak döndürür TRUE/FALSE .

Kategori Functions
Numeric ISNUMERIC, ISNUMBER
Double ISDOUBLE
Tam sayı ISINT64, ISINTEGER
Decimal ISDECIMAL, ISCURRENCY
String ISSTRING, ISTEXT
Boolean ISBOOLEAN, ISLOGICAL
Tarih ve Saat ISDATETIME

Örnek: Parametrenin bir dize olup olmadığını denetleyin

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

Bu, hataları önler ve işleve dize olmayan girişin nasıl işleneceğini belirlemenize olanak tanır (bu örnekte döndürür BLANK).

Örnek: Birden çok parametre türünü kabul etme

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"

Bu örnekte, birden çok giriş türünü güvenli bir şekilde kabul etmek ve tek, öngörülebilir bir sonuç döndürmek için UDF'lerde tür denetiminin nasıl kullanılacağı gösterilmektedir. GetCurrencyName bir bağımsız değişken alır. currencyBu, tamsayı para birimi anahtarı veya metin para birimi kodu olabilir. İşlev, bağımsız değişken türünü ile ISINT64denetler. Giriş bir tamsayıysa, para birimi anahtarını temel alarak para birimi adını arayan yardımcıyı GetCurrencyNameByKey çağırır. Giriş bir tamsayı değilse, para birimi kodunu temel alarak para birimi adını arayan yardımcıyı GetCurrencyNameByCode çağırır.

Yararlı bilgi işlevleri

UDF'ler yazarken aşağıdaki bilgi işlevleri yararlıdır:

  • TABLEOF: Belirli bir sütun, ölçü veya takvimle ilişkili tam tabloyu döndürür.
  • NAMEOF: Bir tablonun, sütunun, ölçünün veya takvimin adını metin dizesi olarak verir

Örnek: MODEX işlevi

Aşağıdaki örnekte, bir tablo üzerinden değerlendirilen bir ifadenin en sık oluşan değerlerini döndüren bir MODEX işlevinin temel uygulaması gösterilmektedir. Verilen referanstan doğru tabloyu otomatik olarak çözmek için TABLEOF kullanır.

DEFINE
    FUNCTION MODEX = (
            e : ANYREF
        ) =>
        VAR newTable =
            ADDCOLUMNS ( TABLEOF ( e ), "expr", e )
        VAR freqTable =
            GROUPBY ( newTable, [expr], "count", SUMX ( CURRENTGROUP (), 1 ) )
        VAR maxCount =
            MAXX ( freqTable, [count] )
        VAR topResults =
            FILTER ( freqTable, [count] = maxCount )
        RETURN
            SELECTCOLUMNS ( topResults, "expr", [expr] )

EVALUATE
MODEX ( [Total Sales] )

Aynı anda birden çok işlev tanımlama

UDF'ler, tek bir sorguda veya betikte birkaç işlev tanımlamanıza olanak tanıyarak yeniden kullanılabilir mantığı düzenlemenizi kolaylaştırır. Bu, özellikle ilgili hesaplamaları veya yardımcı yordamları birlikte kapsüllemek istediğinizde kullanışlıdır. İşlevler birlikte veya ayrı ayrı değerlendirilebilir.

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

Gelişmiş örnek: Esnek para birimi dönüştürme

UDF'lerin daha karmaşık mantığı nasıl DAX işleyebileceğini göstermek için bir para birimi dönüştürme senaryosuna bakacağız. Bu örnek, belirli bir tarihteki ortalama veya gün sonu döviz kurunu kullanarak verilen bir tutarı hedef para birimine dönüştürmek için tür denetimi ve iç içe fonksiyonları kullanır.

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

işlevi hem ConvertToCurrency para birimi hem de tarih için esnek giriş türlerini kabul eder. Kullanıcılar doğrudan bir para birimi anahtarı veya tarih anahtarı sağlayabilir ya da bir para birimi kodu veya standart tarih değeri sağlayabilir. İşlev, her girişin türünü denetler ve buna göre işler: tamsayıysa pCurrency , para birimi anahtarı olarak kabul edilir; aksi takdirde işlev bir para birimi kodu kabul eder ve ilgili anahtarı çözümlemeye çalışır. pDate benzer bir desen izler, tamsayı ise, tarih anahtarı olarak değerlendirilir; aksi takdirde işlev bunun standart bir tarih değeri olduğunu varsayar ve yardımcı işlevi kullanılarak tarih anahtarına ConvertDateToDateKey dönüştürülür. İşlev geçerli bir ekschnage oranı belirleyemezse , "kullanılabilir döviz kuru yok" iletisini döndürür.

Bu mantık daha sonra Yerel Para Birimi cinsinden Toplam Satışlar gibi bir ölçü tanımlamak için kullanılabilir.

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

Bu isteğe bağlı olarak, sonucu uygun para birimi biçiminde görüntülemek için dinamik biçim dizesiyle eşleştirilebilir.

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

Aşağıdaki ekran görüntüsünde örnek bir sonuç görülebilir.

Tam Tarih, Para Birimi, Yerel Para Birimi cinsinden Toplam Satışlar ve Toplam Satışlar'ı gösteren tablo.

Dikkat edilmesi gerekenler ve sınırlamalar

Kullanıcı tanımlı işlevler şu anda önizleme aşamasındadır ve önizleme sırasında aşağıdaki önemli noktalara ve sınırlamalara dikkat edin:

Genel:

  • Hizmette UDF'ler oluşturulamaz veya modellenemez DAX.

  • Modelde bir UDF gizlenemez veya gizliliği kaldırılamaz.

  • UDF'ler görüntüleme klasörlerine yerleştirilemiyor.

  • Şeritte 'işlev oluştur' düğmesi yok.

  • UDF'ler çevirilerle birleştirilemez.

  • UDF'ler tablo içermeyen modellerde desteklenmez.

  • Object-Level Güvenliği (OLS) işlevlere aktarılmaz ve tam tersi de geçerli değildir. Örneğin, güvenli ölçüye Fbaşvuran aşağıdaki işlevi MyMeasure göz önünde bulundurun:

    function F = () => [MyMeasure] + 42
    

    MyMeasure nesne düzeyi güvenlik kullanılarak güvenli hale getirildiğinde, F işlevi otomatik olarak güvenli hale getirilmemiştir. erişimi Folmayan bir kimlik altında çalıştırılırsaMyMeasure, yok gibi MyMeasure davranır. İşlev adlarında ve açıklamalarında güvenli nesneleri ortaya çıkarmaktan kaçınmanızı öneririz.

  • Formül düzeltme ve bağımlılık hesaplaması desteklenir ve niteliksiz adlarla ilgili bilinen bir sınırlama vardır. Nitelenmemiş adlar ölçü başvuruları olarak yorumlandığından, sütunlara başvurmaları amaçlandığında güvenilir bir şekilde sabitlenemez veya bağımlılık izlemeye eklenemezler. Niteliksiz ad, tablo ön eki içermeyen bir nesne referansıdır.

  • CalendarRef ColumnRef, MeasureRefve TableRef tür ipuçları, önizleme aşamasındayken tüm işlev çağrı sitelerinde kabul edilemeyebilir. Kullanıcı AnyRef'e geri dönüş yapabilir.

UDF tanımlama:

  • Özyineleme veya karşılıklı özyineleme desteklenmez.
  • İşlev aşırı yüklemesi desteklenmez.
  • Açık dönüş türleri desteklenmiyor.

UDF parametreleri:

  • İsteğe bağlı parametreler desteklenmez.
  • Parametre açıklamaları desteklenmez.
  • UDF'ler bir enum değer döndüremez. İşlev parametreleri olarak değerleri kabul enum eden yerleşik işlevler bu bağlamda UDF'leri kullanamaz.
  • İpucu expr türüne ait ilişkisiz parametreler değerlendirilmez.

IntelliSense Desteği:

  • UDF'ler canlı bağlantı veya bileşik modellerde kullanılabilse de IntelliSense desteği yoktur.
  • UDF'ler görsel hesaplamalarda kullanılabilse de, görsel hesaplamalar formül çubuğunda UDF'ler için IntelliSense desteği yoktur.
  • TMDL Görünümü, UDF'ler için sınırlı IntelliSense desteğine sahiptir.

Bilinen hatalar

Aşağıdaki sorunlar şu anda bilinmektedir ve işlevselliği etkileyebilir:

  • UDF'leri içeren bazı gelişmiş senaryolar ayrıştırıcı tutarsızlıklarına neden olabilir. Örneğin, kullanıcılar sütunları parametre olarak expr geçirirken veya nitelenmemiş sütun başvuruları kullanırken kırmızı alt çizgiler veya doğrulama hataları görebilir.