Dodaj zmienny kolor wiersza do raportu SQL Server Reporting services

Jak zaciemnić naprzemienne wiersze w raporcie SQL Server Reporting Services?


Edit: Poniżej znajduje się kilka dobrych odpowiedzi-od szybkich i prostych do złożonych i kompleksowych. Niestety, mogę wybrać tylko jeden...

Author: Community, 2008-09-04

18 answers

Przejdź do właściwości tła wiersza tabeli i wybierz " wyrażenie..."

Użyj tego wyrażenia:

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

Ten trik można zastosować do wielu obszarów raportu.

I w. NET 3.5 + przydałoby się:

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

Nie szukam rep--po prostu zbadałem to pytanie sam i pomyślałem, że podzielę się.

 205
Author: Michael Haren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 04:00:01

Using IIF (RowNumber...) może prowadzić do pewnych problemów podczas grupowania wierszy, a inną alternatywą jest użycie prostej funkcji VBScript do określenia koloru.

To trochę więcej wysiłku, ale gdy podstawowe rozwiązanie nie wystarczy, jest to fajna alternatywa.

Zasadniczo, dodajesz kod do raportu w następujący sposób...

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

Następnie na każdej komórce Ustaw kolor tła w następujący sposób:

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

Pełne szczegóły znajdują się na tym w artykule

 84
Author: Catch22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 14:29:35

Uzyskałem efekt szachowy, gdy użyłem rozwiązania Catch22, myślę, że ponieważ moja matryca ma więcej niż jedną kolumnę w konstrukcji. to wyrażenie działało dobrze dla mnie:

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
 62
Author: ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-21 14:47:17

Zmieniłem trochę rozwiązanie @ Catch22, ponieważ nie podoba mi się pomysł, aby przejść do każdego pola, jeśli zdecyduję, że chcę zmienić jeden z kolorów. Jest to szczególnie ważne w raportach, w których jest wiele pól, które wymagają zmiany zmiennej koloru.

'*************************************************************************
' -- 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

Zauważyłem, że zmieniłem funkcję z tej, która akceptuje kolory, na tę, która zawiera kolory, które mają być używane.

Następnie w każdym polu Dodaj:

=Code.AlternateColor(rownumber(nothing))

Jest to znacznie bardziej wytrzymałe niż Ręczna zmiana koloru w kolorze tła każdego z pól.

 20
Author: Michael Eakins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 17:30:29

Jedną z rzeczy, które zauważyłem jest to, że żadna z dwóch najlepszych metod nie ma pojęcia, jaki kolor pierwszy wiersz powinien być w grupie; grupa rozpocznie się od przeciwnego koloru z ostatniego wiersza poprzedniej grupy. Chciałem, żeby moje grupy zawsze zaczynały od tego samego koloru...pierwszy wiersz każdej grupy powinien być zawsze biały, a następny kolorowy.

Podstawowa koncepcja polegała na zresetowaniu przełącznika podczas uruchamiania każdej grupy, więc dodałem trochę kodu:

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

Więc mam trzy różne rodzaje tła komórek teraz:

  1. Pierwsza kolumna wiersza danych ma =Kod.AlternateColor ("AliceBlue", "Biały", prawda) (jest to to samo, co poprzednia odpowiedź.)
  2. pozostałe kolumny wiersza danych mają =Kod.Alternatekolor ("AliceBlue", "Biały", fałsz) (to również jest taka sama jak poprzednia odpowiedź.)
  3. Pierwsza kolumna wiersza grupowania ma =Kod.RestartColor ("AliceBlue") (to jest nowy.)
  4. pozostałe kolumny wiersza grupowania mają = Kod.AlternateColor ("AliceBlue", "White", False) (było to używane wcześniej, ale nie wspominając o nim dla grupowania wierszy.)
To mi pasuje. Jeśli chcesz, aby wiersz grupowania nie był kolorowy lub inny kolor, powinno być dość oczywiste, jak go zmienić.

Zapraszam do dodawania komentarzy na temat tego, co można zrobić, aby poprawić ten kod: jestem zupełnie nowy zarówno w SSRS, jak i VB, więc mocno podejrzewam, że jest dużo miejsca na poprawę, ale podstawowa idea wydaje się dźwięk (i to było dla mnie przydatne), więc chciałem go wyrzucić tutaj.

 16
Author: Beska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-03 21:09:46

Dla nagłówków/stopek grup:

=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")

Możesz również użyć tego do "zresetowania" liczby kolorów wierszy w każdej grupie. Chciałem, aby pierwszy wiersz szczegółów w każdej podgrupie zaczynał się od białego i to rozwiązanie (gdy jest używane w wierszu szczegółów) pozwoliło na to:

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

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

 10
Author: John Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 04:10:13

Rozwiązanie Michaela Harena działa dobrze dla mnie. Jednak dostałem Ostrzeżenie, mówiąc, że "przezroczysty" nie jest prawidłowym kolorem tła podczas podglądu. Znalazłem szybką poprawkę z Ustawianie koloru tła elementów raportu w Ssr . Nie używaj nic zamiast "przezroczystego"

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
 7
