{"id":366,"date":"2017-12-30T17:14:49","date_gmt":"2017-12-30T16:14:49","guid":{"rendered":"http:\/\/www.csopro.de\/biblog\/?p=366"},"modified":"2018-01-01T17:26:29","modified_gmt":"2018-01-01T16:26:29","slug":"ssas-2016-spalten-measures-etc-via-c-erstellen","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2017\/12\/ssas-2016-spalten-measures-etc-via-c-erstellen\/","title":{"rendered":"SSAS 2016 Tabular: Spalten, Measures etc. via C# erstellen"},"content":{"rendered":"<p>In einem Projekt erstellen wir Measures dynamisch: F\u00fcr W\u00e4hrungen, die wir in einer relationalen Tabelle eintragen, werden automatisch W\u00e4hrungsumrechnungen aller Ums\u00e4tze durchgef\u00fchrt und dann im Cube automatisch angezeigt.<\/p>\n<p>In SSAS vor der Version 2016 war das sehr kompliziert, da AMO (also das Objekt-Modell, auf das man via C# zugreifen konnte) noch dem MOLAP-Modell entspricht. Dort gab es also das Konzept z.B. berechneter Spalten nicht nativ. Deswegen gab es unter CodePlex ein AMO2Tabular-Projekt, mit dem versucht wurde, den Zugriff gekapselt zu erm\u00f6glichen.<\/p>\n<p>In SSAS 2016 ist alles nun viel einfacher.<\/p>\n<p>Hier ein Beispiel-Code (den wir in Integration Services eingebunden haten, da wir unsere Automatisierung als Teil unserer t\u00e4glichen ETLs entwickelten):<\/p>\n<p>Zun\u00e4chst m\u00fcssen Referenzen definiert werden:<\/p>\n<ul>\n<li>AnalysisServices.Server.Tabular.dll<\/li>\n<li>AnalysisServices.Server.Core.dll<\/li>\n<\/ul>\n<p>Diese DLLs habe ich aus dem GAC genommen:<br \/>\nC:\\Windows\\Microsoft.Net\\assembly\\GAC_MSIL\\Microsoft.AnalysisServices.Tabular\\v4.0_14.0\u2026..<br \/>\n<code>\/\/using System.Data; - sonst ist DataColumn nicht mehr eindeutig<br \/>\nusing Microsoft.AnalysisServices.Tabular;<\/code><\/p>\n<p><code>\/\/Diese Variablen entsprechend setzen<br \/>\nstring serverName = @\"&lt;&lt;meinServer&gt;&gt;\";<br \/>\nstring spaltenName = \"Spalte\";<br \/>\nstring databaseName = \"AMO2016TEST\";<br \/>\nstring tableName = \"Tabelle\";<\/code><\/p>\n<p><code>string serverConnectionString = string.Format(\"Provider=MSOLAP;Data Source={0}\", serverName);<\/code><\/p>\n<p><code>\/\/mit dem Server verbinden<br \/>\nServer server = new Server();<br \/>\nserver.Connect(serverConnectionString);<\/code><\/p>\n<p><code>\/\/die Tabelle finden<br \/>\nDatabase db = server.Databases[databaseName];<br \/>\nModel model = db.Model;<br \/>\nTable table = model.Tables[tableName];<\/code><\/p>\n<p><code>\/\/physische Spalte hinzuf\u00fcgen<br \/>\nif (!(table.Columns.Contains(spaltenName)))<br \/>\ntable.Columns.Add(<br \/>\nnew DataColumn()<br \/>\n{<br \/>\nName = spaltenName,<br \/>\nDataType = DataType.Int64,<br \/>\nSourceColumn = spaltenName,<br \/>\nDescription = \"test\",<br \/>\nDisplayFolder = \"neu\",<br \/>\nIsHidden = false,<br \/>\nIsNullable = true,<br \/>\nFormatString = \"0\",<br \/>\nSortByColumn = table.Columns[\"SourceValue\"],<br \/>\n\/\/die neue Spalte wird nach der Spalte SourceValue sortiert<br \/>\nIsUnique = false,<br \/>\n}<br \/>\n);<\/code><\/p>\n<p><code>\/\/berechnete Spalte hinzuf\u00fcgen<br \/>\nif (!(table.Columns.Contains(spaltenName + \"mal2\")))<br \/>\ntable.Columns.Add(<br \/>\nnew CalculatedColumn()<br \/>\n{<br \/>\nName = spaltenName + \"mal2\",<br \/>\nDataType = DataType.Int64,<br \/>\nExpression = \"2*[\" + spaltenName + \"]\",<br \/>\n\/\/Expression enth\u00e4lt die DAX-Formel<br \/>\nDescription = \"Das doppelte der Spalte \" + spaltenName,<br \/>\nDisplayFolder = \"neu\",<br \/>\nIsHidden = false,<br \/>\nIsNullable = true,<br \/>\nFormatString = \"0\",<br \/>\nSortByColumn = table.Columns[\"SourceValue\"],<br \/>\n}<br \/>\n);<\/code><\/p>\n<p><code>\/\/Measure hinzuf\u00fcgen<br \/>\nif (!table.Measures.Contains(\"Sum_\" + spaltenName))<br \/>\ntable.Measures.Add(<br \/>\nnew Measure()<br \/>\n{<br \/>\nName = \"Sum_\" + spaltenName,<br \/>\nExpression = \"SUM('\u201d + tableName + '[\" + spaltenName + \"])\",<br \/>\nDescription = \"Die Summe aller \" + spaltenName,<br \/>\nDisplayFolder = \"neu\",<br \/>\nFormatString = \"#,0.00\",<br \/>\nIsHidden = false,<br \/>\n}<br \/>\n);<\/code><\/p>\n<p><code>\/\/\u00c4nderungen speichern<br \/>\nmodel.SaveChanges();<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einem Projekt erstellen wir Measures dynamisch: F\u00fcr W\u00e4hrungen, die wir in einer relationalen Tabelle eintragen, werden automatisch W\u00e4hrungsumrechnungen aller Ums\u00e4tze durchgef\u00fchrt und dann im Cube automatisch angezeigt. In SSAS vor der Version 2016 war das sehr kompliziert, da AMO (also das Objekt-Modell, auf das man via C# zugreifen konnte) noch dem MOLAP-Modell entspricht. Dort &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2017\/12\/ssas-2016-spalten-measures-etc-via-c-erstellen\/\" class=\"more-link\"><span class=\"screen-reader-text\">SSAS 2016 Tabular: Spalten, Measures etc. via C# erstellen<\/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],"tags":[45,23],"class_list":["post-366","post","type-post","status-publish","format-standard","hentry","category-c-sharp","category-analysisservices","tag-ssas-2016","tag-tabular"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/366","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=366"}],"version-history":[{"count":3,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/366\/revisions"}],"predecessor-version":[{"id":372,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/366\/revisions\/372"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}