Po časových kalkulacích (http://www.neoral.cz/2015/11/mdx-tutorial-10-casove-funkce.html) Vás vítám vás u dalšího dílu MDX tutorialu. Tentokrát s příkazem Scope v calculate scriptu. Zlí jazykové tvrdí, že pořádné MDX aplikace začínají právě příkazem Scope. Takže o čem je Scope assignement v MDX? Jaké jsou výhody zápisu s použitím Scope proti počítaným členům a jaké jsou nevýhody?
Na začátek syntaxe
Scope (Subcube);
THIS = výpočet;
END Scope;
Příkaz Scope přepisuje hodnoty buněk v „Subkostce“ definované příkazem. Příkaz This = říká přiřaď hodnotu do dané Subkostky. Jedná se o párový příkaz končící příkazem END Scope;
Výhody – počítané členy rozšiřují kostku o další prvek. Scope může přepisovat hodnoty v počítaných členech, ale také hodnoty „perzistentních měřítek“. V některých případech můžete vyřešit stejný problém jak přes Scope, tak přes počítaný člen. V nekterých případech můžete díky “Scope“ dosáhnout i lepšího výkonu. Přirovnání z transakčního světa, scope má zkompilovaný exekuční plán.
Nevýhody – narozdíl od počítaných členů se hůř ladí. Počítaný člen můžeme napsat prvně na úrovni dotazu (With member) a poté jej uložit do kostky (Create member currentcube). Takováto přímá kompatibilita se Scope příkazem neexistuje. Pokud chcete příkaz odladit. Napíšete jej prvně jako počítaný člen, a pak jej do calculate scriptu přepíšete. Toto může vést k tomu, že výpočet buď funguje, nebo ne :) Psaní Scope příkazů může být návykové. Proto někteří jedinci můžou sklouznout i k tomu, že přes Scope řeší to, co by se dalo jednoduššeji a přehledněji řešit počítaným členem. Přebrat kostku po někom takovém a zorientovat se je „radost“ :)
I když je odstavec nevýhody proti výhodám delší, při správném použití výhody přetrvávají. Jen pamatujte, že: „Scope je dobrý sluha, zlý pán“ :)
Scénáře použití a příklady
Přepis stávajícího měřítka
Úprava buněk tam, kde hodnota z DW nedává smysl, aneb zahlazení stop. Podívejme se na stávající kostu z projektu MDX Tutorial (link v rozcestníku http://www.neoral.cz/2015/11/mdx-tutorail-0-rozcestnik.html). Najdeme zde měřítko Quota, které představuje plán prodejů. Plánuje se na kvartál na zaměstnance. Kvůli zachování stejné granularity, aby se daly obě faktové tabulky propojit na stejnou časovou dimenzi jsou plány navázané k prvnímu dni v daném kvartálu. Na nižších úrovních než kvartál tedy porovnání nedává smysl. Viz obrázek
Mám dvě možnosti, buď nesmyslná čísla schovám. Nebo rozpočítám na smysluplná.
Varianta 1 schovám by se dala vyřešit počítaným členem a skrytím zdrojového měřítka a nebo jak tušíte. Příkazem Scope :)
SCOPE ([Measures].[Quota]);
THIS = iif([Dim Date].[YQMD].currentmember.level.ordinal > 2
,null
,measures.currentmember
);
END SCOPE;
Výsledek
Varianta 2 „smysluplné“ rozpočítání
Číslo nastavené pro celý kvartál chci rovnoměrně rozpočítat na dny s předpokladem, že dny mají stejnou váhu.
SCOPE ([Measures].[Quota],[Dim Date].[YQMD].[Date]);
THIS = ([Dim Date].[YQMD].currentmember.parent.parent,[Measures].[Quota])/
count(
descendants([Dim Date].[YQMD].currentmember.parent.parent
,[Dim Date].[YQMD].[Date])
);
END SCOPE;
Výstup
Závěr
V dnešním díle tutorialu jsme si ukázali, jak změnit hodnotu v buňkách OLAP kostek pomocí příkazu Scope. Příšte si ukážeme jak využít příkaz Scope pro časové kalkulace uložené v dimenzi. Což nám umožní, aby jeden výpočet fungoval pro všechny relevantní měřítka a nemusela se duplikovat logika.
Žádné komentáře:
Okomentovat