{"id":323,"date":"2015-04-15T22:32:23","date_gmt":"2015-04-15T21:32:23","guid":{"rendered":"http:\/\/www.csopro.de\/biblog\/?p=323"},"modified":"2015-04-18T13:58:48","modified_gmt":"2015-04-18T12:58:48","slug":"ssrs-top-10-und-rest-zum-auf-und-zuklappen","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2015\/04\/ssrs-top-10-und-rest-zum-auf-und-zuklappen\/","title":{"rendered":"SSRS: Top 10 und Rest zum Auf- und Zuklappen"},"content":{"rendered":"<p>Die Aufgabe in diesem Blog-Eintrag ist es, bei einem gegebenen Dataset nur die ersten 10 Eintr\u00e4ge anzuzeigen und den Rest \u00fcber +\/- auf- und zuklappen zu k\u00f6nnen.<\/p>\n<p>Dazu gibt es einen guten Artikel: <a title=\"http:\/\/www.bidn.com\/blogs\/mikedavis\/ssis\/172\/top-n-bottom-n-grouping-in-ssrs-2008\" href=\"http:\/\/www.bidn.com\/blogs\/mikedavis\/ssis\/172\/top-n-bottom-n-grouping-in-ssrs-2008\">http:\/\/www.bidn.com\/blogs\/mikedavis\/ssis\/172\/top-n-bottom-n-grouping-in-ssrs-2008<\/a><\/p>\n<p>Allerdings verwendet dieser die Filter-Funktion \u201cTop n\u201d der Gruppe. (Und f\u00fcr den Rest Bottom (Anzahl-n)) Diese hat folgende Nachteile:<\/p>\n<ul>\n<li>Wenn der 10. und der 11. Eintrag gleich sind, so zeigen die Top 10 in Wirklichkeit 11 Eintr\u00e4ge. Das w\u00e4re noch nicht so schlimm, aber:<\/li>\n<li>Damit sind nat\u00fcrlich auch der 10.-letzte und der 11.-letzte Eintrag gleich, somit kommen beide in dem Rest noch einmal, so dass beide Eintr\u00e4ge doppelt erscheinen.<\/li>\n<\/ul>\n<p>Das sieht dann so aus:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image13.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb13.png\" alt=\"image\" width=\"428\" height=\"315\" border=\"0\" \/><\/a><\/p>\n<p>Der Autor hat zwar noch einen weiteren Artikel ver\u00f6ffentlich, in dem er das Problem versucht zu beheben \u2013 aber dabei verwendet er SQL-Funktionen. Ich m\u00f6chte das Problem nur mit SSRS-Features l\u00f6sen, um eine allgemein g\u00fcltige L\u00f6sung zu haben, zumal in meinem Kundenprojekt MDX zum Einsatz kam.<\/p>\n<p>Mit folgender Anleitung kann man dieses Problem beheben:<\/p>\n<p>Stellen wir uns vor, wir haben ein Dataset wie:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb.png\" alt=\"image\" width=\"206\" height=\"239\" border=\"0\" \/><\/a><\/p>\n<p>Dieses Dataset zeigen wir in einer Tabelle an \u2013 ohne Gruppierung. Das sieht so aus \u2013 mit der \u201cDetails\u201d-Gruppe:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb1.png\" alt=\"image\" width=\"419\" height=\"157\" border=\"0\" \/><\/a><\/p>\n<p>F\u00fcr die Details-Gruppe setzen wir folgende Eigenschaften:<\/p>\n<ul>\n<li>Sortierung: Wert absteigend, danach Person aufsteigend. Letzteres ist notwendig, um die Reihenfolge deterministisch zu machen (falls der Wert gleich)<\/li>\n<li>Sichtbarkeit: \u00fcber Expression: =RowNumber(Nothing)&gt;5<br \/>\nDamit werden nur die ersten 5 Zeilen angezeigt.<\/li>\n<\/ul>\n<p>Diese Details sollen die Top 5-Werte anzeigen.<\/p>\n<p>F\u00fcr die Gruppe, die die restlichen Werte anzeigen soll, legen wir angrenzend daran eine neue Detailgruppe an:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image2.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb2.png\" alt=\"image\" width=\"652\" height=\"148\" border=\"0\" \/><\/a><\/p>\n<p>Diese Gruppe stellen wir so ein:<\/p>\n<ul>\n<li>Details: <a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image3.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb3.png\" alt=\"image\" width=\"451\" height=\"194\" border=\"0\" \/><\/a><\/li>\n<\/ul>\n<ul>\n<li>Name: Details_Rest<\/li>\n<li>Sortierung: Wert absteigend, danach Person aufsteigend.<\/li>\n<li>Sichtbarkeit: \u00fcber Expression: =RowNumber(Nothing)&lt;=5<br \/>\nDamit werden die ersten 5 Zeilen nicht angezeigt.<\/li>\n<li>Die Spalten werden wieder mit Person und Wert besetzt.<\/li>\n<\/ul>\n<p>Nun legen wir jeweils eine \u00fcbergeordnete Gruppe an:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image4.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb4.png\" alt=\"image\" width=\"644\" height=\"266\" border=\"0\" \/><\/a><\/p>\n<p>Die erste Gruppe stellen wir so ein:<\/p>\n<ul>\n<li>Name: Person_Top<\/li>\n<li>Gruppieren nach Person, das entspricht also unserer Detailzeile (Allgemein verwenden wir hier den Prim\u00e4rschl\u00fcssel)<\/li>\n<li>Sortierung: wie die Detailgruppe<\/li>\n<li>Sichtbarkeit: Anzeigen<\/li>\n<li>Die neu angelegte Spalte Person l\u00f6schen wir (Wichtig! Nur die Spalte l\u00f6schen nicht die Gruppe l\u00f6schen)<br \/>\n<a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image5.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb5.png\" alt=\"image\" width=\"406\" height=\"154\" border=\"0\" \/><\/a><\/li>\n<\/ul>\n<p>Das gleiche machen wir f\u00fcr die zweite Detailzeile und richten auch hier eine \u00fcbergeordnete Gruppe ein:<\/p>\n<ul>\n<li>Name: Person_Rest<\/li>\n<li>Gruppieren nach Person, das entspricht also unserer Detailzeile (Allgemein verwenden wir hier den Prim\u00e4rschl\u00fcssel)<\/li>\n<li>Sortierung: wie die Detailgruppe<\/li>\n<li>Sichtbarkeit: Anzeigen<\/li>\n<\/ul>\n<p>Somit sieht unser Bericht so aus:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image6.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb6.png\" alt=\"image\" width=\"378\" height=\"226\" border=\"0\" \/><\/a><\/p>\n<p>Ganz links f\u00fcgen wir eine neue Spalte (au\u00dferhalb der Gruppe) hinzu:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image7.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb7.png\" alt=\"image\" width=\"499\" height=\"210\" border=\"0\" \/><\/a><\/p>\n<p>Dann l\u00f6schen wir wieder die unn\u00f6tige Person-Spalte (ohne die Gruppe zu l\u00f6schen):<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image8.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb8.png\" alt=\"image\" width=\"488\" height=\"214\" border=\"0\" \/><\/a><\/p>\n<ul>\n<ul><!--EndFragment--><\/ul>\n<\/ul>\n<p>Die Zellen ganz links setzen wir:<\/p>\n<ul>\n<li>Name = txt_Top<\/li>\n<li>Inhalt = Top 5<\/li>\n<\/ul>\n<p>bzw.<\/p>\n<ul>\n<li>Name = txt_Rest<\/li>\n<li>Inhalt = Rest<!--EndFragment--><\/li>\n<\/ul>\n<p>Unser Bericht sieht dann so aus:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image9.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb9.png\" alt=\"image\" width=\"309\" height=\"266\" border=\"0\" \/><\/a><\/p>\n<p>Jetzt wollen wir noch das Auf- und Zuklappen implementieren:<\/p>\n<ul>\n<li>Gruppe Person_Top\n<ul>\n<li>Sichtbarkeit umschalten nach Textbox \u201ctxt_Top\u201d<\/li>\n<\/ul>\n<\/li>\n<li>Gruppe Person_Rest\n<ul>\n<li>Sichtbarkeit: Ausblenden<\/li>\n<li>Sichtbarkeit umschalten nach Textbox \u201ctxt_Rest\u201d<br \/>\n<a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image10.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb10.png\" alt=\"image\" width=\"644\" height=\"207\" border=\"0\" \/><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Jetzt muss noch etwas Kosmetik gemacht werden:<\/p>\n<ul>\n<li>Die txt_Top-Textbox sollte ein \u2013 zu Beginn haben und kein +. Also m\u00fcssen wir bei dieser Textbox den InitialToggleState auf true setzen<\/li>\n<li>Wenn die Gruppe zusammengeklappt ist, sieht man die erste Person. Deswegen schreiben wir in die jeweiligen Spalten<br \/>\n=iif(count(Fields!Person.Value)&gt;1, Nothing, Fields!Person.Value) bzw.<br \/>\n=iif(count(Fields!Person.Value)&gt;1, Nothing, Fields!Wert.Value)<\/li>\n<\/ul>\n<p>Geschafft!<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image11.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb11.png\" alt=\"image\" width=\"295\" height=\"181\" border=\"0\" \/><\/a><\/p>\n<p>und<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image12.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/04\/image_thumb12.png\" alt=\"image\" width=\"296\" height=\"151\" border=\"0\" \/><\/a><\/p>\n<p>Der Beispielbericht ist <a href=\"https:\/\/www.csopro.de\/blogdateien\/Top10.rdl\" target=\"_blank\">hier<\/a> als Download verf\u00fcgbar.<\/p>\n<p>Zum Abschluss noch ein paar Worte zur Motivation, warum wir jeweils zwei Gruppen verwenden:<\/p>\n<ul>\n<li>Die \u00e4u\u00dfere Gruppe wird verwendet, um den \u201cToggle\u201d zu erm\u00f6glichen (also das Ein- und Ausblenden), die inenre Gruppe, um zu definieren, welche Zeilen in der Gruppe sichtbar sind. Da beides \u00fcber \u201cSichtbarkeit\u201d geregelt wird, ben\u00f6tigen wir 2 Gruppen.<\/li>\n<li>Die Alternative w\u00e4re, mit Filtern in der Gruppe zu arbeiten. Dann br\u00e4uchte man nur eine Gruppe. Leider darf aber RowNumber(\u2026) nicht in Filtern verwendet werden, so dass dieser Weg ausscheidet.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Die Aufgabe in diesem Blog-Eintrag ist es, bei einem gegebenen Dataset nur die ersten 10 Eintr\u00e4ge anzuzeigen und den Rest \u00fcber +\/- auf- und zuklappen zu k\u00f6nnen. Dazu gibt es einen guten Artikel: http:\/\/www.bidn.com\/blogs\/mikedavis\/ssis\/172\/top-n-bottom-n-grouping-in-ssrs-2008 Allerdings verwendet dieser die Filter-Funktion \u201cTop n\u201d der Gruppe. (Und f\u00fcr den Rest Bottom (Anzahl-n)) Diese hat folgende Nachteile: Wenn der &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2015\/04\/ssrs-top-10-und-rest-zum-auf-und-zuklappen\/\" class=\"more-link\"><span class=\"screen-reader-text\">SSRS: Top 10 und Rest zum Auf- und Zuklappen<\/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":[11],"tags":[32,35,34,33],"class_list":["post-323","post","type-post","status-publish","format-standard","hentry","category-reportingservices","tag-gruppe","tag-initialtogglestate","tag-rownumber","tag-top-n"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/323","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=323"}],"version-history":[{"count":4,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/323\/revisions"}],"predecessor-version":[{"id":330,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/323\/revisions\/330"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}