Samstag, 24. Juli 2010

ADOMD.NET und die CellSet Klasse

So, als eine Ergänzung zu meinen letzten Einträgen zum Thema ADOMD.NET, habe ich heute ein paar weitere Details zur CellSet Klasse.

Ich hatte ja bereits gezeigt, wie Ihr generell mittels ADOMD.NET und der CellSet Klasse auf Daten eines Cube zugreifen könnt. Dazu hatte ich auch ein paar Eigenschaften und Methoden der CellSet Klasse erläutert. Hier nun ein Beispiel für den Zugriff auf ein Resultset innerhalb eines CellSets.

Hier nochmal ein Stück Code, welches sich mit einem Analysis Services Cube verbindet und eine MDX Query ausführt.

AdomdConnection mdcon = new AdomdConnection(“<ConnectionString>”);
mdcon.Open();
AdomdCommand cmd = mdcon.CreateCommand();
cmd.CommandText = “Query”;
CellSet cs = cmd.ExecuteCellSet();
mdcon.Close();

Entscheidend für uns ist hier das CellSet cs, welches wir nun ein wenig mehr “auseinandernehmen” werden!

Dafür brauchen wir aber auch die MDX Query:

SELECT
{[Date].[Calendar].[Calendar Year].&[2003], [Date].[Calendar].[Calendar Year].&[2004]} on Columns,
NON EMPTY CROSSJOIN({[Product].[Product Categories].[All Products].children}, {[Customer].[Customer Geography].[All Customers].children}) on Rows
FROM [Adventure Works]
WHERE ([Measures].[Internet Sales Amount])

Wir sind mal wieder auf “Adventure Works” unterwegs. Hier lassen wir uns für die Jahre 2003 und 2004 die Internet Umsätze aufgeschlüsselt nach Produktkategorien und Kundenregionen darstellen.

Das Ergebnis können wir uns so vorstellen:

image

Nur wie kommen wir jetzt mittels des CellSet Objektes cs an die einzelnen Zellen? Um das mal anschaulich darzustellen, habe ich hier für das Resultset von oben die jeweiligen “Pfade” durch das Objekt zu den Daten und Überschriften aufgeführt.

image

Das ist ja schon mal übersichtlich. Nur was sind jetzt diese ganzen Auflistungen und Objekte?

Fangen wir einfach an. Bei der Aufbereitung eines CellSets sollten wir uns zunächst fragen: Wie viele Achsen hat das Resultset? Wer sich mit MDX schon mal beschäftigt hat, weiß ja, dass durchaus mehr als nur zwei Achsen möglich sind. Sowas sollten wir abfangen!

Also mit cs.axes.count kommen wir an die Anzahl der Achsen.

Von der Achse aus kommen wir zur Auflistung Positions, welche uns zu den Tuples der jeweiligen Achse bringt. Unterhalb der Positions haben wir die Members. Hier müssen wir klären, wie viele Members wir haben. Also kommt hier zum Beispiel ein cs.Axes[1].Positions[0].Members.Count. Damit können wir die Beschriftung oben und an der Seite durchführen. Wenn wir uns den UniqueName mit merken, können wir auch bereit sein für weitere Filtervorgänge.

An die eigentliche Werte kommen wir sehr einfach. Wir nehmen das CellSet und adressieren die jeweilige Position innerhalb des Resultsets direkt. Oben im Beispiel seht Ihr das Verfahren sehr deutlich! Und schon haben wir alles Wesentliche vom Resultset ausgelesen.

Schaut doch eigentlich ganz einfach aus, oder?