Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
DAX uživatelem definované funkce jsou aktuálně ve verzi Preview.
DAX uživatelem definované funkce (UDF) umožňují balit DAX logiku a opakovaně ji používat jako jakoukoli jinou DAX funkci. Funkce definované uživatelem zavádějí nové FUNCTION klíčové slovo, volitelné parametry (skalární, tabulkové a referenční) a pomocníky pro kontrolu typů, které zvyšují bezpečnost a přehlednost při vytváření funkcí. Po definování funkce uživatele ji můžete použít v metrice, počítaném sloupci, vizuálním výpočtu nebo dokonce v jiných uživatelem definovaných funkcích. Uživatelé můžou centralizovat obchodní pravidla, zlepšit udržovatelnost a bezpečně vyvíjet výpočty v průběhu času. Funkce jsou prvotřídní objekty modelu, které můžete vytvářet a spravovat v zobrazení dotazu a v zobrazení TMDL a lze je zobrazit v Průzkumníku modelů pod uzlem "Funkce".
Povolení uživatelem definovaných funkcí
Vyzkoušení funkcí definovaných uživatelem v desktopové verzi:
- Přejděte na Soubor > Možnosti a nastavení > Možnosti.
- Vyberte funkce ve verzi Preview a zkontrolujte DAX uživatelem definované funkce.
- Vyberte OK a restartujte Power BI Desktop.
Definování a správa uživatelem definovaných funkcí
Pro definování a správu funkcí existuje několik umístění:
- DAX zobrazení dotazu (DQV). Definujte a upravte funkce v DQV. DQV také obsahuje možnost Rychlé dotazy v místní nabídce (Vyhodnocení, Definování a vyhodnocení, a Definování všech funkcí v modelu), které vám pomůžou rychle testovat a spravovat UDFs (uživatelsky definované funkce).
- Zobrazení TMDL UDFs (uživatelem definované funkce) mohou být také vytvářeny a upravovány v TMDL. Zobrazení TMDL obsahuje také místní nabídku Skript TMDL do.
- Průzkumník modelů. Existující funkce je možné zobrazit pod uzlem Functions v Průzkumníku modelů.
Při definování funkce definované uživatelem postupujte podle těchto požadavků na pojmenování:
Názvy funkcí:
- Musí být v rámci modelu dobře formátovaný a jedinečný.
- Může obsahovat tečky (tečky) pro mezery mezi názvy (např. Microsoft.PowerBI.MyFunc). Nelze začínat nebo končit tečkou nebo mít po sobě jdoucí období.
- Jinak než tečky mohou názvy obsahovat pouze alfanumerické znaky nebo podtržítka. Nejsou povoleny žádné mezery ani speciální znaky.
- Nesmí kolidovat s integrovanými funkcemi nebo rezervovanými slovy (např. míra, funkce, definovat).
Názvy parametrů:
- Může obsahovat pouze alfanumerické znaky nebo podtržítka. Období nejsou povolená.
- Nesmí se jednat o rezervované slovo.
Používání zobrazení dotazu DAX
V zobrazení dotazu můžete definovat, aktualizovat a vyhodnotit uživatelem definované funkce DAX . Další informace o DAX zobrazení dotazu najdete v DAX zobrazení dotazu.
Obecný formulář
DEFINE
/// Optional description above the function
FUNCTION <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>
Návod
Používá se /// pro popisy funkcí. Jednořádkové (//) nebo víceřádkové komentáře/* */ se v popisech funkcí IntelliSense nezobrazí.
Příklad: Jednoduchá daňová funkce
DEFINE
/// AddTax takes in amount and returns amount including tax
FUNCTION AddTax =
( amount : NUMERIC ) =>
amount * 1.1
EVALUATE
{ AddTax ( 10 ) }
// Returns 11
Uložení do modelu
Uložení UDF (uživatelsky definovanou funkci) z DAX pohledu dotazu do modelu:
- Klikněte na Aktualizovat model se změnami pro uložení všech UDF v dotazu.
- Nebo klikněte na Aktualizovat model: Přidat novou funkci nad definovanou funkcí, aby se uložila jedna UDF.
Použití zobrazení TMDL
V zobrazení TMDL můžete definovat a/nebo aktualizovat uživatelem definované funkce. Další informace o zobrazení TMDL najdete v sekci TMDL view.
Obecný formulář
createOrReplace
/// Optional description above the function
function <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>
Příklad: Jednoduchá daňová funkce
createOrReplace
/// AddTax takes in amount and returns amount including tax
function AddTax =
(amount : NUMERIC) =>
amount * 1.1
Uložení do modelu
Kliknutím na tlačítko Použít v horní části zobrazení uložte všechny funkce definované uživatelem ve skriptu do modelu.
Použití skriptu TMDL v projektu Power BI
Funkce definované uživatelem (UDFs) jsou rovněž zahrnuty ve skriptu TMDL pro sémantický model při využití projektu Power BI. Najdete je ve functions.tmdl složce definice .
Použití Průzkumníka modelů
Všechny uživatelem definované funkce v modelu můžete zobrazit z Průzkumníka modelů v uzlu Funkce . Další informace o Průzkumníku modelů najdete v tématu Průzkumník modelů.
V DAX zobrazení dotazu můžete pomocí rychlých dotazů v nabídce zobrazené po kliknutí pravým tlačítkem myši v Průzkumníku modelů snadno definovat a vyhodnotit funkce.
V zobrazení TMDL můžete přetáhnout funkce na plátno nebo pomocí skriptu TMDL v místní nabídce UDF v Průzkumníku modelů vygenerovat skripty.
Kontrola uživatelem definovaných funkcí pomocí dynamických zobrazení správy
Funkce definované uživatelem v modelu můžete zkontrolovat pomocí dynamických spravovacích zobrazení (DMV). Tato zobrazení umožňují dotazovat se na informace o funkcích, včetně funkcí definovaných uživatelem.
Můžete použít funkci INFO.FUNCTIONS pro kontrolu uživatelských funkcí v modelu. Chcete-li omezit výsledek pouze na funkce definované uživatelem, nastavte ORIGIN parametr jako 2.
EVALUATE INFO.FUNCTIONS("ORIGIN", "2")
Tento dotaz vrátí tabulku všech uživatelsky definovaných funkcí, které jsou aktuálně v modelu, včetně názvu, popisu a přidružených metadat.
Použití uživatelem definované funkce
Jakmile je uživatelsky definovaná funkce uložena v modelu, můžete ji volat z metrik, počítaných sloupců, vizuálních výpočtů a dalších uživatelsky definovaných funkcí. Funguje to stejně jako volání předdefinovaných DAX funkcí.
Volání uživatelem definované funkce ve výrazu
Pomocí UDF v míru můžete použít logiku, kterou můžete opakovaně použít, s úplným filtrovacím kontextem.
Total Sales with Tax = AddTax ( [Total Sales] )
Ukázková míra je znázorněna v následující tabulce:
Volání uživatelem definované funkce v počítaném sloupci
Funkce definované uživatelem se dají použít v počítaném sloupci, aby se na každý řádek tabulky použila opakovaně použitelná logika.
Poznámka:
Při použití uživatelské funkce v počítaném sloupci zajistěte, aby funkce vracela konzistentní typ skaláru. Další informace najdete v tématu Parametry . V případě potřeby převeďte výsledek na požadovaný typ pomocí CONVERT nebo podobných funkcí.
Sales Amount with Tax = CONVERT ( AddTax ( 'Sales'[Sales Amount] ), CURRENCY )
Tuto ukázkové míru můžeme vidět v následující tabulce:
Volání uživatelsky definované funkce ve vizuálním výpočtu
Ve vizuálním výpočtu můžete použít funkce definované uživatelem k aplikaci logiky přímo ve vizuálu. Další informace o vizuálních výpočtech naleznete v tématu Vizuální výpočty.
Poznámka:
Vizuální výpočty pracují pouze s poli, která jsou ve vizuálu přítomna. Nemají přístup k objektům modelu, které nejsou součástí vizuálu, a v tomto kontextu nemůžete předat objekty modelu (například sloupce nebo míry, které nejsou ve vizuálu) do UDF.
Sales Amount with Tax = AddTax ( [Sales Amount] )
Tuto ukázku míry vidíme v následující tabulce:
Volání uživatelem definované funkce v jiné uživatelem definované funkci
Uživatelsky definované funkce můžete vnořit voláním jedné funkce z druhé. V tomto příkladu definujeme jednoduchou UDF AddTax a zavoláme ji v jiné UDF, 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
Parametry
DAX Uživatelsky definované funkce mohou přijímat žádný nebo více parametrů. Když definujete parametry pro UDF, můžete volitelně zadat rady typu pro každý parametr:
-
Typ: jaký typ hodnoty parametr přijímá (
AnyVal,Scalar,Table, neboAnyRef). -
Podtyp (pouze pro skalární typ): konkrétní skalární datový typ (
Variant,Int64,Decimal,Double,String,DateTime, ,BooleanneboNumeric). -
ParametrMode: při vyhodnocení argumentu (
valneboexpr).
Nápovědy k typu jsou ve formuláři: [type] [subtype] [parameterMode]
Do každého parametru můžete zahrnout všechny, některé nebo žádné z těchto typových nápověd, což vaše funkce učiní bezpečnějšími a předvídatelnějšími v místech volání. Pokud vynecháte všechno a stačí napsat název parametru, který se chová jako AnyVal val, což znamená, že argument se vyhodnotí okamžitě při volání. To je užitečné pro jednoduché funkce.
Typ
Typ definuje kategorii argumentu, který parametr přijímá a zda se předává jako hodnota nebo výraz.
V parametrech UDF existují dvě rodiny DAX typů: typy hodnot a typy výrazů:
-
Typy hodnot: Tento argument se vyhodnotí okamžitě (dychtivá vyhodnocení), když je funkce volána a výsledná hodnota se předá do funkce.
-
AnyVal: Přijímá skalár nebo tabulku. Toto je výchozí nastavení, pokud vynecháte typ parametru. -
Scalar: Přijímá skalární hodnotu (může navíc přidat podtyp). -
Table: Přijímá tabulku.
-
-
Typy výrazů: tento argument předává nevyhodnocený výraz (líné vyhodnocení). Funkce rozhoduje, kdy a v jakém kontextu ji má vyhodnotit. To je vyžadováno pro referenční parametry a užitečné, pokud potřebujete řídit kontext filtru (např. uvnitř CALCULATE).
exprtypy můžou být odkazy na sloupec, tabulku, kalendář nebo měřítko.-
AnyRef: Přijímá odkaz (sloupec, tabulka, kalendář nebo míra).
-
Podtyp
Podtyp umožňuje definovat konkrétní Scalar datový typ. Pokud definujete podtyp, nemusíte parametr explicitně definovat jako Scalar typ, předpokládá se to automaticky.
Podtypy jsou:
-
Variant: Přijímá libovolný skalární. -
Int64: Přijímá celé číslo. -
Decimal: Přijímá desetinné číslo s pevnou přesností (například Měna nebo Peníze). -
Double: Přijímá číslo s plovoucí desetinnou čárkou. -
String: Přijímá text. -
DateTime: Přijímá datum a čas. -
Boolean: Přijímá TRUE/FALSE. -
Numeric: Přijímá libovolnou číselnou hodnotu (Int64,DecimalneboDoublepodtypy)
RežimParametru
ParametrMode určuje, kdy a kde se výraz parametru vyhodnocuje. Toto jsou:
-
val(dychtivá vyhodnocení):: Výraz se vyhodnotí jednou před vyvoláním funkce. Výsledná hodnota se pak předá do funkce. To je běžné u jednoduchých skalárních nebo tabulkových vstupů. Toto je výchozí nastavení, pokud vynecháte parameterMode u parametru. -
expr(opožděné vyhodnocení):: Výraz se vyhodnocuje uvnitř funkce, potenciálně v jiném kontextu (např. kontext řádku nebo kontext filtru) a případně vícekrát, pokud se odkazuje vícekrát nebo uvnitř iterací. To je vyžadováno pro referenční parametry a užitečné v případě, že potřebujete řídit kontext vyhodnocení.
Typ Scalar může použít buď val nebo expr. Použijte val , když chcete skalár vyhodnotit jednou v kontextu volajícího. Použijte expr , když chcete odložit vyhodnocení a případně použít kontext uvnitř funkce. Viz příklad: Parametr tabulky jako příklad.
Typ AnyRef musí být expr, protože jeho odkazy (sloupce, tabulky, výpočty atd.) je třeba vyhodnotit v kontextu funkce.
Příklad: Přetypování 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
Toto používá Scalar typ, Int64 podtyp a val parametrický režim pro předvídatelné zaokrouhlování a převod textu na číslo a také zajištění, aby se všechny výrazy vyhodnocovaly bezodkladně. Toho můžete dosáhnout také tak, že zahrnete Int64 podtyp, jak je vidět v následujícím příkladu. Nečíselné řetězce způsobí chybu.
DEFINE
/// returns x as an Int64
FUNCTION CastToInt = (
x : INT64
) =>
x
EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5
Příklad: Parametr tabulky (hodnota vs. výraz)
Chcete-li ilustrovat, jak parametr režimu UDF ovlivňuje kontext filtru, zvažte dvě funkce, které obě spočítají řádky v tabulce Sales. Oba používají CALCULATETABLE(t, ALL('Date')) ve svých tělech, ale jeden parametr je deklarován jako val (horlivé vyhodnocování) a druhý parametr jako expr (líné vyhodnocování):
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 vrátí počet prodejů pouze pro fiskální rok 2020. Tabulka Sales je již filtrována podle roku před zadáním funkce, takže ALL('Date') uvnitř funkce nemá žádný vliv.
CountRowsLater vrátí počet prodejů za všechny roky. Funkce obdrží nehodnocený výraz tabulky a vyhodnotí ho pod ALL('Date'), odstraněním externího filtru roku.
Kontrola typu
Kontrola typů v uživatelsky definovaných funkcích může být provedena s novými i stávajícími funkcemi kontroly typů, které můžete volat uvnitř těla funkce, abyste ověřili běhový typ předaných parametrů. To umožňuje uživatelem definovaným funkcím používat kontrolu kontextu, ověřovat parametry předem, normalizovat vstupy před výpočtem.
Poznámka:
U expr parametrů parameterMode se kontroly typů vyskytují, když je parametr odkazován v těle funkce (ne v době volání funkce).
Dostupné funkce kontroly typů
UDF (funkce definované uživatelem) můžou použít následující funkce k otestování skalárních hodnot. Každá vrácená hodnota TRUE/FALSE závisí na tom, jestli je zadaná hodnota daného typu.
| Kategorie | Functions |
|---|---|
| Numeric | ISNUMERIC, ISNUMBER |
| Double | ISDOUBLE |
| Celé číslo | ISINT64, ISINTEGER |
| Decimal | ISDECIMAL, ISCURRENCY |
| String | ISSTRING, ISTEXT |
| logický | ISBOOLEAN, ISLOGICAL |
| Datum a čas | ISDATETIME |
Příklad: Kontrola, jestli je parametr řetězcem
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 zabráníte chybám a můžete se rozhodnout, jak zpracovat neřetězcový vstup do funkce (v tomto příkladu vrátí BLANK).
Příklad: Přijetí více typů parametrů
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"
Tento příklad ukazuje, jak pomocí kontroly typů v uživatelsky definovaných funkcích spolehlivě přijmout různé vstupní typy a vrátit jeden předvídatelný výsledek.
GetCurrencyName přebírá jeden argument, currencykterý může být buď celočíselným klíčem měny, nebo textovým kódem měny. Funkce zkontroluje typ argumentu pomocí ISINT64. Pokud je vstup celé číslo, zavolá pomocnou rutinu GetCurrencyNameByKey , která vyhledá název měny na základě klíče měny. Pokud vstup není celé číslo, zavolá pomocníka GetCurrencyNameByCode , který vyhledá název měny na základě kódu měny.
Definování více funkcí najednou
Funkce definované uživatelem umožňují definovat několik funkcí v jednom dotazu nebo skriptu, což usnadňuje uspořádání opakovaně použitelné logiky. To je zvlášť užitečné, když chcete seskupovat související výpočty nebo pomocné rutiny. Funkce je možné vyhodnotit společně nebo jednotlivě.
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
Rozšířený příklad: Flexibilní převod měny
Abychom ukázali, jak DAX UDF (funkce definované uživatelem) může zpracovávat složitější logiku, podíváme se na scénář převodu měny. Tento příklad používá kontrolu typů a vnořené funkce k převodu dané částky na cílovou měnu pomocí průměrného nebo koncového směnného kurzu pro dané datum.
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
Funkce ConvertToCurrency přijímá flexibilní vstupní typy pro měnu i datum. Uživatelé můžou zadat buď klíč měny, nebo klíč data přímo, nebo zadat kód měny nebo standardní hodnotu data. Funkce zkontroluje typ každého vstupu a zpracuje ho odpovídajícím způsobem: pokud pCurrency je celé číslo, považuje se za klíč měny. V opačném případě funkce předpokládá kód měny a pokusí se přeložit odpovídající klíč.
pDate se řídí podobným vzorem, pokud se jedná o celé číslo, považuje se za klíč kalendářního data; jinak funkce předpokládá, že se jedná o standardní hodnotu data a pomocí pomocné funkce se převede na klíč ConvertDateToDateKey data. Pokud funkce nemůže určit platnou sazbu exchnage, vrátí zprávu "není k dispozici žádný směnný kurz".
Tuto logiku pak můžete použít k definování míry, jako je například Celkové prodeje v místní měně.
Total Sales in Local Currency =
ConvertToCurrency (
SELECTEDVALUE ( 'Currency'[Code] ),
SELECTEDVALUE ( 'Date'[DateKey] ),
TRUE,
[Total Sales]
)
Můžete ho volitelně spárovat s řetězcem dynamického formátu a zobrazit výsledek v příslušném formátu měny.
CALCULATE (
MAX ( 'Currency'[Format String] ),
'Currency'[Code] == SELECTEDVALUE ( 'Currency'[Code] )
)
Příklad výsledku můžete vidět na následujícím snímku obrazovky.
Úvahy a omezení
Uživatelem definované funkce jsou aktuálně ve verzi Preview a během verze Preview mějte na paměti následující aspekty a omezení:
Obecné:
- Nelze vytvářet nebo modelovat DAX uživatelsky definované funkce ve službě.
- Nelze skrýt nebo zobrazit uživatelsky definovanou funkci v modelu.
- Uživatelem definované funkce nelze umístit do zobrazovaných složek.
- Na pásu karet není tlačítko Vytvořit funkci.
- Uživatelem definované funkce nelze kombinovat s překlady.
- Funkce definované uživatelem nejsou podporovány v modelech bez tabulek.
Definování uživatelsky definované funkce:
- Rekurze nebo vzájemné rekurze nejsou podporovány.
- Přetížení funkce není podporováno.
- Explicitní návratové typy nejsou podporovány.
Parametry UDF (definované uživatelem):
- Volitelné parametry nejsou podporovány.
- Popisy parametrů nejsou podporovány.
- Funkce definované uživatelem nemohou vrátit hodnotu
enum. Vestavěné funkce, které přijímajíenumhodnoty jako své parametry, nebudou v tomto kontextu moct využívat uživatelsky definované funkce (UDF). - Nevázané parametry nápovědy
exprtypu se nevyhodnocují.
Podpora Technologie IntelliSense:
- I když se funkce definované uživatelem dají použít v živých připojeních nebo složených modelech, není k dispozici žádná podpora Technologie IntelliSense.
- I když se funkce definované uživatelem dají použít ve vizuálních výpočtech, řádek vzorců vizuálních výpočtů nepodporuje funkci IntelliSense pro uživatelem definované funkce.
- Zobrazení TMDL nemá správnou podporu IntelliSense pro uživatelem definované funkce.
Známé chyby
V současné době jsou známé následující problémy a můžou mít vliv na funkce:
- Odkazy na objekt tabulkového modelu (např. míra, tabulka, sloupec) v UDF se při přejmenování těchto objektů automaticky neaktualizují. Pokud přejmenujete objekt, na který závisí UDF, text funkce bude stále obsahovat starý název. Pokud chcete aktualizovat všechny odkazy na přejmenovaný objekt, musíte ručně upravit výraz UDF.
- Některé pokročilé scénáře zahrnující funkce definované uživatelem můžou vést k nekonzistencím syntaktického analyzátoru. Uživatelé mohou například vidět červené podtržení nebo chyby ověření při předávání sloupců jako parametrů
exprnebo při použití nekvalifikovaných odkazů na sloupce.