Donnerstag, 22. Juli 2010

Analysis Services Metadata mittels ADOMD.NET auslesen

Ok, mein Blogartikel über ADOMD.NET war ja auch nur als Einstieg und Anregung gedacht! Aber es kamen nun die Wünsche nach Beispielen und Demos. Daher heute mal ein wenig Democode inkl. Download. Ich hoffe, dass ich in den nächsten Tagen noch mehr dazu beisteuern kann.

Also, ich habe ein kleines Beispiel in WinForms gebaut, welches die Metadaten aus einer Verbindung mit den Analysis Services ausliest und in einem TreeView darstellt. Das ist jetzt bewusst keine fertige BI Anwendung, sondern soll als Beispiel für den Zugriff auf besagte Metadaten dienen.

image

Wichtig ist, dass Ihr auf Eurem Rechner eine ADOMD.NET DLL habt. Sprich Ihr solltet ADOMD.NET installiert haben!

Der eigentliche Code ist recht “einfach” gehalten und hält sich mit wenig auf. Es geht hier ja auch um ein erstes Demo.

            int nCubes = 0;

            tvMetadata.Nodes.Clear();

            AdomdConnection mdcon = new AdomdConnection(tbConnString.Text);
            mdcon.Open();

            foreach (CubeDef cube in mdcon.Cubes)
            {
                if (cube.Name.StartsWith("$"))
                    continue;
                tvMetadata.Nodes.Add(cube.Name + " (" + cube.LastProcessed.ToString() + ")");

                tvMetadata.Nodes[nCubes].Nodes.Add("Measures");
                foreach (Measure mes in cube.Measures)
                    tvMetadata.Nodes[nCubes].Nodes[0].Nodes.Add(mes.Name);

                tvMetadata.Nodes[nCubes].Nodes.Add("Dimensionen");
                int nDims = 0;
                foreach (Dimension dim in cube.Dimensions)
                {
                    tvMetadata.Nodes[nCubes].Nodes[1].Nodes.Add(dim.Name);

                    foreach(Hierarchy hier in dim.Hierarchies)
                        tvMetadata.Nodes[nCubes].Nodes[1].Nodes[nDims].Nodes.Add(hier.Name);
                    nDims++;
                }

                tvMetadata.Nodes[nCubes].Nodes.Add("KPIs");
                foreach (Kpi kpi in cube.Kpis)
                    tvMetadata.Nodes[nCubes].Nodes[2].Nodes.Add(kpi.Name);

                nCubes++;
            }

            mdcon.Close();

        }

Mehr ist für das Darstellen der Metadaten eines Cubes erst mal nicht notwendig!

Eine mögliche Erweiterung wäre sich neben den sprechenden Bezeichnungen auch gleich noch die UniqueNames ausgeben zu lassen bzw. zu speichern. Dafür müsst Ihr statt “Name” nur “UniqueName” verwenden. Hier mal ein Beispiel wie sowas auf der Ebene der Hierarchien aussehen kann.

image

Des Weiteren ignoriere ich zurzeit komplett die DisplayFolder, diese könnten natürlich auch eingebaut werden. Also da ist noch Raum für Kreativität. Und bevor ich es vergesse, dieses Demo und viele weitere gibt es auf dem kommenden PASSCamp 2010 in meinem Track!

Das Projekt gibt es als Download genau hier: http://www.sascha-lorenz.de/downloads/ADOMD.NETMetadataSample.zip