Frage

Wie schattiert man abwechselnde Zeilen in einem SQL Server Reporting Services-Bericht?


Bearbeiten: Nachfolgend finden Sie eine Reihe guter Antworten – von schnell Und einfach Zu komplex und umfassend.Leider kann ich nur eines auswählen ...

War es hilfreich?

Lösung

Gehen Sie zur Eigenschaft „BackgroundColor“ der Tabellenzeile und wählen Sie „Ausdruck …“

Verwenden Sie diesen Ausdruck:

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Dieser Trick lässt sich auf viele Bereiche des Berichts anwenden.

Und in .NET 3.5+ könnten Sie Folgendes verwenden:

= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Ich suche keinen Vertreter – ich habe diese Frage nur selbst recherchiert und dachte, ich würde sie teilen.

Andere Tipps

Die Verwendung von IIF(RowNumber...) kann beim Gruppieren von Zeilen zu Problemen führen. Eine andere Alternative besteht darin, eine einfache VBScript-Funktion zum Bestimmen der Farbe zu verwenden.

Es ist etwas aufwändiger, aber wenn die Basislösung nicht ausreicht, ist es eine schöne Alternative.

Grundsätzlich fügen Sie dem Bericht wie folgt Code 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

Legen Sie dann für jede Zelle die Hintergrundfarbe wie folgt fest:

=Code.AlternateColor("AliceBlue", "White", True)

Ausführliche Informationen hierzu finden Sie hier Wrox-Artikel

Ich habe den Schacheffekt bekommen, als ich die Lösung von Catch22 verwendet habe, weil meine Matrix mehr als eine Spalte im Design hat.Dieser Ausdruck hat bei mir gut funktioniert:

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")

Ich habe die Lösung von @Catch22 ein wenig geändert, da mir die Idee nicht gefällt, in jedes Feld gehen zu müssen, wenn ich beschließe, eine der Farben zu ändern.Dies ist besonders wichtig bei Berichten, bei denen es zahlreiche Felder gibt, bei 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

Mir ist aufgefallen, 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 jedem Feld Folgendes hinzu:

=Code.AlternateColor(rownumber(nothing))

Dies ist viel robuster als die manuelle Änderung der Farbe in der Hintergrundfarbe jedes Feldes.

Was mir aufgefallen ist, ist, dass keine der beiden oberen Methoden eine Vorstellung davon hat, welche Farbe die erste Zeile in einer Gruppe haben sollte;Die Gruppe beginnt einfach mit der entgegengesetzten Farbe zur 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 Schalter beim Start jeder Gruppe zurückzusetzen, 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 also drei verschiedene Arten von Zellhintergründen:

  1. Die erste Spalte der Datenzeile hat =Code.AlternateColor("AliceBlue", "White", True) (Dies ist dasselbe wie die vorherige Antwort.)
  2. Die verbleibenden Spalten der Datenzeile haben =Code.AlternateColor("AliceBlue", "White", False) (Auch dies ist dasselbe wie die vorherige Antwort.)
  3. Die erste Spalte der Gruppierungszeile hat =Code.RestartColor("AliceBlue") (Das ist neu.)
  4. Die verbleibenden Spalten der Gruppierungszeile haben =Code.AlternateColor("AliceBlue", "White", False) (Dies wurde zuvor verwendet, aber für die Gruppierungszeile wird es nicht erwähnt.)

Das funktioniert bei mir.Wenn Sie möchten, dass die Gruppierungszeile nicht farbig ist oder eine andere Farbe hat, sollte daraus ziemlich offensichtlich sein, wie Sie sie ändern können.

Bitte zögern Sie nicht, Kommentare dazu hinzuzufügen, was getan werden könnte, um diesen Code zu verbessern:Ich bin sowohl mit SSRS als auch mit VB völlig neu und vermute daher stark, dass es viel Raum für Verbesserungen gibt, aber die Grundidee scheint solide zu sein (und sie war für mich nützlich), also wollte ich sie hier veröffentlichen.

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 innerhalb jeder Gruppe „zurückzusetzen“.Ich wollte, dass die erste Detailzeile in jeder Untergruppe mit Weiß beginnt, und diese Lösung (bei Verwendung in der Detailzeile) ermöglichte dies:

=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")

Sehen: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx

Die Lösung von Michael Haren funktioniert für mich gut.Ich habe jedoch eine Warnung erhalten, dass „Transparent“ in der Vorschau keine gültige Hintergrundfarbe ist.Habe eine schnelle Lösung gefunden vonFestlegen der Hintergrundfarbe von Berichtselementen in SSRS.Verwenden Sie „Nothing“ anstelle von „Transparent“.

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)

