Veröffentlicht: 13. Nov 2006
In diesem Whitepaper wird erläutert, wie Diagramme in Berichten von Microsoft SQL Server Reporting Services entworfen werden. Der Leitfaden ist in mehrere Abschnitte gegliedert und verweist auf bestimmte Berichtbeispiele, die im herunterladbaren Beispielprojekt enthalten sind.
Die Informationen über die Datenaufbereitung und Diagrammbeschriftungen sind Ihnen beim besseren Verständnis der Beispiele behilflich. Beim Studieren der Beispiele hilft es auch, die Erörterungen bezüglich der jeweiligen Diagrammbeschriftungen nachzuschlagen, die in den ersten Abschnitten des Leitfadens zu finden sind.
Beispieldiagramme und -berichte
Dieser Abschnitt enthält Beispiele für verschiedene Diagramm- und Berichtsvarianten. Beim Studieren dieser Beispiele hilft es auch, zu den Themen rund um die Diagrammbeschriftung zurückzuspringen, die in den vorherigen Abschnitten behandelt wurden. Folgende Beispiele werden in diesem Abschnitt behandelt.
-
Säulen- und Linienmischdiagramme
Beschreibt Mischdiagramme allgemein und den Beispielbericht SalesCostTarget im Besonderen.
-
Pareto-Diagramme
Implementiert eine Pareto-Darstellung für ein Diagramm (Beispielbericht ParetoChart).
-
Gleitende Durchschnittsberechnungen
Berechnung und Darstellung von Zeitreihentendenzen in Diagrammen (Beispielbericht MovingAverage).
-
Benutzerdefinierte Diagrammfarbpaletten und Legenden
So definieren Sie individuelle Farben in Ihrem Diagramm (Beispielbericht CustomColorPalette).
-
Kreis- und Ringdiagramme
Spezielle Hinweise, die beim Umgang mit Kreis- und Ringdiagrammen zu beachten sind.
-
Hinzufügen von Diagrammdatentabellen
Veranschaulicht, wie zusammengefasste Diagrammdaten mit Detaildaten verknüpft werden (Beispielbericht PiePercentage).
-
Punkt- und Blasendiagramme
Wichtige Tipps für das Erstellen von Punkt- und Blasendiagrammen (BubbleChart, StepFunctionChart).
-
In Tabellen integrierte Diagramme
Unter Umständen benötigen Sie keine komplexen Diagrammdarstellungen, oder Sie haben es mit einer zur Laufzeit unbekannten Datenmenge zu tun und möchten aber auf brauchbare und elegante Datendarstellungen nicht verzichten. In diesem Abschnitt werden diesbezügliche Möglichkeiten erläutert (TableInlineCharts).
-
Diagrammerweiterbarkeit und manuelles Erstellen von Diagrammen
Erörtert Optionen, wenn die integrierten Diagramme nicht ausreichen.
Beispielberichte auf der Grundlage der AdventureWorks-Beispieldatenbank von SQL Server 2005 sowie der Northwind-Beispieldatenbank sind in der Downloaddatei zu diesem Whitepaper enthalten.
Säulen- und Linienmischdiagramme
Diagramme, in denen mehrere Datenreihen als Säulen und andere Datenreihen als Linien dargestellt werden, dienen häufig dazu, Gesamt-Trends und Zielwerte zu veranschaulichen, oder dazu, die Daten innerhalb des Diagramms weiter zu analysieren. Dieser Abschnitt enthält allgemeine Informationen über das Erstellen solcher Diagramme innerhalb von Reporting Services.
So erstellen Sie ein Säulen- und Linienmischdiagramm:
-
Fügen Sie dem Bericht ein Diagramm hinzu und stellen Sie als Diagrammtyp Säule ein.
-
Ergänzen Sie Kategoriegruppen und/oder Datenreihengruppen sowie Datenwerte.
-
Damit die Datenwerte als Linien dargestellt werden, müssen Sie im Bericht-Designer folgende Schritte ausführen:
-
Öffnen Sie das Dialogfeld Berichtseigenschaften.
-
Klicken Sie auf die Registerkarte Daten.
-
Wählen Sie den Datenwert aus, der als Linie dargestellt werden soll, und klicken Sie auf Bearbeiten.
-
Klicken Sie im Dialogfeld Diagrammwert bearbeiten auf die Registerkarte Darstellung, und aktivieren Sie die Option Daten als Linie zeichnen (siehe Abbildung 8).
Abbildung 8: Zeichnen einer Datenreihe als Linie in einem Säulendiagramm
So fügen Sie dem Diagram einen konstanten oder dynamischen Zielwert hinzu:
-
Gestalten Sie das Diagramm.
-
Fügen Sie auf der Registerkarte Daten im Dialogfeld Diagrammeigenschaften einen neuen Datenwert hinzu (z. B. Target).
-
Legen Sie den Zielwert für Target fest (bei dem Beispiel in Abbildung 9 wird der konstante Zielwert 100000 in allen Kategorien verwendet). Achten Sie darauf, dass der verwendete Ausdruck mit dem Gleichheitszeichen = beginnt. Andernfalls wird der Wert nicht als numerischer Wert interpretiert.
Abbildung 9: Hinzufügen eines Zielwerts
In dem Beispielbericht SalesCostTarget (siehe Abbildung 10) wird dieser Ansatz dafür verwendet, eine einfache Umsatzziellinie in das Diagramm aufzunehmen.
Abbildung 10: Zielwert (rote Linie) (zum Vergrößern auf das Bild klicken)
Hinweis Da Linien für eine Liniendiagrammreihe durch das Verbinden der Datenpunkte mehrerer Kategorien gebildet werden, ist nur dann eine Linie zu sehen, wenn die Kategoriegruppierung zur Laufzeit mindestens zwei unterschiedliche Gruppeninstanzwerte enthält.
Hinweis Wenn das Diagramm eine oder mehrere Datenreihengruppen enthält, wird der Zieldatenwert bei jeder Datenreihengruppeninstanz wiederholt. Wenn es für jede Gruppeninstanz spezielle Zielwerte gibt, ist dies sehr von Nutzen.
Wenn für alle Datenreihen aber nur ein globaler Zielwert dargestellt werden soll, können Sie den Zieldatenwert wie folgt dynamisch festlegen:
=iif(Fields!<SameFieldAsSeriesGroup>.Value = First(Fields!<SameFieldAsSeriesGroup>.Value, <ChartName>), <TargetValue>, Nothing)
Ein Beispiel für einen speziellen Ausdruck könnte folgendermaßen aussehen:
=iif(Fields!Year.Value = First(Fields!Year.Value, "SalesChart"), 100000, Nothing)
Pareto-Diagramme
Ein Pareto-Diagramm fasst die relative Bedeutung der Unterschiede zwischen Datengruppen zusammen und stellt diese dar. Pareto-Diagramme dienen der besonderen Hervorhebung der wenigen wichtigsten unter den vielen nützlichen Daten. Ein Pareto-Diagramm kann auch als Säulendiagramm definiert werden, bei dem die Säulen in absteigender Reihenfolge sortiert sind, um die beste Möglichkeit für eine Verbesserung herauszustellen.
Zwar werden Pareto-Diagramme von der integrierten Reporting Services-Diagrammfunktion gegenwärtig nicht unterstützt, Sie können ein Pareto-Diagramm aber mithilfe der Reporting Services 2005-Funktionen und durch selbst geschriebenen Code erstellen. Dieser Abschnitt enthält eine ausführliche Erläuterung zu dem diesem Whitepaper beigefügten Beispielbericht ParetoChart.
Folgendes Szenario ist die Ausgangssituation für den Beispielbericht ParetoChart.
Die SQL Server 2005 AdventureWorks Datenbank enthält Daten über Vertriebsmitarbeiter. Das besondere Interesse gilt dabei folgenden Informationen über die Vertriebsmitarbeiter:
-
Wie sieht die Pareto-Analyse bei Betrachtung der Vertriebsmitarbeiter mit den höchsten Provisionen im Vorjahr aus? (Siehe die orangefarbene Linie in Abbildung 11.)
-
Welche Vertriebsmitarbeiter erhielten im letzten Jahr die höchsten Provisionen, und wie sieht der Vergleich mit ihrem Gesamtumsatz im laufenden Jahr aus? (Siehe die blauen und grünen Säulen in Abbildung 11.)
-
Gibt es beträchtliche Veränderungen im Hinblick auf den Vertriebserfolg, wenn man die Provisionen des Vorjahres mit den Umsätzen des laufenden Jahres vergleicht? Dies lässt sich leicht beantworten, wenn man die blauen und die grünen Säulen vergleicht, aber anhand der großen Lücke zwischen der orangefarbenen und der roten Pareto-Linien in Abbildung 11 wird dies noch deutlicher.
-
Die Daten eines bestimmten Vertriebsmitarbeiters sollen nun detaillierter in die Vergangenheit und die Vertriebsergebnisse dargestellt werden; außerdem sollen die Daten mehrerer Jahre auf bestimmte Tendenzen hin untersucht werden.
Dazu werden die Vertriebsdatenwerte (grüne Säulen in Abbildung 11) mit Drillthroughaktionen versehen, um eine Detailuntersuchung der Daten eines bestimmten Vertriebsmitarbeiters mit einer Trendanalyse durchzuführen. Der Drillthroughbericht (Beispielbericht MovingAverage) wird im nächsten Abschnitt erläutert.
Abbildung 11: Pareto-Diagramm des Beispielberichts (zum Vergrößern auf das Bild klicken)
So wird der Pareto-Diagrammbericht erstellt
-
Definieren Sie eine Abfrage, mit der die erforderlichen Vertriebsdaten abgerufen werden.
Die Abfrage führt eine Vorsortierung der Daten zu jedem Vertriebsmitarbeiter auf Basis der Provisionswerte durch. Die einzelnen Vertriebsaufträge werden dabei nicht eingelesen, da sie für diesen Bericht nicht erforderlich sind. Dadurch wird auch die Größe des Datasets im Rahmen gehalten.
-
Legen Sie das Gesamtlayout für das Diagramm fest.
Nehmen Sie ein Säulendiagramm in den Bericht auf. Zum Untersuchen der Daten pro Vertriebsmitarbeiter fügen Sie eine Kategoriegruppe pro Vertriebsmitarbeiter hinzu (gruppiert nach =Fields!SalesPersonID.Value). Als Kategoriebeschriftung übernehmen Sie den Vor- und Nachnamen der Person. Dazu wird als Ausdruck für die Kategoriegruppenbeschriftung Folgendes eingestellt.
=Fields!FirstName.Value & " " & Fields!LastName.Value
-
Bereiten Sie das Diagramm für die Pareto-Berechnungen vor.
Für die Berechnungen wird die Funktion RunningValue(…) verwendet.
Hinweis Die Funktion RunningValue wird nur in Diagrammen ab Reporting Services 2005 unterstützt.
Ähnlich wie bei einer Matrix ist für die Funktion RunningValue ein expliziter Gruppierungsbereich in einem Diagramm erforderlich, um den laufenden Wert zu ermitteln, wenn der laufende Wert für alle Kategorien einer bestimmten Datenreihe (die Richtung ist im Wesentlichen horizontal) oder für alle Datenreihen einer bestimmten Kategorie ausgewiesen werden soll (nicht so üblich).
Für die Pareto-Berechnungen nutzen Sie eine RunningValue-Funktion, bei der ein Reihengruppenname als „Reset“-Bereich übernommen wird (und somit in allen Kategorien vorkommt). Da für dieses Diagramm noch keine Reihengruppe vorliegt, wird nun einfach eine Pseudoreihengruppe auf Basis eines konstanten Wertes (z. B. 1) hinzugefügt.
Gruppenausdruck: 1
Beschriftungsausdruck: ="" (Zum Ausblenden der Datenreihenbeschriftung aus den generierten Legendenbeschriftungen)
Das Ergebnis ist eine Datenreihe und zugleich ein bestimmter Datenreihenbereichsname.
-
Nun werden die Provisions- und Vertriebsdaten als Säulen hinzugefügt.
Zum Ergänzen der Datenwerte für Bonus sowie für SalesYTD in das Diagramm werden die entsprechenden Dataset-Felder mit der Maus auf das Diagramm verschoben.
Hinweis Bei diesem Beispiel wird für die Provisions- und Vertriebswerte die Aggregatfunktion Sum() verwendet.
Die Legende soll in der Ecke oben links im Diagrammzeichenbereich platziert werden. Die Y-Achse soll skaliert werden, damit der maximale Datenpunktwert in dem Diagramm 75 Prozent der gesamten Höhe der Y-Achse auf keinen Fall überschreitet.
Dazu werden die Provisionsberechnungen mit dem Skalierfaktor 75 Prozent versehen:
=0.75 * Sum(Fields!Bonus.Value) / Max(Fields!Bonus.Value, "SeriesGroup")
Dasselbe gilt auch für die Vertriebsdatenberechnung:
=0.75 * Sum(Fields!SalesYTD.Value) / Max(Fields!SalesYTD.Value, "SeriesGroup")
-
Die Y-Achse richten Sie nun als prozentuale Achse ein.
Im vorherigen Schritt wurde eine Prozentwertberechnung für die Provisions- und Vertriebsdatenberechnungen festgelegt (relativer Betrag im Verhältnis zum Höchstwert).
Wenn als Formatzeichenfolgen der Y-Achse P0 festgelegt wird, wird die Prozentzahlformatierung angewendet (die Y-Achse wird zwischen 0,0 und 1,0 skaliert). Um übersichtliche Intervalle zu erhalten, wird für die Y-Achse der Hauptteilstrich 0,2 festgelegt. Die resultierenden Intervalle liegen um je 20 Prozent auseinander.
-
Nun werden die Provisions- und Vertriebsdaten-Pareto-Werte als Linien hinzugefügt.
Die Funktion RunningValue() führt eine kumulative Berechnung durch, bis sie wieder von vorne beginnt. Diese Funktionsrückkehr soll ausgeschaltet werden. Da anfangs keine spezielle Datenreihengruppe vorhanden war, wurde in Schritt 3 eine solche hinzugefügt.
Bei der Pareto-Berechnung wird die kumulative Summe durch die Gesamtwerte geteilt. Zur Pareto-Berechnung der Provision wird folgender Ausdruck verwendet.
=RunningValue(Fields!Bonus.Value, Sum, "SeriesGroup") / Sum(Fields!Bonus.Value, "SeriesGroup")
Das Gleiche wird nun auch bei der Pareto-Berechnung der Vertriebsdaten wiederholt:
=RunningValue(Fields!SalesYTD.Value, Sum, "SeriesGroup") / Sum(Fields!SalesYTD.Value, "SeriesGroup")
-
Nun wird der Vertriebsdatenwert mit einer Drillthroughaktion versehen.
Um eine Drillthroughanalyse der Vertriebsdaten eines bestimmten Vertriebsmitarbeiters zu ermöglichen, wird der Vertriebsdatenpunkt im Beispielbericht MovingAverage mit einer Drillthroughaktion versehen (siehe Abbildung 12). Da nur ein bestimmter Vertriebsmitarbeiter untersucht werden soll, legen Sie für den Drillthroughparameter SalesPersonID den Wert der gegenwärtigen Kategoriegruppe fest. Bei diesem Beispiel handelt es sich dabei um die gegenwärtige Salesperson-ID: =Fields!SalesPersonID.Value.
Abbildung 12: Hinzufügen einer Drillthroughaktion
-
Nun kann das Diagramm zum Abschluss formatiert, mit Datenpunktbezeichnungen und einer Legende versehen werden.
Gleitende Durchschnittsberechnungen
Ein gleitender Durchschnitt gehört zu einer Reihe ähnlicher statistischer Erhebungen zur Untersuchung von Zeitreihendaten. Eine gleitende Durchschnittsreihe lässt sich für jede beliebige Zeitreihe ermitteln.
Zwar werden gleitende Durchschnittsberechnungen von den integrierten Reporting Services-Diagrammen nicht direkt unterstützt, Sie können diese Berechnungen mit eigenem Code aber selbst durchführen. Dieser Abschnitt enthält ausführliche Erläuterungen zum Beispielbericht MovingAverage.
Der Beispielbericht bezieht sich auf das Szenario, das im vorherigen Abschnitt über Pareto-Diagramme geschildert wurde. Zu einem bestimmten Vertriebsmitarbeiter sollen die vergangenen und die gegenwärtigen Vertriebsresultate analysiert und die Daten mehrerer Jahre auf bestimmte Tendenzen hin untersucht werden. Durch das Ermitteln gleitender Durchschnittswerte sollen kurzzeitige Schwankungen egalisiert und langfristigere Trends oder Zyklen herausgestellt werden.
Das Beispiel MovingAverage zeigt, wie ein einfacher gleitender Durchschnitt errechnet werden kann (das ungewichtete Mittel der vorherigen n Datenpunkte). Bei diesem speziellen Beispiel werden die Vertriebsdaten der letzten drei Monate herangezogen. Siehe Abbildung 13.
Abbildung 13: Gleitende Durchschnittsberechnung (zum Vergrößern auf das Bild klicken)
Berichterstellung
-
Definieren Sie eine Abfrage, mit der die erforderlichen Vertriebsdaten abgerufen werden.
Die Abfrage ist parametrisiert, damit nur die Daten des jeweiligen Vertriebsmitarbeiters abgerufen werden. Der festzulegende Abfrageparameter hängt von einem Berichtsparameter ab, dessen Angabe aus einem Dataset mit einer Liste gültiger Werte stammt.
-
Legen Sie das Gesamtlayout für das Diagramm fest.
Nehmen Sie ein Säulendiagramm in den Bericht auf. Nutzen Sie die X-Achse im Kategoriemodus, um zwei Gruppierungsebenen definieren zu können: eine innere Gruppierung nach Monaten und eine äußere Gruppierung nach Jahren mit Gruppierungsbereichen. Für die Monatsgruppierung wird der folgende explizite Gruppenbeschriftungsausdruck eingesetzt, um den Monat als verkürzte Monatsangabe zu formatieren. =Format(Fields!OrderDate.Value,"MMM")
-
Nun wird das Diagramm für die gleitende Durchschnittsermittlung vorbereitet.
Ebenso wie unter Schritt 3 bei den Pareto-Berechnungen wird die Funktion RunningValue verwendet. Eine Rückkehr der gleitenden Durchschnittsberechnung über die Kategorien hinweg ist nicht erwünscht. Aus diesem Grunde wird eine Reihengruppierung basierend auf dem Wert von SalesPersonID definiert. Da die Abfrage als Parameter den Vertriebsmitarbeiter verwendet, enthalten die resultierenden Daten nur eine Vertriebsmitarbeiter-Datenreihe. Als Ausdruck für die Datenreihengruppenbeschriftung wird =Fields!FullName.Value festgelegt, damit die in der Diagrammlegende der vollständige Namen des Vertriebsmitarbeiters erscheint.
-
Nun wird die Vertriebsdatenberechnung als Säulen hinzugefügt.
Dazu wird das Dataset-Feld TotalDue mit der Maus auf den Ablagebereich des Diagramms gezogen, und ein Vertriebsdatenwert wird auf der Grundlage der Aggregation Sum() platziert. Um am Ende der Datenreihengruppenbeschriftung das Wort „Umsatz“ anzuhängen (als Gruppenbeschriftung dient der vollständige Name des Vertriebsmitarbeiters gemäß Festlegung in Schritt 3) wird die Datenwertbezeichnung explizit mit dem Wort „Umsatz“ festgelegt.
-
Nun werden die Funktionen anhand des benutzerdefinierten Codes mit der gleitenden Durchschnittsermittlung hinzugefügt.
Die folgende Tabelle enthält ein Beispiel für eine gleitende Durchschnittsberechnung durch Verwendung eines Queue-Ausdrucks. Die Spalte „Queue Contents“ enthält den gegenwärtigen Queue-Inhalt eines bestimmten Monats. Die letzte Spalte der Tabelle enthält eine RunningValue-Berechnung basierend auf einer Aggregation hinzugefügter und entfernter Einträge aus der Queue. Der Beispielcode unter der Tabelle soll die praktische Umsetzung dieses Algorithmus verdeutlichen.
Tabelle 4
Monat
Umsatz
Gleitender Durchschnitt (2 Mon.)
Normaler laufender Wert
Queue-Inhalt
Entfernter Queue-Wert
Laufender Wert basierend auf Queue
Jan
20
n/v
20
20
n/v
0
Feb
10
15
35
20, 10
n/v
0+ 15 = 15
Mär
24
17
59
10, 24
-20
15+ (24-20) /2 = 17
Apr
16
20
75
24, 16
-10
17+ (16-10) /2 = 20
Mai
12
14
87
16, 12
-24
20+ (12-24) /2 = 14
…
Zum Einbinden der Queue-basierten Funktion RunningValue muss der folgende Code unter Benutzerdefinierter Code auf der Registerkarte Code des Dialogfelds Berichtseigenschaften eingetragen werden.
Private queueLength As Integer = 3
Private queueSum As Double = 0
Private queueFull As Boolean = False
Private queue As New System.Collections.Generic.Queue(Of Double)
Public Function MovingQueue(ByVal currentValue As Double) As Object
Dim removedValue As Double = 0
If queue.Count >= queueLength Then
removedValue = queue.Dequeue()
End If
queueSum += currentValue
queueSum -= removedValue
queue.Enqueue(currentValue)
If queue.Count < queueLength Then
Return Nothing
ElseIf queue.Count = queueLength And queueFull = False Then
queueFull = True
Return queueSum / queueLength
Else
Return (currentValue - removedValue) / queueLength
End If
End Function
-
Nun wird der gleitende Durchschnitts-Umsatzwert als Linie hinzugefügt.
Zur Datenwertberechnung für den gleitenden Durchschnitt wird die Funktion RunningValue auf die Werte angewendet, die von der benutzerdefinierten MovingQueue Funktion zurückgeliefert werden. Die Funktion MovingQueue berechnet die Anpassungswerte für die kumulative RunningValue Berechnung. Dazu dient der folgende Code.
=RunningValue(Code.MovingQueue(Fields!TotalDue.Value), Sum, "SalesPerson")
Hinweis Um mehrere gleitende Durchschnittswertberechnungen innerhalb eines Diagramms durchzuführen, müssen Sie entweder eine Möglichkeit vorsehen, mit der Sie am Ende einer Reihe die Queue zurücksetzen können, oder Sie müssen mit mehreren Queues arbeiten. Sie könnten beispielsweise eine Hash-Tabelle mit Queues verwenden, die abhängig vom Reihengruppenwert indiziert sind der Funktion MovingQueue als zusätzliches Argument übergeben werden.
Hinweis Ein Diagramm kann nicht mehrere Seiten umfassen. Es ist daher zulässig, die Variablen als „private nonshared“ zu deklarieren.
Um die gleitende Durchschnittsberechnung in einem anderen Datenbereich (z. B. einer Liste, Tabelle oder Matrix) verwenden zu können, der sich über mehrere Seiten erstreckt, müssen die Variablen als „shared“ (d. h. als „static“) deklariert werden, damit sie ihren Status bei der Paginierung beibehalten. Wenn zwei Personen zeitgleich denselben Bericht verwenden und weil hierbei statische Variablen zum Einsatz kommen, besteht die Möglichkeit, dass der Variablenstatus der einen Person durch die Nutzung der anderen Person verändert wird. Um absolut sicher zu sein, dass so etwas nicht passiert, können Sie jede einzelne shared-Variable in eine Hash-Tabelle umwandeln, die auf der ID des anfordernden Nutzers basiert (=Globals!UserID).
Benutzerdefinierte Diagrammfarbpaletten und Legenden
In den Diagrammen werden integrierte vordefinierte Farbpaletten mit 10 bis 16 unterschiedlichen Farben benutzt. Diese Standardfarben können ab Reporting Services 2000 Service Pack 1 (SP1) überschrieben werden. Um Farbwerte als Konstante oder ausdrucksabhängige Werte zu definieren, klicken Sie im Dialogfeld Diagrammwert bearbeiten in den Darstellungseigenschaften des Datenwertes auf die Schaltfläche Reihenart. Sie könnten damit beispielsweise bestimmte Werte abhängig von einer Bedingung aus den gegenwärtigen Datenreihen hervorheben, z. B. einen Mindest- oder Höchstwert.
Hinweis Wenn Sie keine vollständige benutzerdefinierte Farbpalette definieren möchten, können Sie die Farbe auch bei bestimmten Datenpunkten überschreiben. Verwenden Sie einen Ausdruck, mit dem entweder ein bestimmter Farbwert zurückgegeben wird (um diesen zu überschreiben) oder mit dem „nichts“ zurückgegeben wird, wodurch die aktuelle Farbe wieder aus der zugrunde liegenden Basisfarbpalette auswählt wird.
Beispiel: Angenommen, alle Datenpunktwerte mit negativen Y-Werten sollen rot hervorgehoben werden. Für alle übrigen Datenpunkte sollen die Standardfarben genutzt werden. Wählen Sie dazu Diagrammwert bearbeiten, und klicken Sie auf die Registerkarte Darstellung. Klicken Sie auf die Schaltfläche Reihenart, um das Dialogfeld Stileigenschaften zu öffnen. Klicken Sie auf die Registerkarte Ausfüllen. Tragen Sie unter den Stileigenschaften zur Farbe folgenden Ausdruck ein.
=iif(Sum(Fields!Sales.Value - Fields!Cost.Value) < 0, "Red", Nothing))
Hinweis Wenn Sie für die Farbe einen konstanten Wert festlegen, wird die Farbe für alle Datenpunkte der jeweiligen Datenreihe übernommen.
In der Diagrammlegende werden Farbfelder verwendet, damit die Einträge in der Legende den sichtbaren Datenpunkten zugeordnet werden können. In der Legende kann nur ein Farbfeld pro Legendeneintrag (Datenreihe) angezeigt werden. Daher wird dort die Farbe des ersten Datenpunkts innerhalb der Reihe angezeigt. Dies sollten Sie beachten, wenn Sie mit speziellen Ausdrücken arbeiten, um die Farbe einzelner Datenpunkte innerhalb einer Reihe dynamisch festzulegen. Für den Legendeneintrag wird immer die jeweilige Farbe des ersten Datenpunkts verwendet.
Die in den Reporting Services-Diagrammen integrierte Legendenfunktion ist zwar einfach zu benutzen, jedoch nicht sehr flexibel. Beispielsweise nimmt die Legende innerhalb des Diagramms einen gewissen Platz in Anspruch. Wird die Legende außerhalb des Zeichenbereichs platziert und die Legende wird größer, schrumpft der Diagrammzeichenbereich entsprecht.
Mehr Flexibilität und Kontrolle über die Legende erhalten Sie, wenn Sie mithilfe einer Tabelle oder Matrix Ihre eigene Legende erstellen. Die einfachste Möglichkeit, die Farben im Diagramm in die eigene Legende zu übernehmen, ist die Definition einer eigenen benutzerdefinierten Diagrammfarbpalette. Der Beispielbericht CustomColorPalette veranschaulicht die Implementierung einer benutzerdefinierten Farbpalette und Legende. Siehe Abbildung 14.
Abbildung 14: Ein Bericht mit einem Balkendiagramm, einer benutzerdefinierten Farbpalette und Legende
So wird eine benutzerdefinierte Farbpalette erstellt
-
Zuerst werden die Diagrammreihengruppe und die Kategoriegruppen definiert.
Standardmäßig ist jeder Diagrammdatenreihe eine Farbe zugeordnet. Die Farbe hängt von der gewählten Diagrammpalette ab. Bei diesem Beispiel sollen diese Farben abhängig von den Reihengruppen-Instanzwerten überschrieben werden.
-
Nun wird die benutzerdefinierte Farbpalette definiert und der benutzerdefinierte Code ergänzt.
In der Variablen colorPalette wird die Definition der benutzerspezifischen Farbpalette gespeichert, die über 15 verschiedene Farben verfügt. Mit der Variablen count wird die Gesamtzahl der unterschiedlichen Gruppierungswerte mitverfolgt, damit wieder von vorne begonnen werden kann, sobald die Höchstanzahl verschiedener Farben in der benutzerdefinierten Farbpalette überschritten wird. Mit der Hash-Tabelle mapping wird die Zuordnung zwischen den Gruppierungswerten und den Farben verfolgt. Dadurch wird sichergestellt, dass alle Datenpunkte innerhalb derselben Datenreihe mit derselben Farbe versehen sind. Später wird sie zum Abgleichen der benutzerdefinierten Legendenfarben mit den Diagrammfarben herangezogen. Der folgende Code muss in das Code-Fenster des Berichts eingetragen werden.
Private colorPalette As String() = {"Green", "Blue", "Red", "Orange",
"Aqua", "Teal", "Gold", "RoyalBlue", "MistyRose", "LightGreen",
"LemonChiffon", "LightSteelBlue", "#F1E7D6", "#E16C56", "#CFBA9B"}
Private count As Integer = 0
Private mapping As New System.Collections.Hashtable()
Public Function GetColor(ByVal groupingValue As String) As String
If mapping.ContainsKey(groupingValue) Then
Return mapping(groupingValue)
End If
Dim c As String = colorPalette(count Mod colorPalette.Length)
count = count + 1
mapping.Add(groupingValue, c)
Return c
End Function
-
Rufen Sie die Funktion GetColor() auf, um den Datenpunkten Farben zuzuweisen.
Die Funktion GetColor wird über das Dialogfeld „Stileigenschaften - Farbe“ aufgerufen. Bearbeiten Sie den Datenwert. Öffnen Sie das Dialogfeld Diagrammwert bearbeiten, und klicken Sie auf die Registerkarte Darstellung (Abbildung 15). Klicken Sie auf die Schaltfläche Reihenart und anschließend auf die Registerkarte Ausfüllen. Der gegenwärtigen Reihengruppenwert wird als Argument an die Funktion GetColor übergeben, damit der interne Gruppeninstanzwert dem Farbwert zugeordnet werden kann.
Abbildung 15: Festlegen bestimmter Datenreihenformate
Hinweis Wenn mehrere Diagrammreihengruppen vorhanden sind, können Sie die Reihengruppenwerte miteinander verketten, um eine eindeutige Kennung zur Nutzung in der Funktion GetColor zu erzeugen. Der folgende Code dient als Beispiel.
=Code.GetColor(Fields!Country.Value & "|" & Fields!City.Value)
-
Fügen Sie eine Diagrammlegende hinzu.
Sie können dazu die eingebaute Diagrammlegende benutzen. Sie können aber auch die integrierte Diagrammlegende deaktivieren und die Schritte in den folgenden Anweisungen durchführen, um anhand eines Tabellen- oder Matrixdatenbereichs Ihre eigene Diagrammlegende zu erstellen.
So wird eine benutzerdefinierte Legende erstellt
-
Fügen Sie dem Bericht einen Tabellendatenbereich hinzu.
Platzieren Sie die Tabelle neben dem Diagramm, und binden Sie dasselbe Dataset wie zum Diagramm an die Tabelle.
-
Definieren Sie in der Tabelle dieselbe Gruppierungsstruktur wie im Diagramm, indem Sie Tabellengruppen hinzufügen.
Wenn im Diagramm Reihengruppierungen benutzt werden, fügen Sie diese auch der Tabelle hinzu, indem Sie Tabellengruppen definieren, die auf dem gleichen Gruppierungsausdruck wie bei den Diagrammreihengruppierungen basieren. Anschließend fügen Sie als innere Tabellengruppen Diagrammkategorie-Gruppierungen (sofern vorhanden) hinzu.
Im Allgemeinen gilt: Wenn das Diagramm m Reihengruppierungen und n Kategoriegruppierungen enthält, müssen Sie m+n Tabellengruppen für Ihre benutzerdefinierte Legende hinzufügen.
Bei den einzelnen Tabellengruppen ist darauf zu achten, dass nur der Gruppenkopfbereich (in dem die Legendenbeschreibung später eingefügt wird) angezeigt wird. Weiterhin muss die Detailzeile aus der Tabelle entfernt werden, es sei denn, Sie möchten mithilfe der Detailzeilen der Tabelle eine Diagrammdatentabelle simulieren.
-
Gestalten der benutzerdefinierten Legende.
Zeichnen Sie für das Farbfeld der benutzerdefinierten Legende ein Rechteck. Sie können es beispielsweise in die erste Tabellenspalte einfügen. Wie unter Schritt 2 angedeutet, sollte die Tabelle nur Gruppenkopfzeilen enthalten. Das Rechteck wird nun in der innersten Gruppenkopfebene angeordnet.
Legen Sie für die Eigenschaft BackgroundColor des Rechtecks den jeweiligen Ausdruck fest, der auch für die Füllfarbe des Diagrammdatenpunkts eingegeben wurde. Im einfachsten Fall reicht als Ausdruck ein einziger Gruppierungswert aus, wie der folgende Code demonstriert.
=Code.GetColor(Fields!Country.Value)
Benutzen Sie für den Text der Legende entweder denselben Ausdruck wie derjenige, der als Beschriftungsausdruck für die Kategorie- und Reihengruppen verwendet wird, oder experimentieren Sie, bis der gewünschte Legendentext angezeigt wird.
Kreis- und Ringdiagramme
Im Abschnitt Datenpunktbeschriftungen und Legendenbeschriftungen wird erläutert, wie innere und äußere Datenpunktbezeichnungen für Kreisdiagrammsegmente festgelegt werden. In diesem Abschnitt werden weitere Eigenschaften von Kreis- und Ringdiagrammen erläutert.
Anders als bei anderen Diagrammtypen enthält ein Kreis- oder Ringdiagramm lediglich eine „Gruppierungsdimension“ (bzw. eine Datenreihe). Um bei Kreis- und Ringdiagrammen zwei Dimensionen zu erhalten, müssen die Diagramme übereinander platziert werden.
Hinweis Während der Berichtsveröffentlichung wandelt Reporting Services die Datenreihengruppen eines Kreis- oder Ringdiagramms automatisch in Kategoriegruppen um, um die Daten als eine Datenreihe darzustellen.
Kreisdiagramme werden häufig zur Darstellung relativer Prozentwerte von Datenpunkten verwendet. Im Allgemeinen lässt sich der Prozentwert (der z. B. zur Ausweisung einer Datenpunktbeschriftung genutzt werden kann) durch eine Division des Datenpunktwerteausdrucks durch die Gesamtsumme im kompletten Diagramm errechnen. Ein Beispiel hierfür zeigt der folgende Code.
=Sum(Fields!Sales.Value) / Sum(Fields!Sales.Value, "SalesChart")
Dieser Ausdruck wird als Datenbeschriftungsausdruck hinzugefügt, wie in Abbildung 16 zu sehen.
Abbildung 16: Datenbeschriftung, Prozentwertberechnung
In der Standardeinstellung sind Kreisdiagrammsegmente schwarz umrandet, um die Abgrenzung der Segmente sichtbarer zu machen. Wie in Abbildung 17 des nächsten Abschnitts zu sehen, können Sie diese Umrandung durch bestimmte Einstellungen für die Datenpunktdarstellung auch überschreiben. Wenn die Umrandungsfarbe mit der Farbe des Kreissegments übereinstimmen soll, müssen Sie eine benutzerspezifische Farbpalette definieren, wie im vorherigen Abschnitt bereits erläutert wurde. Mit der benutzerdefinierten Farbpalette können Sie für die Umrandung dieselbe Farbe wie für das Kreissegment festlegen. Dazu rufen Sie die benutzerdefinierte Funktion auf, die für die Zuordnung der Farben entsprechend dem Kategoriegruppenwert zuständig ist.
Hinzufügen von Diagrammdatentabellen
In Ihr Diagramm können Sie auch Detaildaten einbinden. Das direkte Hinzufügen von Daten zum Diagramm ist nicht zu empfehlen, da es die visuelle Aussagekraft des Diagramms einschränkt. Die Aufnahme der Informationen in eine Datentabelle ist dagegen vorteilhafter.
Ein Diagramm bietet sich als wirksames visuelles Mittel zur Darstellung einer Werteverteilung und zur Hervorhebung interessanter Bereiche an (z. B. sehr kleine oder sehr hohe Werte). Für manch einen Leser ist vielleicht auch eine detailliertere Analyse der Informationen auf Basis der zugrunde liegenden Detaildaten interessant.
Reporting Services bietet drei Möglichkeiten, Diagrammdatenpunkte mit Interaktivität zu versehen:
-
Mit der Aktion Zu Bericht springen lassen sich Detaildaten aufrufen, indem zu einem anderen Bericht weiter aufgeschlüsselt wird. Die Aufschlüsselung wird dabei von den gegenwärtigen Reihen-/Kategoriegruppenwerten abhängig gemacht, indem diese als Parameterwerte für die Drillthroughfunktion eingesetzt werden.
-
Mit der Aktion Zu Lesezeichen springen kann zu einem anderen Abschnitt (wie etwa einer Datentabelle) innerhalb desselben Berichts gewechselt werden.
-
Mit der Aktion Zu URL springen können Sie einen Hyperlink auf ein externes Navigationsziel außerhalb des Berichts definieren.
Abbildung 17 zeigt eine vereinfachte Variante des Beispielberichts PiePercentage, der diesem Whitepaper beigefügt ist.
Abbildung 17: Kreisdiagramm mit benutzerdefinierter Formatierung, benutzerdefinierter Farbpalette und einer Datentabelle (zum Vergrößern auf das Bild klicken)
So wird eine Datentabelle erstellt
-
Zuerst wird ein Kreisdiagramm mit einer benutzerdefinierten Farbpalette erstellt.
Das Kreisdiagramm in Abbildung 17 enthält zwei Kategoriegruppierungen. Als äußere Gruppierung dient das Auftragsjahr. Als innere Gruppierung dient die Produktkategorie. Die benutzerdefinierte Farbpalette ist wie unter Schritt 2 im Abschnitt über das Erstellen einer benutzerdefinierten Farbpalette definiert.
Da zwei Kategoriegruppierungen vorliegen, wird anhand des folgenden Ausdrucks ein kombinierter Schlüssel generiert, der anschließend an die Funktion GetColor übergeben wird.
=Code.GetColor(Fields!OrderYear.Value & Fields!ProdCat.Value)
Wenn derselbe GetColor-Funktionsaufruf auch in den Farbeigenschaften des Datenpunkts und in den Farbeigenschaften der Datenpunktumrandung übernommen wird, ist die schwarze Standardumrandung in den Kreissegmenten nicht mehr zu sehen.
-
Nun sollen nur für die Kreissegmente Datenpunktbezeichnungen angezeigt werden, die mindestens 4 Prozent vom Gesamtkreis ausmachen.
Dazu wird folgende Funktion in den benutzerdefinierten Code-Bereich des Berichts eingetragen. Der wichtigste Teil ist dabei die Rückgabe einer Zeichenfolge mit einer leeren Beschriftung für diejenigen Kreissegmente, die keine Beschriftungen erhalten sollen. Andernfalls zeigt das Diagrammsteuerelement die Standardbeschriftung für das betreffende Segment an. (Als Standardbeschriftung wird der zugrunde liegende Datenpunktwert herangezogen.)
Public Function GetLabel(ByVal currentValue As Double, ByVal totalValue As Double) As String
If currentValue / totalValue < 0.04 Then
Return " "
Else
Return Format(currentValue / totalValue, "P1")
End If
End Function
Der Beschriftungsausdruck für den Datenpunkt ruft die Funktion GetLabel auf, um den Prozentwert bzw. die -beschriftung zu ermitteln.
=Code.GetLabel(Sum(Fields!Sales.Value), Sum(Fields!Sales.Value, "SalesChart"))
-
Nun wird eine Datentabelle (Matrix) für das Diagramm erstellt.
Das Diagramm enthält nur die zusammengefassten Umsatzdaten pro Jahr und pro Produktkategorie. In der Datenmatrix sollen die Daten auf gleiche Weise gruppiert werden.
Dazu wird ein Matrixdatenbereich hinzugefügt und an dasselbe Dataset wie das Diagramm gebunden. Anschließend werden die Felder OrderYear und ProdCat als Zeilengruppen in die Matrix eingefügt, und die Sales-Werte werden in der Matrixzelle per Aggregat zusammengefasst. Zum Ergänzen von Zwischensummen klicken Sie mit der rechten Maustaste auf die Gruppenkopfzellen in der Matrix und wählen Zwischensumme aus dem Kontextmenü.
Hinweis Wenn Sie auf das kleine grüne Dreieck im Matrixkopfbereich klicken, werden die Teilergebnis-Eigenschaften aufgerufen, wo Sie für die Teilergebniszellen spezielle Formatierungen einstellen können. Sie können beispielsweise die Zellen mit den Teilergebnissen mit einer anderen Hintergrundfarbe unterlegen, um sie optisch von den übrigen Daten abzugrenzen.
Das zugrunde liegende Dataset stellt tiefgreifendere Datenaufschlüsselungen zur Verfügung, die über die Darstellungsmöglichkeiten in einem Diagramm hinausgehen. Diese Tatsache lässt sich anhand einer Datenmatrix ausnutzen, indem eine weitere (innere) Zeilengruppe auf Basis der Unterkategorie ergänzt und Quartal und Monat als Matrixspaltengruppen definiert werden.
-
Drilldownoptionen in die Datenmatrix aufnehmen.
Um für eine bestimmte Gruppe einen Drilldowneffekt einzubinden, klicken Sie mit der rechten Maustaste auf den Gruppenkopfbereich, und bearbeiten Sie die Gruppeneigenschaften. Wählen Sie im Dialogfeld Gruppeneigenschaften auf der Registerkarte Sichtbarkeit den Berichtelementnamen, anhand dessen die Sichtbarkeit der aktuellen Gruppe ein-bzw. ausgeschaltet werden soll. In der Regel wählen Sie dafür den Berichtelementnamen des Textfeldes in der übergeordneten Gruppe aus. Wenn keine übergeordnete Gruppe vorhanden ist, können Sie in der Matrixecke ein Textfeld platzieren und damit die Sichtbarkeit der äußersten Gruppierungsebene in der Matrix ein- bzw. ausschalten.
Die Option Ursprüngliche Sichtbarkeit, mit der der Anfangsstatus der Umschaltfunktion festgelegt wird, lässt sich auch auf der Registerkarte Sichtbarkeit der Gruppe definieren. Wenn diese Option auf Sichtbar eingestellt wird, ist die Gruppe im Ausgangszustand erweitert zu sehen; sie ist aber nicht zu sehen, wenn Ausgeblendet eingestellt ist.
-
Festlegen des ursprünglichen Umschaltbildes und des Umschaltstatus.
Wenn der ursprüngliche Sichtbarkeitsstatus einer Gruppe auf Sichtbar eingestellt ist, ist das Umschaltbild in dem Berichtelement, mit dem die Sichtbarkeit der Gruppe umgeschaltet wird, unter Umständen mit einem Pluszeichen (+) versehen. Um stattdessen das Minuszeichen (-) mit dem Umschaltbild anzuzeigen, klicken Sie mit der rechten Maustaste auf das Berichtselement, mit dem die Gruppensichtbarkeit umgeschaltet wird. In der Regel ist dies das Textfeld im Kopfbereich der übergeordneten Gruppe. Wählen Sie Eigenschaften im Kontextmenü. Klicken Sie im Dialogfeld Textfeldeigenschaften auf die Registerkarte Sichtbarkeit und legen Sie die Ersteinstellung für die Darstellung des Umschaltbildes fest. Da für die Sichtbarkeitsoption der Gruppe Sichtbar festgelegt ist, sollte die Ausgangsdarstellung des Textfelds auf Erweitert (-) eingestellt sein, wie in Abbildung 18 zu sehen ist.
Abbildung 18: Einstellen der ursprüngliche Darstellung des Umschaltbildes
-
Nun können Lesezeichen zum Verbinden des Diagramms mit der Datenmatrix hinzugefügt werden (optional).
Zwei Schritte sind erforderlich, um eine Lesezeichennavigation von den Diagrammdatenpunkten zur Datenmatrix zu ermöglichen. Zuerst müssen die Lesezeichen-IDs innerhalb der Datenmatrix definiert werden. Anschließend muss die Navigationsaktion „Zu Lesezeichen springen“ für den Diagrammdatenpunkt festgelegt werden.
Um Lesezeichen zur Datenmatrix hinzuzufügen, klicken Sie mit der rechten Maustaste auf den Gruppenkopfbereich der Zeilengruppe mit dem Auftragsjahr, und klicken Sie im Kontextmenü auf Eigenschaften. Klicken Sie im Dialogfeld Textfeldeigenschaften auf die Registerkarte Navigation, und legen Sie als Ausdruck unter Lesezeichen-ID einen Ausdruck fest, mit dem eine Zeichenfolge generiert wird: =CStr(Fields!OrderYear.Value). Das Sprungziel des Lesezeichens wird hierdurch angegeben.
Öffnen Sie das Dialogfeld Diagrammeigenschaften, und bearbeiten Sie die Datenpunkteigenschaften. Klicken Sie auf der Registerkarte Aktion auf Zu Lesezeichen springen, und tragen Sie denselben Ausdruck ein, der zuvor unter der Option „Lesezeichen-ID“ eingegeben wurde.
Punkt- und Blasendiagramme
Punkt- und Blasendiagramme unterscheiden sich von den übrigen Diagrammtypen, da bei ihnen als X-Achsenwerte keine Kategoriegruppenwerte, sondern explizite X-Werte als Datenpunkte aufgetragen sind. Folglich lassen sich die Daten in einer anderen Kategorie gruppieren (und zusammenfassen) als der Wert, der auf der X-Achse angezeigt wird. Beispiel: Um den Vorjahresumsatz eines bestimmten Vertriebsmitarbeiters auf der X-Achse aufzutragen, ist es nicht zweckmäßig, die Y-Werte zusammenzufassen, wenn zwei Vertriebsmitarbeiter über identische X-Werte verfügen. Der Beispielbericht BubbleChart (Abbildung 19) enthält eine von dem Vertriebsmitarbeiter abhängige Kategoriegruppierung. Dadurch werden die Umsatzdaten pro Vertriebsmitarbeiter zusammengefasst. Der Wert des Vorjahresumsatzes wird jedoch auf der X-Achse angezeigt.
Hinweis Den genauen Unterschied zwischen der Eigenschaft des X-Wertes eines Datenpunkts und der Gruppierung der Diagrammdaten auf der Basis von Datenreihen und Kategoriegruppen sollten Sie unbedingt kennen. Wenn bei der Erstellung eines Punkt- oder Blasendiagramms in der Vorschau nur ein Datenpunkt zu sehen ist, Sie jedoch viele verschiedene Punkte erwartet haben, liegt es sehr wahrscheinlich daran, dass keine Kategoriegruppen oder Datenreihengruppen definiert wurden. Wenn weder Kategorie- noch Datenreihengruppen definiert sind, werden die zugrunde liegenden Dataset-Zeilen zu einem Datenpunkt mit einem bestimmten X- und Y-Wert zusammengefasst. In manchen Fällen können Sie einen Kategorie- oder Datenreihengruppenausdruck definieren, der mit dem X-Werteausdruck identisch ist. Im Falle eines Punkt- oder Blasendiagramms ist es aber sinnvoller, eine Kategorie- oder Datenreihengruppierung auf der Grundlage der Dateninhalte zu definieren. Wenn in dem Diagramm die Umsatzwerte pro Vertriebsmitarbeiter zusammengefasst werden, sollte die Kategorie- oder Datenreihengruppierung von der Mitarbeiter-ID bzw. dem Namen abhängig gemacht werden, wie dies im Beispielbericht BubbleChart zu sehen ist.
Abbildung 19: Blasendiagramm mit Reihendaten gruppiert nach Mitarbeitern
Ein weiteres nützliches Szenario für Punktdiagramme ist in dem Beispielbericht StepFunctionChart skizziert. Beim Punktliniendiagramm wird eine Kategoriegruppierung auf der Basis von Mess-IDs benutzt. An bestimmten Tagen, die als X-Werte dargestellt sind, liegen viele Messungen im Dataset vor, die auf der Y-Achse aufgetragen sind. Das Resultat stellt sich in Form vertikaler Schritte dar.
Abbildung 20: Punktdiagramm z. B. auf der Basis von Sensormessungen
In Tabellen integrierte Diagramme
Es kann vorkommen, dass zur Laufzeit eine unbekannte Menge Daten vorliegt. Das Diagramm soll dann dem Datenaufkommen entsprechend dynamisch „mitwachsen“. Eine Lösung dafür besteht darin, ein Diagramm in eine andere Datenbereichsgruppe einzubinden. Sie können z. B. einen Listendatenbereich verwenden, bei dem eine Detailgruppe von folgendem Ausdruck abhängt.
=Ceiling(RowNumber(Nothing)/20)
Das Ergebnis ist eine Gruppe pro zwanzig Detailzeilen. Durch das Einbinden eines Diagramms in die jeweilige Liste werden alle zwanzig Zeilen Diagramminstanzen generiert.
Um eine Darstellung der Daten mit integrierten Balken zu erstellen, haben Sie zwei verschiedene Implementierungsmöglichkeiten:
-
Binden Sie eine Grafik mit dynamisch berechneten Werten mit Textabstand rechts (siehe Abbildung 21) ein. Durch Anpassen des rechten Textabstands einer statischen Grafik wird der Balkendiagrammeffekt erzielt, weil die Grafik dynamisch gestreckt wird.
-
Binden Sie ein Balkendiagram mit einem berechneten Y-Achsen-Maximalwert ein (siehe Abbildung 23).
-
Beide Lösungen sind nebeneinander im Beispielbericht TableInlineCharts dargestellt.
Abbildung 21: Tabelle mit integriertem Diagramm, welches durch eine eingebettete Grafik mit dynamischem Feldausgleich simuliert wird
Integrierte Darstellungen auf der Basis eingebetteter Grafiken implementieren
-
Entwerfen Sie eine eingebettete Grafik, die als „Balkendarstellung“ herangezogen wird.
Eine einfache Grafik mit Farbverlauf sieht in der Regel gut aus. Binden Sie das Bild als eingebettete Grafik in den Bericht ein.
-
Fügen Sie der Gruppe eine Tabelle hinzu und stellen Sie die Daten dar.
Legen Sie die Gruppierungsstruktur der Tabelle fest. Sie können die Bilddarstellung entweder in einen Gruppenkopfbereich oder in die Detailzeile der Tabelle platzieren. Fügen Sie eine eingebettete Grafik in eine neue Tabellenspalte ein. Wählen Sie die unter Schritt 1 eingebettete Grafik als Bildquelle aus.
-
Berechnen Sie den Textabstand rechts (oder links) des Bilds.
Erstellen Sie einen Ausdruck für die Eigenschaft des Textabstands rechts (bzw. links) des grafischen Berichtselements. In dem Ausdruck wird der darzustellende numerische Wert durch den Höchstwert geteilt. Anschließend multiplizieren Sie die relative Größe mit der Breite der Tabellenspalte, die unter Schritt 2 definiert wurde. Eventuell können Sie auf die Funktionen Math.Min bzw. Math.Max zurückgreifen, um das Auffüllen auf einen bestimmten Wertebereich zu beschränken, falls dies erforderlich sein sollte.
Im Beispielbericht TableInlineChart hat die Tabellenspalte eine Breite von 2 Zoll. Zur Berechnung des Textabstands werden Punkte als Maßeinheit benutzt. Es sind 72 Punkte pro Zoll. Wenn von einem Textabstand links von 0 Punkten ausgegangen wird, so beträgt der Bereich für die Option Textabstand rechts 144 Punkte. Der Textabstand wird mit folgendem Code festgelegt.
=144 * (1.0 - Fields!UnitsInStock.Value / Max(Fields!UnitsInStock.Value, "DataSet1")) & "pt"
Abbildung 22: Dynamische Berechnung des Textabstands rechts vom Bild
-
Die Bildgröße muss korrekt auf Passend eingestellt werden.
Der im vorherigen Schritt definierte Textabstand legt fest, wie viel Platz für das Strecken der Grafik noch zur Verfügung steht. Dadurch entsteht der Balkengrafikeffekt.
Ein Nachteil bei der Methode mit der eingebetteten Grafik besteht darin, dass die Grafik gestreckt werden kann, wenn Sie Schriftarten oder schmale Linien in der Grafik verwenden. Durch Verwendung eines Diagramms zur integrierten Darstellung (Abbildung 23) erhalten Sie mehr Kontrolle über die Darstellungsweise, was häufig zu einem besseren Resultat führt.
Abbildung 23: In einer Tabelle integriertes Diagramm, das im Gruppenkopfbereich der Tabelle eingebettet ist
So wird ein Diagramm zur integrierten Darstellung verwendet
-
Fügen Sie eine Tabelle hinzu, um die Daten zu gruppieren.
Legen Sie die Gruppierungsstruktur der Tabelle fest. Denken Sie daran, dass Diagramme nur im Tabellenkopf- oder -fußbereich oder in den Gruppenkopf- oder -fußbereich aufgenommen werden können.
-
Fügen Sie eine neue Tabellenspalte hinzu, und platzieren Sie das Diagramm in einem Gruppenkopfbereich.
Damit der Diagrammzeichenbereich für die Balkendarstellung so groß wie möglich bleibt, sind folgende Einstellungen in den Diagrammeigenschaften zu wählen.
Allgemeine Einstellungen: Auf Balkendiagramm einstellen, Legende ausschalten.
Daten: Binden Sie das Diagramm an dasselbe Dataset wie die übergeordnete Tabelle, fügen Sie einen Datenpunkt auf der Basis des darzustellenden Wertes hinzu.
X-Achse: Achsenbeschriftungen ausschalten, Gitternetzlinien ausschalten, für die Teilstriche Keine einstellen.
Y-Achse: Achsenbeschriftungen ausschalten, für die Teilstriche Keine einstellen, als Maximum den Höchstwert einstellen, der in dem Bereich mit der enthaltenen Tabelle oder dem Dataset errechnet wurde. Dies ist erforderlich, um die richtige Balkengröße zu erhalten. Andernfalls würde jede Diagramminstanz eine automatische Skalierung der Y-Achse auf Basis der Datenwerte für die jeweilige Gruppe einstellen.
-
Die Diagrammdarstellung optisch verfeinern (optional).
Experimentieren Sie mit den Stileigenschaften für den Diagrammzeichenbereich, den Hauptrastereinstellungen der Y-Achse, den 3D-Effekten oder den dynamischen Farbeinstellungen, um die Darstellung mit dem integrierten Diagramm noch weiter zu verfeiern.
Diagrammerweiterbarkeit und manuelles Erstellen von Diagrammen
Dieses Whitepaper enthält Informationen zur Optimierung der Diagrammeinstellungen und zur Erweiterung der vorhandenen Diagrammfunktionen durch Ausdrücke und Funktionen mit benutzerdefiniertem Code. Darüber hinaus gibt es weitere Lösungsansätze, um noch weitere fortschrittliche Diagrammfunktionen in die Reporting Services zu integrieren:
-
Integrieren von Diagrammbildern, die durch benutzerdefinierte Assemblys generiert werden.
-
Implementieren einer Erweiterbarkeit der Diagrammfunktionen durch die neue benutzerdefinierte Berichtelement-Funktion von Reporting Services 2005.
-
Die Verwendung von Reporting Services 2005 Add-in-Komponenten von Drittanbietern, mit denen weitere Diagrammfunktionen ergänzt werden. Diese basieren auf der benutzerdefinierten Berichtelementfunktion.
Integrieren von Diagrammbildern, die durch benutzerdefinierte Assemblys generiert werden
-
Entwickeln und implementieren Sie eine benutzerdefinierte Assembly zum Generieren von Bildern.
Hinweis Die benutzerdefinierte Assembly muss das Bild als Byte[] ausgeben können. Eine Ausgabe als System.Drawing.Image ist nicht zulässig. Mit einem Code wie dem Folgenden lassen sich System.Drawing.Image-Objekte häufig umwandeln.
System.IO.MemoryStream renderedImage = new MemoryStream();
myChart.Save(renderedImage);
renderedImage.Position = 0;
return renderedImage.ToArray();
-
Fügen Sie ein Bild in den Bericht ein.
Stellen Sie den Bildtyp auf Datenbank ein. Wenn das erzeugte Bild eine Bitmapgrafik im PNP-Format ist, legen Sie als Bildeigenschaft mimetype „image/png“ fest. Als Bildwerteigenschaft verwenden Sie einen Ausdruck ähnlich wie den folgenden.
=MyCustomAssembly.GenerateChart()
-
Rufen Sie den Bericht in der Seitenansicht des Bericht-Designers auf, um zu kontrollieren, ob die Berichtfunktionen korrekt ausgeführt werden.
Hinweis Bei einer Standardkonfiguration werden benutzerdefinierte Assemblys als FullTrust in der Seitenansicht des Bericht-Designers ausgeführt. Funktionen, die für die Code-Ausführung bestimmte Zugriffsrechte (z. B. Dateiein- und -ausgabe, Zugriff auf Datenquellen usw.) erfordern, erhalten diese Befugnisse im Modus FullTrust automatisch.
-
Benutzerdefinierte Assembly auf einem Berichtserver einsetzen.
Es muss sichergestellt werden, dass die Sicherheitsrichtlinien-Konfiguration des Berichtservers der benutzerdefinierten Assembly zur Laufzeit ausreichende Zugriffsrechte einräumt. Andernfalls schlägt die Bilderstellung fehl. Weitere Informationen finden Sie im Abschnitt zu Codezugriffssicherheit in Reporting Services (möglicherweise auf Englisch) in der SQL Server 2005-Onlinedokumentation.
Auf benutzerdefinierte Berichtselemente basierende Diagramme verglichen mit benutzerdefinierten Assemblys
Die Benutzung der benutzerdefinierten Berichtselementfunktion hat gegenüber benutzerdefinierten Assembly-Lösungen mehrere Vorteile. Erstens können Sie dadurch Ihre eigenen individuell gestalteten Supportkomponenten zusammenstellen, die sich direkt im Bericht-Designer integrieren lassen. Zweitens können Sie zur Laufzeit von der Reporting Services-Verarbeitungsengine profitieren, die die Daten abruft und die Gruppier-, Sortier- und Filterfunktionen ausführt. Das Laufzeitsteuerelement CustomReportItem greift dabei auf die verarbeiteten Daten zu und erstellt ein Diagrammbild mit einem interaktiven Imagemap und damit verbundenen Aktionen.
Studieren Sie aufmerksam die Dokumentation und die Beispiele, bevor Sie ein eigenes benutzerdefiniertes Berichtselement erstellen. Weitere Informationen finden Sie auf folgenden Websites:
Dieses Whitepaper enthält Tipps und Erkenntnisse über die Diagrammfunktionen von Reporting Services, die in anderen Büchern, Artikeln, Veröffentlichungen oder Präsentationen zuvor noch nicht behandelt wurden. Darin wird auch besprochen, wie und wann sich Optionen mit bestimmten Funktionen am besten nutzen lassen.
Das Whitepaper stellt eine Reihe von Berichtbeispielen vor, die ausführlich erläutert werden. Anhand der Beispiele wird veranschaulicht, wie die in Reporting Services integrierten Diagrammfunktionen bei bestimmten Ausgangssituationen optimal ausgeschöpft werden. Es wird beispielsweise erläutert, wie eine Pareto-Analyse hinzugefügt oder wie gleitende Durchschnittswerte berechnet werden.
Abschließend wird in der Publikation in Kürze die Erweiterbarkeit von Reporting Services angesprochen, die Ihnen die Möglichkeit an die Hand gibt, externe (Diagramm-) Funktionen in Ihre Berichte einzubinden.