Privát dimenziók az Analysis Services 2005-ben
Az Analysis Services 2000-ben lehetőségem volt arra, hogy
-
lokális dimenziókat hozzak létre (Private Dimension) és
-
egyedi szűrőfeltételeket adhattam meg (Source Table Filter)
Volt például egy DimCikkMaster tábla, ami tartalmazta az összes cikket. (Belföldre, exportra gyártottat, vásárolt készletet, .) és volt két adatkocka: Belföldi- és Export értékesítés. Mind a két adatkocka ugyanazt a DimCikkMaster táblát használta, és amikor kockát építettünk belőlük, a "Source Table Filter" segítségével meghatároztuk, hogy
-
A belföldi értékesítés kocka csak azokat a cikkeket tartalmazza, amelyeket már értékesítettek belföldre
-
Az export értékesítés pedig csak azokat, amelyeket exportra értékesítettek
Boldog volt a felhasználó, mert csak azokat a cikkeket látta, amelyekre ténylegesen történt értékesítés, és boldog volt a BI fejlesztő, mert egy helyen kellett karbantartani a cikkeket.
Persze mondhatnák, hogy kliens oldalon el lehet tüntetni a kockában nem szereplő dimenzió elemeket a NON EMPTY vagy NON EMPTY CROSSJOIN MDX kulcsszavak használatával, csak hát kinek van lehetősége a kliens alkalmazások MDX Select-jének szerkesztésére. Az üres sorok, és oszlopok elrejtésére persze minden kliens alkalmazás biztosít lehetőséget, de az üres lapozó dimenzió elemek elrejtésére már egyik sem.
És mi a helyzet az Analysis Services 2005-ben?
A Books OnLine (BOL) szerint: "Private dimensions, which are available in Microsoft SQL Server 2000 Analysis Services, are not available in Microsoft SQL Server 2005 Analysis Services."
Tehát az AS2005-ben megszűnt a lokális dimenziók támogatása. És mi a helyzet a source table filter-rel? Ha végig nézzük a kocka tulajdonságait, nem találunk olyan lehetőséget, ahol megadhatnánk. Ha rákeresünk a "Source Table Filter" -re a BOL-ban, még csak találatot sem kapunk. Ha felmegyünk az internetre, ott is csak "egykockás" adatbázisra találunk megoldást.És mi történik, ha SQL 2000-es OLAP adatbázist migrálunk 2005-re? (természetesen olyat, amely tartalmaz lokális dimenziót és Source Table Filter-t).
Nos a két azonos nevű lokális dimenzióból lesz két különböző nevű "shared" dimenziónk (Pl.: két lokális Cikk dimenzióból lesz egy "Cikk" és egy "Cikk 1" shared dimenziónk.) és a source table filter eltűnik. Azaz a belföldi értékesítés kockában megtalálhatóak az export cikkek és az Export kockában megtalálhatóak a belföldi cikkek is.
És mi a megoldás?
Csak emlékeztetőül: Azt akarjuk megvalósítani, hogy a felhasználó csak azokat a cikkeket lássa, amelyre saját kockájában található adat. Tehát a dimenzió elemei között ne jelenjenek meg olyan cikkek, amire nem történt értékesítés (Ne csak a táblázatban ne jelenjenek meg, hanem még kiválasztani se lehessen olyan cikket, amire nem volt értékesítés).
Lefordítva AS2000 -es környezetre
-
Egy DimCikkMaster Tábla SQL adatbázisban
-
Egy cikk nevű lokális (private) dimenzió a belföldi értékesítés kockába, amely csak a belföldi cikkeket tartalmazza
-
Egy cikk nevű lokális (private) dimenzió az export értékesítés kockába, amely csak az export cikkeket tartalmazza
És akkor a megoldás AS2005 -re:
-
Egy DimCikkMaster Tábla SQL adatbázisban
-
Két view az adatbázisban vagy két named query az adatforrás nézetben (Data Source View, DSV) az egyik a belföldi értékesítés cikkeire szűri a DimCikkMaster tábla adatait, a másik az exportra
-
Két shared dimenzió az adatforrás nézet alapján. Az egyik neve Cikk_Belf, a másik neve Cikk_Exp
-
A Belföldi értékesítés kocka a Cikk_Belf dimenzióval van dimenzionálva, az export az exporttal
-
ÉS a két kockában átnevezzük a dimenziókat. A Cikk_Belf-et Cikk-re és a Cikk_Exp-et szintén Cikk-re. (Ha Excel 2000-t vagy 2003-at használunk kliens eszköznek, akkor ezt nem szükséges megtennünk, mert az excel a hierarchia neveket fogja megjeleníteni és nem a dimenziók nevét. Más kliens alkalmazások viszont használhatják a dimenziók nevét)
És a felhasználó csak Cikk dimenziókat lát, és azok elemei mindig az elemezni kívánt terület adatai alapján fognak változni. Ha értékesítést néz, akkor az értékesített cikkeket, ha termelést néz, akkor a termeltet, ha készletet néz, akkor a készleten lévő cikkeket, ... (Köszönet Karcsinak az ötletért.)
A módszer egyetlen hátulütője, hogy nem adhatunk meg defaultMember-t a dimenzió "Default Member" tulajdonságánál, mert hibaüzenetet kapunk:
The level '[Cikk_Belf]' object was not found in the cube when the string, [Cikk_Belf].[Termekcsoport].&[3], was parsed.
Logikus, hiszen "Cikk_Belf"-fel nincs dimenzionálva a kocka, csak Cikk-kel, így a DefaultMember-t ([Cikk_Belf].[Termekcsoport].&[3]) nem találja.
Sokáig nem találtam megoldást a problémára de most megleltem:
Az Analysis Services 2000 úgy állította be a DefultMembert, hogy kiadta az Alter Cube utasítást. És innen jött az ötlet. Miért nem csinálhatnánk ezt meg az Analysis Services 2005-tel? Hiszen itt van nekünk az MDX Script! ... Szóval a megoldás:
Ki kell egészíteni a kocka MDX Script-jét egy olyan ALTER CUBE utasítással, amely, - miután elkészült a kocka és annak összes számított mezője - meghatározza a default member-eket. És itt már a kocka saját dimenziójának elemére tudunk hivatkozni, nem a shared dimenzió egy elemére!
ALTER CUBE CURRENTCUBE UPDATE DIMENSION [Cikk],
DEFAULT_MEMBER = [Cikk].[Brand].&[3];
Kővári Attila - BI projekt
Új hozzászólás