Funkcje VBA w MDX

W języku MDX  zaimplementowano pewną mało znana funkcjonalność, chodzi mianowicie o zestaw funkcji języka VBA. Tak więc jeśli chcemy przeprowadzić proste operacje podobne do tych jakie wykonujemy formułami w Excelu możemy użyć wspomnianych funkcji – do dyspozycji mamy ich naprawdę dużo (całą ich listę znajdziemy tutaj).

W tym miejscu może pojawiać się pytanie jak użyć funkcji VBA w MDX? Wymaga to rejestracji dodatkowych komponentów bądź innych niestandardowych akcji? Odpowiedź brzmi nie! Wystarczy, że uzyjemy prefiksu vba! tak jak zostało to przedstawione poniżej:

WITH MEMBER vbaTest
AS

vba!left("This is sample text",8)

SELECT 
     vbaTest on 0
FROM 
     [Adventure Works]

Rezultat jest bardzo prosty do przewidzenia, z tekstu przekazanego jako parametr wycięte zostanie pierwszego 8 znaków:

result of a queryTak więc użycie funkcji jest bardzo proste. Niemal wszystkie z nich są równie proste w użyciu. Ponadto istnieje możliwość ich zagnieżdżania tak jak poniżej:

WITH MEMBER vbaTest
AS
vba!left(vba!abs(vba!round(-23.42123,2)),1)

SELECT 
      vbaTest on 0
FROM 
      [Adventure Works]

Liczba -23.42123 zostanie zaokrąglona do 2 miejsc po przecinku. Następnie zostanie wyciągnięta wartość bezwzględna, a następnie wycięty jeden znak od lewej. Tak więc jak możemy się spodziewać wynikiem końcowym będzie liczba 2.

result of nested vba functionMożna sobie wyobrazić co trzeba by zrobić aby osiągnąć podobny efekt bez funkcji VBA. Warto również wspomnieć o użytecznej funkcji FORMAT, która pozwala np. na formatowanie naszej miary warunkowo na podstawie wartości z innego wymiaru dla przykładu wykonajmy poniższe zapytanie.

WITH MEMBER [Measures].[Internet Sales Amount BY LOCAL CURRENCY]
AS
   CASE
     WHEN
        [Customer].[Customer Geography].currentmember = [Customer].[Customer Geography].[Country].&[United States]

     THEN 
         vba!format([Measures].[Internet Sales Amount],"$#,###.00")
     ELSE 
         vba!format([Measures].[Internet Sales Amount],"#,###.€")
    END
SELECT 
       [Internet Sales Amount BY LOCAL CURRENCY] ON 0,
       [Customer].[Customer Geography].children ON 1
FROM 
       [Adventure Works]

W rezultacie otrzymamy sformatowaną miarę w zależności od  warunku CASE jaki podaliśmy:

mdx caseJak widać funkcje VBA nieco upodobniają MDX do języka SQL i mogą być bardzo pomocne w codziennej pracy. Używajmy ich jeśli zachodzi taka potrzeba szczególnie, że  są one przejrzyste i naprawdę proste w rozszyfrowaniu.

Leave a Reply