Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Dosya > Seçenekleri ve ayarlar > Seçenekleri'ne gidin.
- Önizleme özellikleri'ne tıklayın ve kullanıcı tanımlı işlevleri denetleyinDAX.
- 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.
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 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.
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.
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.
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.
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:
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:
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:
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,ColumnRefveyaMeasureRefTableRef). -
Alt tür (yalnızca skaler tür için): belirli skaler veri türü (
Variant,Int64,Decimal,Double,String, ,DateTime,BooleanveyaNumeric). -
ParameterMode: bağımsız değişken değerlendirildiğinde (
valveyaexpr).
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.
exprtü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,DecimalveyaDoublealt 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.
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şleviMyMeasuregöz önünde bulundurun:function F = () => [MyMeasure] + 42MyMeasurenesne düzeyi güvenlik kullanılarak güvenli hale getirildiğinde, F işlevi otomatik olarak güvenli hale getirilmemiştir. erişimiFolmayan bir kimlik altında çalıştırılırsaMyMeasure, yok gibiMyMeasuredavranı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.
CalendarRefColumnRef,MeasureRefveTableReftü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
enumdeğer döndüremez. İşlev parametreleri olarak değerleri kabulenumeden yerleşik işlevler bu bağlamda UDF'leri kullanamaz. - İpucu
exprtü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
exprgeçirirken veya nitelenmemiş sütun başvuruları kullanırken kırmızı alt çizgiler veya doğrulama hataları görebilir.