{"id":376,"date":"2018-04-07T18:48:54","date_gmt":"2018-04-07T17:48:54","guid":{"rendered":"http:\/\/www.csopro.de\/biblog\/?p=376"},"modified":"2025-08-14T20:14:06","modified_gmt":"2025-08-14T19:14:06","slug":"migration-ssas-auf-2016-uebernahme-der-display-folder","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2018\/04\/migration-ssas-auf-2016-uebernahme-der-display-folder\/","title":{"rendered":"Migration SSAS auf 2016: \u00dcbernahme der Display Folder"},"content":{"rendered":"<p>In SSAS 2016 werden endlich Display Folder nativ unterst\u00fctzt. Bisher war das nur durch die Verwendung des BIDS Helper-Projekts (s. <a href=\"https:\/\/bidshelper.codeplex.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/bidshelper.codeplex.com\/<\/a> bzw. <a href=\"https:\/\/bideveloperextensions.github.io\/\" target=\"_blank\" rel=\"noopener\">https:\/\/bideveloperextensions.github.io\/<\/a>) m\u00f6glich.<\/p>\n<p>Nun stellt sich aber die Frage, wie man bei einer Migration von einer fr\u00fcheren SSAS-Version auf SSAS 2016 die dortigen Display Folder \u00fcbertr\u00e4gt, da sie leider bei einer &#8222;normalen&#8220; Migration via Visual Studio verloren gehen, da Visual Studio die BIDS-Helper-spezifischen Einstellungen (BIDS Helper speichert diese Informationen als Annotations in einem eigenen Format) nicht kennt.<\/p>\n<p>Bei der Suche nach einer Antwort fand ich die Seite <a href=\"http:\/\/www.kapacity.dk\/migrating-ssas-tabular-models-to-sql-server-2016-translations-and-display-folders\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.kapacity.dk\/migrating-ssas-tabular-models-to-sql-server-2016-translations-and-display-folders\/<\/a>.<br \/>\nDort wird &#8211; kurz zusammengefasst &#8211; vorgeschlagen, das neue Objekt-Modell zu verwenden, um die Display Folder zu schreiben. Das (jetzt in SSAS 2016 sehr einfache) Objekt-Modell habe ich bereits in meinem <a href=\"https:\/\/www.csopro.de\/biblog\/2017\/12\/ssas-2016-spalten-measures-etc-via-c-erstellen\/\" target=\"_blank\" rel=\"noopener\">letzten Blog-Eintrag<\/a> beschrieben. Der Artikel schl\u00e4gt vor, die Annotations vom BIDS Helper zu parsen und daraus die zu verwendenden Display Folder zu ermitteln.<br \/>\nDiese Display Folder werden dann in den &#8211; bereits bereitgestellten &#8211; Cube geschrieben. Um daraus wieder eine Solution zu erhalten, muss man dann nur noch eine neue Solution aus diesem Cube erstellen.<\/p>\n<p>Ich halte den Weg sehr elegant, das Objektmodell zu verwenden. Allerdings halte ich das Parsen der Annotations f\u00fcr unelegant und fehleranf\u00e4llig. Deswegen gehe ich einen anderen Weg:<br \/>\nNachdem wir den migrierten Cube deployt haben, haben wir ja zwei Cubes in unserer Umgebung:<br \/>\nA: der alte Cube (z.B. SSAS 2012 \/ 2014) mit Display Folders (BIDS)<br \/>\nB: der neue Cube SSAS 2016 ohne Display Folder<\/p>\n<p>Nun habe ich ein einfaches SSIS-Paket erstellt, das \u00fcber DMVs (Dynamic Management Views) auf den alten Cube A zugreift und f\u00fcr alle Measures und (echte oder berechnete) Columns die Display Folder ausliest und sie dann \u00fcber das Objektmodell, wie im vorletzten Beitrag beschrieben, in den neuen Cube schreibt.<\/p>\n<p>Dabei verwende ich folgende DMVs:<\/p>\n<ul>\n<li>$SYSTEM.MDSCHEMA_MEASURES f\u00fcr Measures: Dort interessieren mich alle Measures (MEASURE_NAME) und ihre Display Folder (MEASURE_DISPLAY_FOLDER), sowie der MEASUREGROUP_NAME. Im Tabular Model entspricht der MEASUREGROUP_NAME dem Tabellennamen. Als Cube filtern wir auf &#8222;Model&#8220;.<\/li>\n<li>$System.MDSCHEMA_HIERARCHIES f\u00fcr Columns: Hier interessieren mich HIERARCHY_CAPTION, HIERARCHY_DISPLAY_FOLDER. Als Cube filtern wir auf alles au\u00dfer &#8222;Model&#8220;. Dies funktioniert nur in den Versionen 2012 und 2014 (aber das ist hier ja genau der Fall). Dann tauchen n\u00e4mlich alle Tabellen als CUBE_NAME auf &#8211; mit vorangestellten $ (also $Currency f\u00fcr Tabelle Currency). Jede Spalte steht dann in HIERARCHY_CAPTION.<\/li>\n<\/ul>\n<p>Zu beachten ist, dass teilweise in deutschen Versionen der Cube nicht &#8222;Model&#8220; sondern &#8222;Modell&#8220; hei\u00dft. Dann m\u00fcssen die Abfragen nat\u00fcrlich entsprechend angepasst werden.<\/p>\n<p>Der Code zum Aktualisieren ist dann sehr einfach:<br \/>\nDer neue Cube (und Server) sind Variablen im SSIS-Paket.<br \/>\nDer Code verbindet sich darauf und holt dann das Model in die Variable _model.<br \/>\nLetzlich ist der Code dann nur:<br \/>\n<code>Table table = _model.Tables[tableName];<br \/>\nif (table.Measures.Contains(measureName))<br \/>\n{<br \/>\nMeasure m = table.Measures[measureName];<br \/>\nm.DisplayFolder = displayFolder;<br \/>\n}<\/code><\/p>\n<p>Und zum Abschluss (also im PostExecute) werden die \u00c4nderungen auf den Server gespielt:<br \/>\n<code>_model.SaveChanges();<\/code><br \/>\nF\u00fcr Columns funktioniert es analog.<\/p>\n<p>F\u00fcr Details zu den einzubindenden DLLs, s. <a href=\"https:\/\/www.csopro.de\/biblog\/2017\/12\/ssas-2016-spalten-measures-etc-via-c-erstellen\/\" target=\"_blank\" rel=\"noopener\">mein fr\u00fcherer Blog-Eintrag<\/a>.<\/p>\n<p>Im \u00dcbrigen habe ich auf einen Fehler verzichtet, falls ein Measure oder eine Column nicht im neuen Cube B vorhanden ist. Bei uns hatte das den Hintergrund, dass wir etliche Spalten \/ Measures f\u00fcr Fremdw\u00e4hrungen hatten, die wir per Code erstellten, so dass sie in A vorhanden, in B aber (noch) nicht vorhanden waren. Diese nicht in B gefundenen Spalten\/Measures werden von dem jeweiligen Skript ausgegeben.<\/p>\n<p>Zusammenfassend gehe ich also wie folgt vor:<br \/>\n1. Migration der Solution auf SSAS 2016 &#8211; dadurch gehen die Display Folders verloren<br \/>\n2. Deploy auf einen Entwicklungs-SSAS<br \/>\n3. Kopieren der Display Folder von der alten Cube-Instanz auf die neue<br \/>\n4. Erstellen einer neuen Solution aus dem nun fertigen Cube.<\/p>\n<p>Das beschriebene ETL-Paket habe ich <a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2018\/01\/MigrationSSAS2016.zip\" target=\"_blank\" rel=\"noopener\">hier<\/a> als zip inkl. Solution oder <a href=\"https:\/\/www.csopro.de\/blogdateien\/MigrateDisplayFolders.dtsx\" target=\"_blank\" rel=\"noopener\">hier<\/a> nur als dtsx-File hochgeladen. Um es zu verwenden, muss man die beiden Variablen mit den Infos zum 2016er Cube und die Connection auf den 2012er Cube anpassen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In SSAS 2016 werden endlich Display Folder nativ unterst\u00fctzt. Bisher war das nur durch die Verwendung des BIDS Helper-Projekts (s. https:\/\/bidshelper.codeplex.com\/ bzw. https:\/\/bideveloperextensions.github.io\/) m\u00f6glich. Nun stellt sich aber die Frage, wie man bei einer Migration von einer fr\u00fcheren SSAS-Version auf SSAS 2016 die dortigen Display Folder \u00fcbertr\u00e4gt, da sie leider bei einer &#8222;normalen&#8220; Migration via &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2018\/04\/migration-ssas-auf-2016-uebernahme-der-display-folder\/\" class=\"more-link\"><span class=\"screen-reader-text\">Migration SSAS auf 2016: \u00dcbernahme der Display Folder<\/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":[9,10],"tags":[94,45,46,23],"class_list":["post-376","post","type-post","status-publish","format-standard","hentry","category-analysisservices","category-integrationservices","tag-dmv","tag-ssas-2016","tag-ssis","tag-tabular"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/376","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=376"}],"version-history":[{"count":6,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/376\/revisions"}],"predecessor-version":[{"id":387,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/376\/revisions\/387"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}