Szűrés számított mezőre Reporting Services 2005-ben

Létrehoztam egy OLAP riportot a Reporting Services 2005 segítségével. Majd mikor olyan dimenzió elemre akartam szűrni, amelyik számított mező volt (Calculated Member), akkor a következő hibaüzenetet kaptam:

A set has been encountered that cannot contain calculated members.

Megnéztem hát milyen MDX lekérdezést rakott össze az RS2005 és két különös dolgot vettem észre:

  1. A szűrőfeltételben átadott paramétert az StrToSet MDX függvénnyel alakítja vissza SET-té, és az StrToSet függvény kap egy "CONSTRAINED" paramétert is. StrToSet (@Paraméter, CONSTRAINED). Rákerestem a BOL-ban, de nem találtam semmit. Rákerestem az interneten, és Chris cikkéből kiderült, hogy ezzel a kulcsszóval megakadályozhatjuk, hogy valaki egy dimenzió elem neve helyett olyan tárolt eljárást adjon át a dinamikusan felépített MDX-nek, ami nem egy várt feladatot hajthat végre.
  2. A másik - és a megoldás itt lesz - az RS2005 SubCube-ot használ a szűrőfeltétel helyett. Arra még nem jöttem rá, hogy a SubCube-nak mi baja a calculated member-rel, de ha kicserélem sima where feltételben megadott szűrésre, akkor tökéletesen működik. Igaz, így többé nem használhatom a query designer-t, de ez legyen a legkisebb probléma.

A megoldás

A riport teljesen egyszerű: Oszlopon a Revenue nevű measure, soron a Line item dimenzió. Szűrő feltételek (Slice) a Fiscal YTD dimenzió (Ez tartalmazza a Calculated member-t) és a Geography dimenzió. E két szűrőfeltételt kapja meg a paraméterként "grid" Dataset.

Ha tehát működővé akarjuk tenni a riportot, akkor a SubCube-ot ki kell cserélni egy olyan where feltételre, amely megkapja a lapozó dimenziók kiválasztott elemeit:

SELECT
{[Measures].[Revenue USD] } ON COLUMNS,
{[Line Item].[Line Item Name].ALLMEMBERS} ON ROWS
FROM ( SELECT ( STRTOSET(@Geography, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(@FiscalYTD, CONSTRAINED) ) ON COLUMNS FROM [Client Scorecard])) WHERE ( IIF( STRTOSET(@FiscalYTD, CONSTRAINED).Count = 1, STRTOSET(@FiscalYTD, CONSTRAINED), [Fiscal YTD].currentmember ), IIF( STRTOSET(@Geography, CONSTRAINED).Count = 1, STRTOSET(@Geography, CONSTRAINED), [Geography].currentmember ) )

Fent látható a Query designer által generált lekérdezés, alább az átalakított.

SELECT
{ [Measures].[Revenue USD]} ON COLUMNS,
{[Line Item].[Line Item Name].ALLMEMBERS} ON ROWS
FROM [Client Scorecard]
WHERE (StrToTuple(@Geography), StrToTuple(@FiscalYTD))

A megoldás egyetlen hátránya, hogy nem támogatja az egy dimenzión belül több elemre való szűrést (Multiple values)

Kővári Attila - BI projekt

Új hozzászólás