{"id":124,"date":"2009-12-06T00:34:00","date_gmt":"2009-12-05T23:34:00","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2009\/12\/kalendersteuerelement-bei-reports-auf-cubes\/"},"modified":"2014-12-31T18:29:28","modified_gmt":"2014-12-31T17:29:28","slug":"kalendersteuerelement-bei-reports-auf-cubes","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2009\/12\/kalendersteuerelement-bei-reports-auf-cubes\/","title":{"rendered":"Kalendersteuerelement bei Reports auf Cubes"},"content":{"rendered":"<p>Reporting Services hat ein Kalendersteuerelement, in dem man Datumswerte einfach eingeben kann, wenn ein Prompt vom Typ Date \/ Time ist. Heute m\u00f6chte ich beschreiben, wie man das verwenden kann, wenn man einen Bericht erstellt, der auf einem Analysis Services-Cube basiert. Beim Cube ist (in der Regel) das Problem, dass es zwar eine Zeit-Dimension gibt, diese aber nat\u00fcrlich wie alle Dimensionen einen Member Unique Name (also Key) wie z.B. &#8222;[Intervall].[Datum].&amp;[20081012]&#8220; oder &#8222;[Intervall].[Datum].&amp;[3207]&#8220; haben. Dies ist offensichtlich ein String und kein DateTime, weswegen beim Standard-Vorgehen der Reporting Services eine Kombobox mit allen Datumswerten erstellt.<\/p>\n<p>Aber hier im Detail das Vorgehen:<\/p>\n<p>Im Wizard zum Erstellen der Abfrage gehen wir wie folgt vor:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/wizarderstelleabfragessas.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"Wizard zum Erstellen der Abfrage an den Cube\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/wizarderstelleabfragessas-small.jpg\" width=\"450\" height=\"263\" \/><\/a><\/p>\n<p>(Zum Vergr\u00f6\u00dfern auf das Bild klicken)<\/p>\n<p>Ich habe einfach eine Kennzahl und das Datum in die Abfrage gezogen und einen Filter auf das Datum gesetzt, wobei ich (wichtig!) die beiden Checkboxen bei den Parametern gesetzt habe.<\/p>\n<p>Bei der Berichtsausf\u00fchrung werden die beiden Parameter \u00fcber Komboboxen realisiert:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Parameter From als Kombobox\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/parameterfrom.jpg\" width=\"208\" height=\"181\" \/><\/p>\n<p>Dazu hat n\u00e4mlich der Wizard zwei versteckte Data Sets angelegt, die die entsprechenden Werte liefern:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Hidden Datasets\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/hiddendatasets.jpg\" width=\"307\" height=\"321\" \/><\/p>\n<p>Als n\u00e4chstes m\u00fcssen wir das MDX anpassen. (Im Query Designer auf <img loading=\"lazy\" decoding=\"async\" alt=\"Design Mode\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/designmode.jpg\" width=\"106\" height=\"64\" \/> klicken)<\/p>\n<p>&nbsp;<\/p>\n<p>Der Wizard hat folgendes MDX erstellt:<\/p>\n<p> SELECT NON EMPTY { [Measures].[Annahmen] } ON COLUMNS, NON EMPTY { ([Intervall].[Datum].[Datum].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( STRTOMEMBER(@FromIntervallDatum, CONSTRAINED) : STRTOMEMBER(@ToIntervallDatum, CONSTRAINED) ) ON COLUMNS FROM [&lt;CubeName&gt;]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS<\/p>\n<p>Die beiden mit @-benannten Ausdr\u00fccke sind die Prompts.<\/p>\n<p>Wir m\u00fcssen nun den Teil &#8222;STRTOMEMBER(@FromIntervallDatum, CONSTRAINED) &#8220; so ab\u00e4ndern, dass dort eine Variable vom Typ DateTime eine Rolle spielt. Der Schl\u00fcssel eines Datumselements in diesem Fall sieht so aus &#8222;[Intervall].[Datum].&amp;[3190]&#8220;, wobei die ID die Anzahl der Tage zwischen dem 1.1.2000 und dem betreffenden Tag ist.<\/p>\n<p>Gehen wir nun davon aus, dass wir einen Prompt @von vom Typ DateTime haben, m\u00fcsste der STRTOMEMBER so aussehen:<\/p>\n<p>STRTOMEMBER(&#8222;[Intervall].[Datum].&amp;[&#8220; +cstr( datediff(&#8222;d&#8220;, DateSerial(2000, 1, 1), @von )) + &#8222;]&#8220;)<\/p>\n<p>Die DateSerial-Funktion verwende ich hier aus hygienischen Gr\u00fcnden, um keinen Cast von String auf DateTime (der abh\u00e4ngig von der Locale w\u00e4re) zu verwenden)<\/p>\n<p>Auf das CONSTRAINED verwende ich, da sonst der Query Designer meckert.<\/p>\n<p>Wenn man selbst nat\u00fcrlich einen anderen Key benutzt, muss dies angepasst werden. Bei einem Key im Format YYYYMMDD, also [Intervall].[Datum].&amp;[20091205], m\u00fcsste die Formel so sein:<\/p>\n<p>STRTOMEMBER(&#8222;[Intervall].[Datum].&amp;[&#8220; +cstr( year(@von) )  + right(&#8222;0&#8220; + cstr(month(@von), 2) + right(&#8222;0&#8220; + cstr(day(@von), 2) + &#8222;]&#8220;)<\/p>\n<p>Nun m\u00fcssen wir noch den Parameter der Abfrage definieren (\u00fcber <img loading=\"lazy\" decoding=\"async\" alt=\"Button Abfrage Parameter\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/buttonabfrageparameter.jpg\" width=\"117\" height=\"71\" \/>):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Parameter der Abfrage\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/abfrageparameter.jpg\" width=\"423\" height=\"169\" \/><\/p>\n<p>Damit existiert noch nicht der Prompt.<\/p>\n<p>Unter den Eigenschaften des Datasets erscheint der Parameter @von bereits:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Dataset Properties: Parameter\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/datasetproperties-parameters.jpg\" width=\"450\" height=\"377\" \/><\/p>\n<p>Dort tragen wir in &#8222;Parameter Value&#8220; einfach &#8222;[@von]&#8220; ein.<\/p>\n<p>Damit wird automatisch ein Report Parameter von angelegt<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Report Parameter von\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/parametervon.jpg\" width=\"164\" height=\"72\" \/>, den wir wie folgt bearbeiten: Wir setzen den Datentyp auf Datetime:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Bild\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/bild.jpg\" width=\"450\" height=\"379\" \/><\/p>\n<p>(Au\u00dferdem l\u00f6schen wir den nicht mehr ben\u00f6tigten Prompt &#8222;FromIntervallDatum&#8220;)<\/p>\n<p>Damit steht jetzt auch hier das Kalendersteuerelement zur Verf\u00fcgung:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"fertiges Kalendersteuerelement\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2009\/12\/kalender.jpg\" width=\"232\" height=\"194\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reporting Services hat ein Kalendersteuerelement, in dem man Datumswerte einfach eingeben kann, wenn ein Prompt vom Typ Date \/ Time ist. Heute m\u00f6chte ich beschreiben, wie man das verwenden kann, wenn man einen Bericht erstellt, der auf einem Analysis Services-Cube basiert. Beim Cube ist (in der Regel) das Problem, dass es zwar eine Zeit-Dimension gibt, &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2009\/12\/kalendersteuerelement-bei-reports-auf-cubes\/\" class=\"more-link\"><span class=\"screen-reader-text\">Kalendersteuerelement bei Reports auf Cubes<\/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,11],"tags":[26],"class_list":["post-124","post","type-post","status-publish","format-standard","hentry","category-analysisservices","category-reportingservices","tag-parameter"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/124","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=124"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/124\/revisions"}],"predecessor-version":[{"id":272,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/124\/revisions\/272"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}