Author: nonetaku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-06 07:44:38

Jedynym skutecznym sposobem rozwiązania tego problemu bez użycia VB jest "przechowywanie" wartości modulo grupowania wierszy w obrębie grupowania wierszy (i poza grupowaniem kolumn) i odwoływanie się do niej jawnie w obrębie grupowania kolumn. Znalazłem to rozwiązanie na

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

Ale Ankeet nie jest najlepszym tłumaczeniem tego, co się dzieje, a jego rozwiązanie zaleca niepotrzebny krok tworzenia grup na wartość stała, więc oto mój krok po kroku proces dla macierzy z pojedynczą grupą wierszy RowGroup1:

  1. Utwórz nową kolumnę w RowGroup1. Zmień nazwę pola tekstowego na coś takiego jak RowGroupColor.
  2. Ustaw wartość pola tekstowego RowGroupColor na

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

  3. Ustaw właściwość BackgroundColor wszystkich komórek wiersza na

    "=ReportItems!RowGroupColor.Value"

  4. ustaw szerokość kolumny RowGroupColor na 0pt i ustaw CanGrow false to Ukryj to przed klientami.
Voila! To również rozwiązuje wiele problemów wymienionych w tym wątku:
  • automatyczne resetowanie podgrup: wystarczy dodać nową kolumnę rowgroup, wykonując RunningValuena jej wartości grupy.
  • nie musisz się martwić o przełączanie True / False.
  • Kolory przechowywane tylko w jednym miejscu dla łatwej modyfikacji.
  • może być używany zamiennie na grupach wierszy lub kolumn (wystarczy ustawić wysokość na 0 zamiast szerokość)

Byłoby wspaniale, gdyby SSR ujawniało właściwości poza wartością na polach tekstowych. Możesz po prostu wypchnąć tego rodzaju obliczenia do właściwości tła pola tekstowego grupy wierszy, a następnie odwołać się do niego jako ReportItems!/ Align = "left" / Kolor tła we wszystkich pozostałych komórkach.

Możemy marzyć ...
 6
Author: Kyle Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 21:27:22

Moim problemem było to, że chciałem, aby wszystkie kolumny w rzędzie miały to samo tło. Pogrupowałem zarówno według wierszy, jak i kolumn, a dzięki dwóm górnym rozwiązaniom mam Wszystkie wiersze w kolumnie 1 z kolorowym tłem, wszystkie wiersze w kolumnie 2 z białym tłem, wszystkie wiersze w kolumnie 3 z kolorowym tłem i tak dalej. To tak, jakby RowNumber i bOddRow (z rozwiązania Catch22) zwracać uwagę na moją grupę kolumn zamiast ignorować ją i tylko na przemian z nową wiosłować.

Chciałem, aby wszystkie kolumny w wierszu 1 miały białe tło, następnie wszystkie kolumny w wierszu 2 miały kolorowe tło, następnie wszystkie kolumny w wierszu 3 miały białe tło i tak dalej. Uzyskałem ten efekt używając wybranej odpowiedzi, ale zamiast przechodzić Nothing do RowNumber, przekazałem nazwę mojej grupy kolumn, np.

=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Pomyślałem, że to może być przydatne dla kogoś innego.
 5
Author: Sarah Vessels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 15:45:01

Myślę, że ta sztuczka nie jest tutaj omawiana. Więc oto jest,

W dowolnym rodzaju złożonej macierzy, gdy chcesz mieć alternatywne kolory komórek, albo w wierszu, albo w kolumnie, rozwiązaniem roboczym jest,

Jeśli chcesz mieć alternatywny kolor komórek coloumn then,

  1. W prawym dolnym rogu widoku projektu raportu, w " Column Groups", tworzy fałszywą grupę nadrzędną na 1 (używając wyrażenia), o nazwie "FakeParentGroup".
  2. Następnie, w projekcie raportu, dla komórek, które do kolorowania alternatywnie, użyj następującego wyrażenia koloru tła

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

To wszystko.

To samo dla alternatywnego wiersza kolorów, tylko musisz odpowiednio edytować rozwiązanie.

Uwaga: tutaj czasami trzeba odpowiednio ustawić obramowanie komórek, zwykle znika.

Również nie zapomnij usunąć wartości 1 w raporcie, że pojawił się w pic, kiedy stworzyłeś fałszywą grupę rodzicielską.

 3
Author: Aditya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 12:40:36

Jeśli dla całego raportu potrzebujesz przemiennego koloru, możesz użyć zestawu danych, do którego Tablix jest przypisany dla numeru wiersza w raporcie i użyć go w funkcji Numer wiersza...

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")
 2
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 18:35:18

Mógłby ktoś wyjaśnić logikę polegającą na zamianie reszty pól na false w poniższym kodzie (z powyższego posta)

Jedną z rzeczy, które zauważyłem jest to, że żadna z dwóch najlepszych metod nie ma pojęcia, jaki kolor pierwszy wiersz powinien być w grupie; grupa rozpocznie się od przeciwnego koloru z ostatniego wiersza poprzedniej grupy. Chciałem, żeby moje grupy zawsze zaczynały od tego samego koloru...pierwszy wiersz każdej grupy powinien być zawsze biały, a następny kolorowy.

Podstawowe pomysł polegał na zresetowaniu przełącznika przy uruchomieniu każdej grupy, więc dodałem trochę kodu: {]}

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

Więc mam teraz trzy różne rodzaje tła komórek:

  1. Pierwsza kolumna wiersza danych ma =Kod.AlternateColor ("AliceBlue", "Biały", prawda) (jest to to samo, co poprzednia odpowiedź.)
  2. pozostałe kolumny wiersza danych mają =Kod.Alternatekolor ("AliceBlue", "Biały", fałsz) (to również jest taka sama jak poprzednia odpowiedź.)
  3. Pierwsza kolumna wiersza grupującego ma = Kod.RestartColor ("AliceBlue") (to jest nowy.)
  4. pozostałe kolumny wiersza grupowania mają =Kod.AlternateColor ("AliceBlue", "White", False) (było to używane wcześniej, ale nie wspominając o nim dla grupowania wierszy.)
To mi pasuje. Jeśli chcesz, aby wiersz grupowania nie był kolorowy lub inny kolor, powinno być dość oczywiste, jak go zmienić.

Zapraszam do dodawania komentarzy na temat tego, co można zrobić, aby poprawić ten kod: jestem nowy w obu SSRS i VB, więc mocno podejrzewam, że jest dużo miejsca na poprawę, ale podstawowa idea wydaje się brzmieć (i była dla mnie przydatna), więc chciałem ją wyrzucić tutaj.

 1
Author: misha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 04:12:37

@Aditya odpowiedź jest świetna, ale są przypadki, w których formatowanie zostanie odrzucone, jeśli pierwsza komórka wiersza (dla formatowania tła wiersza) ma brakującą wartość (w złożonych tabelach z grupami kolumn/wierszy i brakującymi wartościami).

Rozwiązanie@Aditya sprytnie wykorzystuje countDistinct wynik funkcji runningValue do identyfikacji liczb wierszy w grupie tablix (row). Jeśli masz wiersze tablix z brakującą wartością w pierwszej komórce, runningValue nie zwiększy wyniku countDistinct i zwróci numer poprzedniego wiersza (a zatem wpłynie na formatowanie tej komórki). Aby to wyjaśnić, musisz dodać dodatkowy termin, aby zrównoważyć wartość countDistinct. Moje podejście polegało na sprawdzeniu pierwszej uruchomionej wartości w samej grupie wiersza (patrz linia 3 fragmentu poniżej):

=iif(
    (RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
    + iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
    ) mod 2, "White", "LightGrey")
Mam nadzieję, że to pomoże.
 1
Author: rpyzh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 19:59:06

Wypróbowałem wszystkie te rozwiązania na zgrupowanej Tablix ze spacjami wierszy i żadne nie zadziałało w całym raporcie. Rezultatem były powielone kolorowe wiersze, a inne rozwiązania zaowocowały przemiennymi kolumnami!

Oto funkcja, którą napisałem, która działała dla mnie przy użyciu liczby kolumn:

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

Dla 7-Kolumnowej Tablix używam tego wyrażenia dla wiersza (komórek) Backcolour:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)
 1
Author: Jeremy Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 04:07:03

Tylko dlatego, że żadna z powyższych odpowiedzi nie działa w moim Matrixie, zamieszczam to tutaj:

Http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html

 0
Author: CodeRedick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-28 00:41:07

Moje dane matrycowe miały w sobie brakujące wartości, więc nie byłem w stanie uruchomić rozwiązania Ahmada, ale To rozwiązanie działało dla mnie

Podstawową ideą jest stworzenie grupy potomnej i pola na swojej najskrytszej grupie zawierającej kolor. Następnie Ustaw kolor dla każdej komórki w wierszu na podstawie wartości tego pola.

 0
Author: FistOfFury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-02 19:57:53

Drobna modyfikacja innych odpowiedzi stąd, które zadziałały dla mnie. Moja grupa ma dwie wartości do grupy NA, więc byłem w stanie po prostu umieścić je obie w pierwszym arg z+, aby uzyskać to zmienić poprawnie

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
 0
Author: Soy Sauce Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 22:00:20

Podczas używania obu grup wierszy i kolumn miałem problem, w którym kolory zmieniały się między kolumnami, mimo że był to ten sam wiersz. Rozwiązałem to, używając zmiennej globalnej, która zmienia się tylko wtedy, gdy wiersz się zmienia:

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

Teraz, w pierwszej kolumnie wiersza, który chcesz zastąpić, Ustaw wyrażenie kolorów na:

=Kod.AlternateColor ()

-

W pozostałych kolumnach ustaw je wszystkie na:

=Kod.BGColor=[2]]}

To powinno sprawić, że kolory będą się zmieniać dopiero po narysowaniu pierwszej kolumny.

Może to również (nieweryfikowalnie) poprawić wydajność, ponieważ nie trzeba wykonywać obliczeń matematycznych dla każdej kolumny.

 0
Author: nrg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 23:06:50