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...
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ę.
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
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")
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.
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:
- Pierwsza kolumna wiersza danych ma =Kod.AlternateColor ("AliceBlue", "Biały", prawda) (jest to to samo, co poprzednia odpowiedź.)
- pozostałe kolumny wiersza danych mają =Kod.Alternatekolor ("AliceBlue", "Biały", fałsz) (to również jest taka sama jak poprzednia odpowiedź.)
- Pierwsza kolumna wiersza grupowania ma =Kod.RestartColor ("AliceBlue") (to jest nowy.)
- 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.)
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.
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
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)
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:
- Utwórz nową kolumnę w RowGroup1. Zmień nazwę pola tekstowego na coś takiego jak RowGroupColor.
-
Ustaw wartość pola tekstowego RowGroupColor na
=iif(RunningValue(Fields![RowGroupField].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
-
Ustaw właściwość BackgroundColor wszystkich komórek wiersza na
"=ReportItems!RowGroupColor.Value"
- ustaw szerokość kolumny RowGroupColor na 0pt i ustaw CanGrow false to Ukryj to przed klientami.
- 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ć ...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.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,
- 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".
- Następnie, w projekcie raportu, dla komórek, które do kolorowania alternatywnie, użyj następującego wyrażenia koloru tła
To wszystko.=IIF( RunningValue (Fields![ColumnGroupField].Value, countDistinct," FakeParentGroup") MOD 2," White","LightGrey")
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ą.
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")
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:
- Pierwsza kolumna wiersza danych ma =Kod.AlternateColor ("AliceBlue", "Biały", prawda) (jest to to samo, co poprzednia odpowiedź.)
- pozostałe kolumny wiersza danych mają =Kod.Alternatekolor ("AliceBlue", "Biały", fałsz) (to również jest taka sama jak poprzednia odpowiedź.)
- Pierwsza kolumna wiersza grupującego ma = Kod.RestartColor ("AliceBlue") (to jest nowy.)
- 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.)
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.
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.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)
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
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.
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")
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.
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