Hogyan tehető az aktuális nap "Default Member"-ré
Felhasználóink gyakran kérik, hogy a riport megnyitásakor mindig az aktuális napi (havi) adatok jelenjenek meg, és ne kelljen nekik minden nap újra és újra kiválasztani azt. Ezen kívánságukat úgy tudjuk kielégíteni, hogy az idő dimenzió Default Member-ét folyamatosan átírjuk az aktuális napra.
Mi az a Default Member?
A Default Member a dimenzió egy kitüntetett eleme, amely nélkülözhetetlen az adatkockák működéséhez. Minden dimenziónak van Default Member - e. Ha mi nem határozzuk meg a Default Member-t, akkor azt megteszi majd az Analysis Services.
Miért szükséges, hogy legyen Default Member?
Könnyen belátható, hogy egy háromdimenziós kocka egy síkjának kijelöléséhez szükséges megadnunk a síkot határoló két dimenziót, és a harmadik dimenzió egy koordinátáját (elemét)
Az MDX, - az Analysis Services lekérdező nyelve - azonban lehetőséget biztosít nekünk, hogy a „harmadik dimenzió” elemének (koordinátájának) kijelölését elhagyhassuk. Ebben az esetben az Analysis Services a Default Member-t jelöli ki, mint „harmadik” koordináta.
Mi pont ezt a tulajdonságát akarjuk kihasználni. Ha nem jelöljük meg a riporton, hogy az mely időszakra vonatkozik, akkor az Analyis Services a „Default Member” értékét fogja használni, és nekünk már csak arról kell gondoskodnunk, hogy a Default Member mindig az aktuális nap legyen.
A következőben bemutatom azokat a módszereket, amelyek segítségével meghatározhatjuk az „aktuális napot” és amelyek segítségével az „aktuális nap” Default Member-ré tehető
Módszerek:
- Explicit módszer: Aktuális dátumot magunk jelöljük ki a betöltési folyamat részeként
- Utolsó nem üres nap módszer. Az aktuális napot az adatkockáink adatai alapján határozzuk meg
- Rendszerdátum módszer: Az aktuális napot a rendszerdátum határozza meg
Explicit módszer
A módszer lényege, hogy a betöltési folyamat részeként határozzuk meg, hogy melyik nap legyen az aktuális
Az idő dimenzió tábla felépítése
A megvalósítás során először az idő dimenzió táblájában megjelöljük az aktuális napot, majd létrehoznunk egy [Ez a mai dátum] member properties-t és a Default Member-t arra a dimenzió elemre állítjuk, akinek az [Ez a mai dátum] member property-je = „Igen”
Lefordítva mindezt MDX-re:
Filter([Fiscal Time].[Fiscal Time].[day].members,
[Fiscal Time].[Fiscal Time].Properties("Ez a mai nap") = „Igen”).Item(0)
Utolsó nem üres nap módszer
Az aktuális napot meghatározhatjuk explicit módon úgy, hogy mi magunk jelöljük ki azt (mint az előző módszer esetében). De az aktuális napot adatkockáink adataiból is kikövetkeztethetjük.
Képzeljük el, hogy adatkockáinkba minden nap betöltjük az előző napi adatokat. Ebben az esetben az aktuális napot meghatározhatjuk úgy, hogy egy rendezett halmazba gyűjtjük azokat a napokat, amelyekre már töltöttünk adatot, és azt mondjuk hogy az aktuális nap legyen egyenlő ezen rendezett halmaz utolsó elemével:
Tail(NonEmpty([Fiscal Time].[Fiscal Time].[Day].members), 1).item(0)
A fenti MDX lekérdezést az alábbiak szerintire kell átalakítanunk, ha az adatkockák 0 értéket tartalmaz:
Tail(Filter([Fiscal Time].[Fiscal Time].[Day].members
([Line Item].[Line Item].[Fact]) <> 0),1).Item(0)
Rendszerdátum módszer - StrToMember
Ha igaz az, hogy az aktuális nap egyenlő a rendszerdátummal, akkor már csak egy olyan függvényt kell találnunk, amelyik visszaadja a rendszerdátumot, és azt egy dimenzió elem nevére tudja formázni. Íme:
StrToMember("Time.[1998].[Q1].&["Str(Month(Now()))+"]")
A fenti példa kicsit sánta, de jól szinbolizálja, hogy az str(), a now() és a DatePart() VBA függvényekkel előállítható a naptári idő dimenziónk egyik elemének neve, amelyet az StrToMember() függvény segítségével Default Member-ré konvertálhatunk
Rendszerdátum módszer - MemberValue
Jobb eredményt kapunk, ha nem az általunk előállított unique névre szűrjük az idő dimenziót, hanem egy konkrét dátumra. Az Analysis Services minden egyes dimenzióelemről tárolja annak azonosítóját, nevét és tárolhatja a dimenzióelem értékét (MemberValue). Ha a MemberValue tulajdonságban eltároljuk a dimenzió elem dátum kódját (2006-06-26), akkor arra tudunk szűrni MDX-ből:
Filter([Fiscal Time].[Fiscal Time].[Day], [Fiscal Time].[Fiscal Time].MemberValue = vba![date]()).Item(0)
Kapcsolódó anyagok:
Felhasznált irodalom:
- MSDN: Best Practices for Business Intelligence Using the Microsoft Data Warehousing Framework
- SQL Server 2005 Books Online: Defining a Default Member
Kővári Attila - BI projekt
Új hozzászólás