Privát dimenziók az Analysis Services 2005-ben

Az Analysis Services 2000-ben lehetőségem volt arra, hogy

  1. lokális dimenziókat hozzak létre (Private Dimension) és
  2. 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

  1. A belföldi értékesítés kocka csak azokat a cikkeket tartalmazza, amelyeket már értékesítettek belföldre
  2. 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

  1. Egy DimCikkMaster Tábla SQL adatbázisban
  2. Egy cikk nevű lokális (private) dimenzió a belföldi értékesítés kockába, amely csak a belföldi cikkeket tartalmazza
  3. 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:

  1. Egy DimCikkMaster Tábla SQL adatbázisban
  2. 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
  3. Két shared dimenzió az adatforrás nézet alapján. Az egyik neve Cikk_Belf, a másik neve Cikk_Exp
  4. A Belföldi értékesítés kocka a Cikk_Belf dimenzióval van dimenzionálva, az export az exporttal
  5. É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)

Private dimenziók AS2005-ben

É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