Die einzige effektive Möglichkeit, dieses Problem ohne die Verwendung von VB zu lösen, besteht darin, den Modulowert der Zeilengruppierung innerhalb der Zeilengruppierung (und außerhalb der Spaltengruppierung) zu „speichern“ und innerhalb Ihrer Spaltengruppierung explizit darauf zu verweisen.Diese Lösung habe ich unter gefunden

http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html

Aber Ankeet ist nicht besonders gut darin, zu erklären, was passiert, und seine Lösung empfiehlt den unnötigen Schritt, eine Gruppierung auf der Grundlage eines konstanten Werts zu erstellen. Deshalb ist hier mein Schritt-für-Schritt-Prozess für eine Matrix mit einer einzelnen Zeilengruppe RowGroup1:

  1. Erstellen Sie eine neue Spalte innerhalb der RowGroup1.Benennen Sie das Textfeld dafür in etwa „RowGroupColor“ um.
  2. Legen Sie den Wert des Textfelds von RowGroupColor auf fest

    =iif(RunningValue(Fields![RowGroupField].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  3. Setzen Sie die BackgroundColor-Eigenschaft aller Ihrer Zeilenzellen auf

    "=ReportItems!RowGroupColor.Value"

  4. Stellen Sie die Breite der Spalte für die RowGroupColor auf 0PT ein und setzen Sie Cangrow auf False, um sie vor Clients zu verbergen.

Voila!Dies löst auch viele der in diesem Thread genannten Probleme:

  • Automatisches Zurücksetzen für Untergruppen:Fügen Sie einfach eine neue Spalte für diese Zeilengruppe hinzu, indem Sie a durchführen RunningValue An es ist Gruppenwerte.
  • Sie müssen sich keine Gedanken über das Umschalten zwischen Wahr und Falsch machen.
  • Zur einfachen Änderung werden die Farben nur an einer Stelle gehalten.
  • Kann austauschbar für Zeilen- oder Spaltengruppen verwendet werden (setzen Sie einfach die Höhe auf 0 statt auf die Breite).

Es wäre großartig, wenn SSRS neben dem Wert auch Eigenschaften für Textfelder verfügbar machen würde.Sie könnten diese Art der Berechnung einfach in eine BackgroundColor-Eigenschaft der Textfelder der Zeilengruppe einfügen und sie dann in allen anderen Zellen als ReportItems!RowGroup.BackgroundColor referenzieren.

Na ja, 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 die beiden besten Lösungen hier gefunden alle die Zeilen in Spalte 1 mit farbigem Hintergrund, alle Zeilen in Spalte 2 mit weißem Hintergrund, alle Zeilen in Spalte 3 mit farbigem Hintergrund usw.Es ist als ob RowNumber Und bOddRow (der Catch22-Lösung) Achten Sie auf meine Spaltengruppe, anstatt sie zu ignorieren und nur mit einer neuen Zeile abzuwechseln.

Was ich wollte, ist für alle Säulen in Zeile 1 einen weißen Hintergrund, dann alle Spalten in Zeile 2 einen farbigen Hintergrund, dann alle Spalten in Zeile 3 einen weißen Hintergrund und so weiter.Ich habe diesen Effekt erzielt, indem ich die ausgewählte Antwort verwendet habe, aber nicht bestanden habe Nothing Zu RowNumber, ich habe den Namen meiner Spaltengruppe übergeben, z.B.

=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")

Ich dachte, das könnte für jemand anderen nützlich sein.

Ich denke, dieser Trick wird hier nicht besprochen.Hier ist es also,

In einer beliebigen Art von komplexer Matrix, wenn Sie alternative Zellfarben, entweder zeilenweise oder spaltenwise, möchten, ist die Arbeitslösung,

Wenn Sie spaltenweise eine andere Farbe der Zellen wünschen, dann

  1. Erstellen Sie in der unteren rechten Ecke einer Berichtsansicht in "Spaltengruppen" eine gefälschte übergeordnete Gruppe auf 1 (mit Ausdruck) mit dem Namen "FakeParentgroup".
  2. Dann, im Berichtsdesign, für Zellen, die alternativ gefärbt werden, nach Hintergrundfarbenexpression verwenden

=IIF(RunningValue( Fields![ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "White", "LightGrey")

Das ist alles.

Das Gleiche gilt für die alternativen Farbreihen, nur müssen Sie die Lösung entsprechend bearbeiten.

NOTIZ: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 ins Bild kam, als Sie eine gefälschte übergeordnete Gruppe erstellten.

Wenn Sie für den gesamten Bericht eine wechselnde Farbe benötigen, können Sie das DataSet, an das Ihr Tablix gebunden ist, für eine berichtsweite Identitätszeilennummer 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 die allererste Zelle der Zeile (für die Zeilenhintergrundformatierung) einen fehlenden Wert aufweist (in komplexen Tablixen mit Spalten-/Zeilengruppen und fehlenden Werten).

Die Lösung von @Aditya nutzt geschickt countDistinct Ergebnis von runningValue Funktion zum Identifizieren von Zeilennummern innerhalb einer Tablix-(Zeilen-)Gruppe.Wenn Sie Tablix-Zeilen mit fehlendem Wert in der ersten Zelle haben, runningValue wird nicht erhöht countDistinct Ergebnis und es gibt die Nummer der vorherigen Zeile zurück (und wirkt sich daher auf die Formatierung dieser Zelle aus).Um dies zu berücksichtigen, müssen Sie einen zusätzlichen Term zum Ausgleich hinzufügen countDistinct Wert.Mein Ansatz bestand darin, den ersten laufenden Wert in der Zeilengruppe selbst zu überprüfen (siehe Zeile 3 des Snippets unten):

=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, die restlichen Felder im folgenden Code (aus dem obigen Beitrag) auf „false“ umzustellen?

Was mir aufgefallen ist, ist, dass keine der beiden oberen Methoden eine Vorstellung davon hat, welche Farbe die erste Zeile in einer Gruppe haben sollte;Die Gruppe beginnt einfach mit der entgegengesetzten Farbe zur 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 Schalter beim Start jeder Gruppe zurückzusetzen, 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 also drei verschiedene Arten von Zellhintergründen:

  1. Die erste Spalte der Datenzeile hat =Code.AlternateColor("AliceBlue", "White", True) (Dies ist dasselbe wie die vorherige Antwort.)
  2. Die verbleibenden Spalten der Datenzeile haben =Code.AlternateColor("AliceBlue", "White", False) (Auch dies ist dasselbe wie die vorherige Antwort.)
  3. Die erste Spalte der Gruppierungszeile hat =Code.RestartColor("AliceBlue") (Das ist neu.)
  4. Die verbleibenden Spalten der Gruppierungszeile haben =Code.AlternateColor("AliceBlue", "White", False) (Dies wurde zuvor verwendet, aber für die Gruppierungszeile wird es nicht erwähnt.)

Das funktioniert bei mir.Wenn Sie möchten, dass die Gruppierungszeile nicht farbig ist oder eine andere Farbe hat, sollte daraus ziemlich offensichtlich sein, wie Sie sie ändern können.

Bitte zögern Sie nicht, Kommentare dazu hinzuzufügen, was getan werden könnte, um diesen Code zu verbessern:Ich bin sowohl mit SSRS als auch mit VB völlig neu und vermute daher stark, dass es viel Raum für Verbesserungen gibt, aber die Grundidee scheint solide zu sein (und sie war für mich nützlich), also wollte ich sie hier veröffentlichen.

Ich habe alle diese Lösungen auf einem gruppierten Tablix mit Zeilenabständen ausprobiert, aber 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 bei mir 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 Tablix mit 7 Spalten verwende ich diesen Ausdruck für die Hintergrundfarbe von Zeilen (von Zellen):

=Code.AlternateColorByColumnCount("LightGrey","White", 7)

Nur weil keine der oben genannten 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, daher konnte ich Ahmads Lösung nicht zum Laufen bringen, aber Diese Lösung hat bei mir funktioniert

Die Grundidee besteht darin, in Ihrer innersten Gruppe eine untergeordnete Gruppe und ein Feld zu erstellen, das die Farbe enthält.Legen Sie dann die Farbe für jede Zelle in der Zeile basierend auf dem Wert dieses Felds fest.

Leichte Modifikation anderer Antworten von hier, die für mich funktioniert haben.Meine Gruppe hat zwei Werte, nach denen ich gruppieren kann, also konnte ich sie einfach beide mit einem + in das erste Argument einfügen, damit es richtig alterniert

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")

Bei der Verwendung von Zeilen- und Spaltengruppen trat das Problem auf, dass die Farben zwischen den Spalten wechselten, obwohl es sich um dieselbe Zeile handelte.Ich habe dieses Problem gelöst, indem ich eine globale Variable verwendet habe, die nur wechselt, 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, im Erste Spalte der Zeile, die Sie abwechseln möchten, setzen Sie den Farbausdruck auf:

=Code.AlternateColor()

-

Stellen Sie in den verbleibenden Spalten alle ein auf:

=Code.BGColor

Dadurch sollten sich die Farben erst abwechseln, nachdem die erste Spalte gezeichnet wurde.

Dies kann (nicht nachweisbar) auch die Leistung verbessern, da nicht für jede Spalte eine mathematische Berechnung durchgeführt werden muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top