{"id":95,"date":"2009-10-11T17:19:34","date_gmt":"2009-10-11T16:19:34","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2009\/10\/mdx-skripte-eines-cubes-ueber-c-code-anpassen\/"},"modified":"2014-12-31T18:30:22","modified_gmt":"2014-12-31T17:30:22","slug":"mdx-skripte-eines-cubes-ueber-c-code-anpassen","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2009\/10\/mdx-skripte-eines-cubes-ueber-c-code-anpassen\/","title":{"rendered":"MDX-Skripte eines Cubes \u00fcber C#-Code anpassen"},"content":{"rendered":"<p>Zu dem Standard-Aufgaben bei SSAS-Projekten geh\u00f6ren KPIs, wobei Ist- und Planwerte verglichen und danach der Status einer KPI berechnet wird. Heute m\u00f6chte ich mich auf den Status fokusieren.<\/p>\n<p>Eine normale Regel k\u00f6nnte sein:<\/p>\n<ul>\n<li>Wenn Ist &gt;= Plan, dann Status gr\u00fcn<\/li>\n<li>Wenn Ist &gt;= 90% des Plans, dann Status gelb<\/li>\n<li>Sonst Rot<\/li>\n<\/ul>\n<p>Das s\u00e4he im MDX-Skript in etwa so aus:<\/p>\n<p>CREATE MEMBER CURRENTCUBE.[Measures].[OPE_Status]<br \/>\nAS iif( [Measures].[OPE] &gt;= [Measures].[OPE_Plan] , 1,<br \/>\niif( [Measures].[OPE] &gt;= [Measures].[OPE_Plan] * 0.9, 0, -1)),<br \/>\nVISIBLE = 1;<\/p>\n<p>oder<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/10\/ope-status.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/10\/ope-status-small.jpg\" alt=\"OPE_Status\" width=\"450\" height=\"375\" \/><\/a><\/p>\n<p>Dabei steht verabredungsgem\u00e4\u00df +1 f\u00fcr gr\u00fcn, 0 f\u00fcr gelb, -1 f\u00fcr rot (wenn es nat\u00fcrlich auch andere M\u00f6glichkeiten gibt).<\/p>\n<p>M\u00f6glicherweise will man nun aber den Faktor 90% f\u00fcr die Schwelle zwischen Gelb und Rot (oder auch den Schwellwert 100% f\u00fcr die Grenze zwischen Gr\u00fcn und Gelb) dynamisch gestalten &#8211; zum Beispiel durch die Eingabe in einer Administrationskonsole. Dann w\u00e4re es sch\u00f6n, wenn man dieses MDX dynamisch anpassen k\u00f6nnte.<\/p>\n<p>Deswegen beschreibe ich hier, wie das geht:<\/p>\n<p>Als erstes muss in C# der Verweis Microsoft.AnalysisServices eingebunden werden. Verwirrenderweise findet man diesen nicht unter Microsoft&#8230;, sondern unter Analysis Management Objects (kurz AMO):<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/10\/verweis.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/10\/verweis-small.jpg\" alt=\"Verweis\" width=\"450\" height=\"361\" \/><\/a><\/p>\n<p>Diesen Namespace verwendet man mit<\/p>\n<p>using SSAS = Microsoft.AnalysisServices;<\/p>\n<p>Danach geht es recht einfach:<\/p>\n<p>SSAS.Server server = new SSAS.Server();<\/p>\n<p>try<br \/>\n{<br \/>\nserver.Connect(&#8222;Data source=&lt;SSAS-Servername&gt;&#8220;);<br \/>\nSSAS.Database db = server.Databases.FindByName(&#8222;&lt;SSAS-Datenbankname&gt;&#8220;);<br \/>\nSAS.Cube cb = db.Cubes.FindByName(&#8222;&lt;SSAS-Cubename&gt;&#8220;);<br \/>\n}<br \/>\ncatch (Exception e) &#8230;<\/p>\n<p>Auf die MDX-Skripte hat man dann mit<\/p>\n<p>cb.MdxScripts[0].Commands[0].Text<\/p>\n<p>Zugriff. Diesen String kann man dann auch manipulieren. Damit die Ver\u00e4nderungen auf den Analysis Services gespeichert werden, muss man die \u00c4nderungen mit<\/p>\n<p>cb.MdxScripts[0].Update();<\/p>\n<p>speichern.<\/p>\n<p>Ich empfehle die dynamischen MDX-Anteile von den statischen durch Kommentare wie<\/p>\n<p>\/*Beginn Statusberechnungen*\/n\/* Den Text zwischen diesen Markierungen NICHT ver\u00e4ndern, da er autogeneriert ist*\/n<\/p>\n<p>&#8230;<\/p>\n<p>\/* Ende Statusberechnungen *\/<\/p>\n<p>voneinander zu trennen.<\/p>\n<p>Dann kann man auch durch einfache String-Manipulation den zu \u00e4ndernden Teil herausfischen, ihn \u00e4ndern und wieder zur\u00fcckschreiben, ohne den kompletten Cube zu zerst\u00f6ren \ud83d\ude42<\/p>\n<p>Nat\u00fcrlich muss obiges nicht in einem eigenen C#-Programm programmiert werden, es kann auch als Teil eines SSIS-Pakets verwendet werden.<\/p>\n<p>In einem meiner Projekte verwendete ich einen Data Flow Task, in dem ich die einzelnen Status-Formeln berechnete und in einer Skriptkomponente (als Ziel) die MDX-Skripte in dem Cube aktualisierte. Den Code f\u00fcr die Skriptkomponente habe ich <a title=\"C#-Datei als SSIS-Skriptkomponente-Ziel zum \u00dcberschreiben der MDX Skripte per AMO\" href=\"https:\/\/www.csopro.de\/blogdateien\/SSIS_Skriptkomponente_Ziel_AMO.cs\" target=\"_blank\">hier<\/a> als Anlage beigef\u00fcgt. (Das ist offensichtlich SQL Server 2008, da C# ja erst dann verwendet werden kann \ud83d\ude42 )<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zu dem Standard-Aufgaben bei SSAS-Projekten geh\u00f6ren KPIs, wobei Ist- und Planwerte verglichen und danach der Status einer KPI berechnet wird. Heute m\u00f6chte ich mich auf den Status fokusieren. Eine normale Regel k\u00f6nnte sein: Wenn Ist &gt;= Plan, dann Status gr\u00fcn Wenn Ist &gt;= 90% des Plans, dann Status gelb Sonst Rot Das s\u00e4he im MDX-Skript &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2009\/10\/mdx-skripte-eines-cubes-ueber-c-code-anpassen\/\" class=\"more-link\"><span class=\"screen-reader-text\">MDX-Skripte eines Cubes \u00fcber C#-Code anpassen<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,9,10],"tags":[24],"class_list":["post-95","post","type-post","status-publish","format-standard","hentry","category-c-sharp","category-analysisservices","category-integrationservices","tag-udm"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/95","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=95"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/95\/revisions"}],"predecessor-version":[{"id":273,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/95\/revisions\/273"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=95"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=95"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=95"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}