Montag, 7. Juli 2008

Win/Loss Fan Projekte

Fan Projekte sind ja gerade super in, Sparklines anscheinend auch. Ich habe das erste Feedback aus der Community bekommen. Häufig kam der Hinweis, dass das ja Code sei... igitt... wie kann denn sowas "produktiv" unter den SQL Server Reporting Services eingesetzt werden?

Das ist relativ einfach! Der erste Ansatz war ein extra CRI (Custom Report Item) zu schreiben. Ok, wenn ich mal Zeit habe... :-) Wesentlich "einfacher" ist es in Reporting Services die dynamisch erzeugten Grafiken direkt über eine URL einzubinden. Dann ist die Datenquelle auch egal. Kann also mit der relationalen wie auch mit der multidimensionalen Welt genutzt werden.

Die eigentliche Herausforderung ist die Berechnung der notwendigen Bitmaske für die Darstellung. Und das Ganze bitte z. B. komplett in einer SQL Query. Eine gefühlte Kaffeetassenlänge später entstand das folgende Beispiel.

image

Wir haben drei Tabellen:

  • DimMitarbeiter mit den Vertriebsmitarbeitern
  • DimMitarbeiterZiele mit den Umsatzzielen pro Monat (auf Historisierung verzichten wir einfach mal)
  • Fakten mit den einzelnen Umsätzen

image

image

image

Wie bringen wir das nun zueinander? Mit folgender Query erzeugen wir den Report in den Reporting Services.

select Name, sum(umsatz) as Umsatz, sum(winloss) as WinLoss
from vwfaktenwinloss as f
left join DimMitarbeiter as dM on dM.ma = f.ma
group by f.ma,Name

Wobei die eigentliche Arbeit macht der vwFaktenWinLoss View.

create view vwFaktenWinLoss as
select f.ma, year(datum) as Jahr, month(datum) as Monat, sum(umsatz) as Umsatz,
winloss =
case
    when sum(umsatz) >= (select umsatzziel from DimMitarbeiterZiele as d where d.ma = f.ma) then power(2,month(datum))
    else ' '
end
from fakten as f
group by f.ma, year(datum), month(datum)

Bei diesem Ansatz ist das Case Statement der entscheidene Punkt. Hier wird die Erreichung des Umsatzzieles überprüft. Des Weiteren wird mit der Power Funktion die Grundlage für die Bitmaske erzeugt. Als Grundlage dient der jeweilige Monat. Sofern der Report über Jahresgrenzen hinweg erzeugt werden muss, dann müsste diese Berechnung entsprechend geändert werden.

Wie kommt nun die Grafik in den Report? Ganz einfach über das Berichtselement Bild. Als Quelle Web (URL) auswählen. Dann die Eigenschaft Value bearbeiten und dort folgenden Ausdruck hinterlegen:

="http://asterix:81/sparklinewinloss.aspx?v=" & Fields!WinLoss.Value & "&l=6"

Den Aufbau der URL hatte ich schon mal beschrieben. Der Parameter "l=6" steht für 6 Monate. Das könnte auch noch dynamisch gepflegt werden.

Und schon haben wir die WinLoss Grafik im Report (s.o.). War doch ganz einfach, oder?

Das Verfahren über den Zugriff über eine URL werde ich auch beibehalten, damit auch meine anderen BI Tools (ausserhalb von RS) über den Weg direkt darauf zugreifen können. Neben der Win/Loss Grafik habe ich ja noch ein paar mehr geplant.

Keine Kommentare: