Wie schattieren Sie abwechselnde Zeilen in einem SQL Server Reporting Services-Bericht?
Bearbeiten: Im Folgenden finden Sie eine Reihe guter Antworten - von schnell und einfach bis komplex und umfassend . Leider kann ich nur eine auswählen ...
Wie schattieren Sie abwechselnde Zeilen in einem SQL Server Reporting Services-Bericht?
Bearbeiten: Im Folgenden finden Sie eine Reihe guter Antworten - von schnell und einfach bis komplex und umfassend . Leider kann ich nur eine auswählen ...
Antworten:
Gehen Sie zur BackgroundColor-Eigenschaft der Tabellenzeile und wählen Sie "Ausdruck ...".
Verwenden Sie diesen Ausdruck:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Dieser Trick kann auf viele Bereiche des Berichts angewendet werden.
Und in .NET 3.5+ können Sie Folgendes verwenden:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Ich suche keinen Repräsentanten - ich habe diese Frage nur selbst recherchiert und dachte, ich würde sie teilen.
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
Es sieht so aus, als wäre der richtige Ausdruck =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Danke für den Tipp.
Die Verwendung von IIF (RowNumber ...) kann zu einigen Problemen führen, wenn Zeilen gruppiert werden. Eine andere Alternative besteht darin, eine einfache VBScript-Funktion zum Bestimmen der Farbe zu verwenden.
Es ist etwas aufwendiger, aber wenn die Basislösung nicht ausreicht, ist es eine gute Alternative.
Grundsätzlich fügen Sie dem Bericht Code wie folgt hinzu ...
Private bOddRow As Boolean
'*************************************************************************
' -- Display green-bar type color banding in detail rows
' -- Call from BackGroundColor property of all detail row textboxes
' -- Set Toggle True for first item, False for others.
'*************************************************************************
Function AlternateColor(ByVal OddColor As String, _
ByVal EvenColor As String, ByVal Toggle As Boolean) As String
If Toggle Then bOddRow = Not bOddRow
If bOddRow Then
Return OddColor
Else
Return EvenColor
End If
End Function
Stellen Sie dann in jeder Zelle die Hintergrundfarbe wie folgt ein:
=Code.AlternateColor("AliceBlue", "White", True)
Ausführliche Informationen finden Sie in diesem Wrox-Artikel
Ich habe den Schacheffekt erhalten, als ich die Lösung von Catch22 verwendet habe. Ich denke, weil meine Matrix mehr als eine Spalte im Design hat. Dieser Ausdruck funktionierte gut für mich:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Ich habe die Lösung von @ Catch22 geändert. Ein bisschen, weil mir die Idee nicht gefällt, in jedes Feld gehen zu müssen, wenn ich mich entscheide, eine der Farben zu ändern. Dies ist besonders wichtig in Berichten, in denen es zahlreiche Felder gibt, in denen die Farbvariable geändert werden müsste.
'*************************************************************************
' -- Display alternate color banding (defined below) in detail rows
' -- Call from BackgroundColor property of all detail row textboxes
'*************************************************************************
Function AlternateColor(Byval rowNumber as integer) As String
Dim OddColor As String = "Green"
Dim EvenColor As String = "White"
If rowNumber mod 2 = 0 then
Return EvenColor
Else
Return OddColor
End If
End Function
Es wurde festgestellt, dass ich die Funktion von einer Funktion, die die Farben akzeptiert, in eine Funktion geändert habe, die die zu verwendenden Farben enthält.
Fügen Sie dann in jedes Feld Folgendes hinzu:
=Code.AlternateColor(rownumber(nothing))
Dies ist viel robuster als das manuelle Ändern der Farbe in der Hintergrundfarbe der einzelnen Felder.
Eine Sache, die mir aufgefallen ist, ist, dass keine der beiden obersten Methoden eine Vorstellung davon hat, welche Farbe die erste Reihe in einer Gruppe haben sollte. Die Gruppe beginnt nur mit der entgegengesetzten Farbe aus der letzten Zeile der vorherigen Gruppe. Ich wollte, dass meine Gruppen immer mit der gleichen Farbe beginnen ... die erste Reihe jeder Gruppe sollte immer weiß und die nächste Reihe farbig sein.
Das Grundkonzept bestand darin, den Umschalter zurückzusetzen, wenn jede Gruppe startet, also habe ich ein bisschen Code hinzugefügt:
Private bOddRow As Boolean
'*************************************************************************
' -- Display green-bar type color banding in detail rows
' -- Call from BackGroundColor property of all detail row textboxes
' -- Set Toggle True for first item, False for others.
'*************************************************************************
Function AlternateColor(ByVal OddColor As String, _
ByVal EvenColor As String, ByVal Toggle As Boolean) As String
If Toggle Then bOddRow = Not bOddRow
If bOddRow Then
Return OddColor
Else
Return EvenColor
End If
End Function
'
Function RestartColor(ByVal OddColor As String) As String
bOddRow = True
Return OddColor
End Function
Ich habe jetzt drei verschiedene Arten von Zellhintergründen:
Das funktioniert bei mir. Wenn Sie möchten, dass die Gruppierungszeile nicht farbig oder in einer anderen Farbe ist, sollte es ziemlich offensichtlich sein, wie Sie sie ändern können.
Sie können gerne Kommentare dazu hinzufügen, was zur Verbesserung dieses Codes getan werden könnte: Ich bin sowohl für SSRS als auch für VB brandneu, daher vermute ich stark, dass es viel Raum für Verbesserungen gibt, aber die Grundidee scheint vernünftig zu sein (und sie war nützlich für mich) also wollte ich es hier rauswerfen.
für Gruppenkopf- / Fußzeilen:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
Sie können dies auch verwenden, um die Anzahl der Zeilenfarben in jeder Gruppe zurückzusetzen. Ich wollte, dass die erste Detailzeile in jeder Untergruppe mit Weiß beginnt, und diese Lösung (wenn sie in der Detailzeile verwendet wird) ließ dies zu:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
Siehe: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
Die Lösung von Michael Haren funktioniert gut für mich. Ich habe jedoch eine Warnung erhalten, dass "Transparent" bei der Vorschau keine gültige Hintergrundfarbe ist. Eine schnelle Lösung wurde unter Festlegen der Hintergrundfarbe für Berichtselemente in SSRS gefunden . Verwenden Sie nichts anstelle von "Transparent"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
Die einzige effektive Möglichkeit, dies ohne Verwendung von VB zu lösen, besteht darin, den Modulo-Wert für die Zeilengruppierung innerhalb der Zeilengruppierung (und außerhalb der Spaltengruppierung) zu "speichern" und explizit innerhalb Ihrer Spaltengruppierung zu referenzieren. Ich habe diese Lösung bei gefunden
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Aber Ankeet erklärt nicht am besten, was passiert, und seine Lösung empfiehlt den unnötigen Schritt, eine Gruppierung auf einem konstanten Wert zu erstellen. Hier ist mein schrittweiser Prozess für eine Matrix mit einer einzelnen Zeilengruppe RowGroup1:
Setzen Sie den Wert des Textfelds von RowGroupColor auf
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Setzen Sie die BackgroundColor-Eigenschaft aller Ihrer Zeilenzellen auf
"=ReportItems!RowGroupColor.Value"
Voila! Dies löst auch viele der in diesem Thread erwähnten Probleme:
Es wäre fantastisch, wenn SSRS neben Value on Textboxes auch Eigenschaften verfügbar machen würde. Sie können diese Art der Berechnung einfach in eine BackgroundColor-Eigenschaft der Zeilengruppentextfelder einfügen und sie dann in allen anderen Zellen als ReportItems! RowGroup.BackgroundColor referenzieren.
Ahh gut, wir können träumen ...
Mein Problem war, dass ich wollte, dass alle Spalten in einer Zeile den gleichen Hintergrund haben. Ich habe sowohl nach Zeilen als auch nach Spalten gruppiert und mit den beiden besten Lösungen hier alle Zeilen in Spalte 1 mit farbigem Hintergrund, alle Zeilen in Spalte 2 mit weißem Hintergrund und alle Zeilen in Spalte 3 mit farbigem Hintergrund erhalten , und so weiter. Es ist als ob RowNumber
undbOddRow
(von Catch22s Lösung) auf meine Spaltengruppe achten, anstatt dies zu ignorieren und nur mit einer neuen Zeile zu wechseln.
Was ich wollte, ist, dass alle Spalten in Zeile 1 einen weißen Hintergrund haben, dann alle Spalten in Zeile 2 einen farbigen Hintergrund haben, dann alle Spalten in Zeile 3 einen weißen Hintergrund haben und so weiter. Ich habe diesen Effekt durch die gewählte Antwort verwendet aber anstatt vorbei Nothing
zu RowNumber
, legte ich den Namen meiner Spalte Gruppe, zB
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Dachte, dies könnte für jemand anderen nützlich sein.
In jeder Art von komplexer Matrix ist die Arbeitslösung, wenn Sie alternative Zellenfarben entweder zeilenweise oder spaltenweise wünschen,
Wenn Sie eine alternative Farbe der Zellen in der Spalte wünschen, dann
= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
Das ist alles.
Gleiches gilt für die Zeilen mit alternativen Farben. Sie müssen die Lösung nur entsprechend bearbeiten.
HINWEIS: Hier müssen Sie manchmal den Rand der Zellen entsprechend festlegen, normalerweise verschwindet er.
Vergessen Sie auch nicht, den Wert 1 im Bericht zu löschen, der beim Erstellen einer gefälschten übergeordneten Gruppe ins Bild kam.
Wenn Sie für den gesamten Bericht eine abwechselnde Farbe benötigen, können Sie das DataSet, an das Ihr Tablix gebunden ist, für eine berichtsweite Identitätsnummer im Bericht verwenden und diese in der RowNumber-Funktion verwenden ...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
Die Antwort von @ Aditya ist großartig, aber es gibt Fälle, in denen die Formatierung verworfen wird, wenn in der ersten Zelle der Zeile (für die Formatierung des Zeilenhintergrunds) ein Wert fehlt (in komplexen Tablixen mit Spalten- / Zeilengruppen und fehlenden Werten).
Die Lösung von @ Aditya nutzt das countDistinct
Ergebnis der runningValue
Funktion geschickt, um Zeilennummern innerhalb einer Tablix-Gruppe (Zeilengruppe) zu identifizieren. Wenn Sie Tablix-Zeilen mit fehlendem Wert in der ersten Zelle haben, runningValue
wird das countDistinct
Ergebnis nicht erhöht und die Nummer der vorherigen Zeile zurückgegeben (und daher die Formatierung dieser Zelle beeinflusst). Um dies zu berücksichtigen, müssen Sie einen zusätzlichen Begriff hinzufügen, um den countDistinct
Wert auszugleichen . Mein Ansatz war es, den ersten laufenden Wert in der Zeilengruppe selbst zu überprüfen (siehe Zeile 3 des folgenden Snippets):
=iif(
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")
Hoffe das hilft.
Könnte jemand die Logik erklären, die dahinter steckt, den Rest der Felder im folgenden Code (vom obigen Beitrag) auf false zu setzen?
Eine Sache, die mir aufgefallen ist, ist, dass keine der beiden obersten Methoden eine Vorstellung davon hat, welche Farbe die erste Reihe in einer Gruppe haben sollte. Die Gruppe beginnt nur mit der entgegengesetzten Farbe aus der letzten Zeile der vorherigen Gruppe. Ich wollte, dass meine Gruppen immer mit der gleichen Farbe beginnen ... die erste Reihe jeder Gruppe sollte immer weiß und die nächste Reihe farbig sein.
Das Grundkonzept bestand darin, den Umschalter zurückzusetzen, wenn jede Gruppe startet, also habe ich ein bisschen Code hinzugefügt:
Private bOddRow As Boolean
'*************************************************************************
'-- Display green-bar type color banding in detail rows
'-- Call from BackGroundColor property of all detail row textboxes
'-- Set Toggle True for first item, False for others.
'*************************************************************************
'
Function AlternateColor(ByVal OddColor As String, _
ByVal EvenColor As String, ByVal Toggle As Boolean) As String
If Toggle Then bOddRow = Not bOddRow
If bOddRow Then
Return OddColor
Else
Return EvenColor
End If
End Function
'
Function RestartColor(ByVal OddColor As String) As String
bOddRow = True
Return OddColor
End Function
Ich habe jetzt drei verschiedene Arten von Zellhintergründen:
Das funktioniert bei mir. Wenn Sie möchten, dass die Gruppierungszeile nicht farbig oder in einer anderen Farbe ist, sollte es ziemlich offensichtlich sein, wie Sie sie ändern können.
Sie können gerne Kommentare dazu hinzufügen, was zur Verbesserung dieses Codes getan werden könnte: Ich bin sowohl für SSRS als auch für VB brandneu, daher vermute ich stark, dass es viel Raum für Verbesserungen gibt, aber die Grundidee scheint vernünftig zu sein (und sie war nützlich für mich) also wollte ich es hier rauswerfen.
Ich habe alle diese Lösungen auf einem gruppierten Tablix mit Zeilenabständen ausprobiert und keine hat im gesamten Bericht funktioniert. Das Ergebnis waren doppelte farbige Zeilen und andere Lösungen führten zu abwechselnden Spalten!
Hier ist die Funktion, die ich geschrieben habe und die für mich mit einer Spaltenanzahl funktioniert hat:
Private bOddRow As Boolean
Private cellCount as Integer
Function AlternateColorByColumnCount(ByVal OddColor As String, ByVal EvenColor As String, ByVal ColCount As Integer) As String
if cellCount = ColCount Then
bOddRow = Not bOddRow
cellCount = 0
End if
cellCount = cellCount + 1
if bOddRow Then
Return OddColor
Else
Return EvenColor
End If
End Function
Für ein 7-Spalten-Tablix verwende ich diesen Ausdruck für Row (of Cells) Backcolour:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Nur weil keine der obigen Antworten in meiner Matrix zu funktionieren schien, poste ich dies hier:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
In meinen Matrixdaten fehlten Werte, sodass ich die Lösung von ahmad nicht zum Laufen bringen konnte, aber diese Lösung funktionierte für mich
Die Grundidee besteht darin, eine untergeordnete Gruppe und ein Feld in Ihrer innersten Gruppe zu erstellen, die die Farbe enthalten. Stellen Sie dann die Farbe für jede Zelle in der Zeile basierend auf dem Wert dieses Felds ein.
Leichte Modifikation anderer Antworten von hier, die für mich funktioniert haben. Meine Gruppe hat zwei Werte zum Gruppieren, daher konnte ich beide einfach in das erste Argument mit einem + setzen, damit es richtig abwechselt
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Bei der Verwendung von Zeilen- und Spaltengruppen hatte ich ein Problem, bei dem die Farben zwischen den Spalten wechselten, obwohl es sich um dieselbe Zeile handelte. Ich habe dieses Problem mithilfe einer globalen Variablen behoben, die sich nur abwechselt, wenn sich die Zeile ändert:
Public Dim BGColor As String = "#ffffff"
Function AlternateColor() As String
If BGColor = "#cccccc" Then
BGColor = "#ffffff"
Return "#cccccc"
Else
BGColor = "#cccccc"
Return "#ffffff"
End If
End Function
Nun zum erstenSetzen Sie Spalte der Zeile, die Sie abwechseln möchten, den Farbausdruck auf:
= Code.AlternateColor ()
- -
Stellen Sie in den verbleibenden Spalten alle auf Folgendes ein:
= Code.BGColor
Dadurch sollten sich die Farben erst nach dem Zeichnen der ersten Spalte abwechseln.
Dies kann (nicht überprüfbar) auch die Leistung verbessern, da nicht für jede Spalte eine mathematische Berechnung durchgeführt werden muss.