Jak zacieniować naprzemienne wiersze w raporcie usług SQL Server Reporting Services?
Edycja: poniżej znajduje się kilka dobrych odpowiedzi - od szybkich i prostych po złożone i wyczerpujące . Niestety, mogę wybrać tylko jeden ...
Jak zacieniować naprzemienne wiersze w raporcie usług SQL Server Reporting Services?
Edycja: poniżej znajduje się kilka dobrych odpowiedzi - od szybkich i prostych po złożone i wyczerpujące . Niestety, mogę wybrać tylko jeden ...
Odpowiedzi:
Przejdź do właściwości BackgroundColor wiersza tabeli i wybierz opcję „Wyrażenie ...”
Użyj tego wyrażenia:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Ta sztuczka może być zastosowana do wielu obszarów raportu.
A w .NET 3.5+ możesz użyć:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Nie szukam przedstawiciela - po prostu zbadałem to pytanie i pomyślałem, że się nim podzielę.
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
Wygląda na to, że będzie to prawidłowe wyrażenie =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Dzięki za cynk.
Korzystanie z IIF (RowNumber ...) może prowadzić do 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 w każdej komórce ustaw BackgroundColor w następujący sposób:
=Code.AlternateColor("AliceBlue", "White", True)
Pełne szczegóły znajdują się w tym artykule Wrox
Efekt szachowy uzyskałem, gdy użyłem rozwiązania Catch22, myślę, że moja matryca ma więcej niż jedną kolumnę w projekcie. to wyrażenie działało dobrze dla mnie:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Zmieniłem rozwiązanie @ Catch22 Trochę, ponieważ nie podoba mi się pomysł, że muszę wchodzić w każde pole, jeśli zdecyduję, że chcę zmienić jeden z kolorów. Jest to szczególnie ważne w raportach, w których istnieje wiele pól, które wymagałyby 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 taką, która zawiera kolory, które mają być użyte.
Następnie w każdym polu dodaj:
=Code.AlternateColor(rownumber(nothing))
Jest to znacznie bardziej niezawodne niż ręczna zmiana koloru tła każdego pola.
Zauważyłem jedną rzecz, że żadna z dwóch najlepszych metod nie ma pojęcia, jaki kolor powinien mieć pierwszy wiersz w grupie; grupa zacznie po prostu kolorem przeciwnym niż ostatni wiersz poprzedniej grupy. Chciałem, aby moje grupy zawsze zaczynały się w tym samym kolorze ... pierwszy rząd każdej grupy powinien być zawsze biały, a następny wiersz kolorowy.
Podstawową koncepcją było zresetowanie przełącznika po 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
Mam teraz trzy różne rodzaje tła komórek:
To działa dla mnie. Jeśli chcesz, aby wiersz grupowania nie był kolorowy lub miał inny kolor, powinno być dość oczywiste, jak to zmienić.
Zapraszam do dodawania komentarzy na temat tego, co można zrobić, aby ulepszyć ten kod: Jestem nowy zarówno w SSRS, jak i VB, więc mocno podejrzewam, że jest dużo miejsca na ulepszenia, ale podstawowa idea wydaje się rozsądna (i była przydatna dla mnie), więc chciałem to wyrzucić tutaj.
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 koloru białego, a to rozwiązanie (użyte 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
Rozwiązanie Michaela Harena działa dobrze dla mnie. Otrzymałem jednak ostrzeżenie, że „Transparent” nie jest prawidłowym kolorem tła podczas podglądu. Znalazłem szybką poprawkę z ustawiania BackgroundColor elementów raportu w usługach SSRS . Nie używaj Niczego zamiast „Przezroczysty”
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
Jedynym skutecznym sposobem rozwiązania tego problemu bez używania VB jest „przechowywanie” wartości modulo grupowania wierszy w ramach grupowania wierszy (i poza grupowaniem kolumn) i jawne odwoływanie się do niej w ramach grupowania kolumn. Znalazłem to rozwiązanie pod adresem
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Ale Ankeet nie najlepiej radzi sobie z wyjaśnianiem, co się dzieje, a jego rozwiązanie zaleca niepotrzebny krok tworzenia grupowania według stałej wartości, więc oto mój proces krok po kroku dla macierzy z jedną grupą wierszy RowGroup1:
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 wierszy na
"=ReportItems!RowGroupColor.Value"
Voila! To również rozwiązuje wiele problemów wymienionych w tym wątku:
Byłoby wspaniale, gdyby usługa SSRS ujawniła właściwości poza wartością w polach tekstowych. Możesz po prostu umieścić tego rodzaju obliczenia we właściwości BackgroundColor pól tekstowych grupy wierszy, a następnie odwołać się do niej jako ReportItems! RowGroup.BackgroundColor we wszystkich pozostałych komórkach.
No cóż, możemy marzyć ...
Mój problem polegał na tym, że chciałem, aby wszystkie kolumny w rzędzie miały to samo tło. Pogrupowałem zarówno według wiersza, jak i według kolumny, a przy dwóch górnych rozwiązaniach tutaj otrzymałem wszystkie wiersze w kolumnie 1 z kolorowym tłem, wszystkie wiersze w kolumnie 2 na białym tle, wszystkie wiersze w kolumnie 3 na kolorowym tle , i tak dalej. To tak, jakby RowNumber
i bOddRow
(rozwiązania Catch22) zwróciło uwagę na moją grupę kolumn zamiast ignorować to i tylko naprzemiennie z nowym wierszem.
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, a 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 przejść Nothing
do RowNumber
, podał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.
W każdym typie złożonej macierzy, gdy chcesz zmienić kolory komórek, wierszami lub kolumnami, rozwiązaniem roboczym jest:
Jeśli chcesz mieć inny kolor komórek,
= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
To wszystko.
To samo dotyczy alternatywnego wiersza koloru, ale musisz odpowiednio edytować rozwiązanie.
UWAGA: Tutaj czasami trzeba odpowiednio ustawić obramowanie komórek, zwykle znika.
Nie zapomnij również usunąć wartości 1 w raporcie, który pojawił się na zdjęciu podczas tworzenia fałszywej grupy nadrzędnej.
Odpowiedź @ Aditya jest świetna, ale są przypadki, w których formatowanie zostanie wyrzucone, jeśli pierwsza komórka wiersza (w przypadku formatowania tła wiersza) ma brakującą wartość (w złożonych elementach tablix z grupami kolumn / wierszy i brakującymi wartościami).
Rozwiązanie @ Aditya sprytnie wykorzystuje countDistinct
wynik runningValue
funkcji do identyfikacji numerów wierszy w grupie elementu tablix (row). Jeśli masz wiersze elementu tablix z brakującą wartością w pierwszej komórce, runningValue
nie zwiększy countDistinct
wyniku i zwróci numer poprzedniego wiersza (a zatem wpłynie na formatowanie tej komórki). Aby to uwzględnić, będziesz musiał dodać dodatkowy termin, aby skompensować countDistinct
wartość. Moim zdaniem było sprawdzenie pierwszej wartości bieżącej w samej grupie wierszy (zobacz wiersz 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.
Czy ktoś mógłby wyjaśnić logikę zmiany pozostałych pól na fałsz w poniższym kodzie (z powyższego postu)
Zauważyłem jedną rzecz, że żadna z dwóch najlepszych metod nie ma pojęcia, jaki kolor powinien mieć pierwszy wiersz w grupie; grupa zacznie po prostu kolorem przeciwnym niż ostatni wiersz poprzedniej grupy. Chciałem, aby moje grupy zawsze zaczynały się w tym samym kolorze ... pierwszy rząd każdej grupy powinien być zawsze biały, a następny wiersz kolorowy.
Podstawową koncepcją było zresetowanie przełącznika po 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
Mam teraz trzy różne rodzaje tła komórek:
To działa dla mnie. Jeśli chcesz, aby wiersz grupowania nie był kolorowy lub miał inny kolor, powinno być dość oczywiste, jak to zmienić.
Zapraszam do dodawania komentarzy na temat tego, co można zrobić, aby ulepszyć ten kod: Jestem nowy zarówno w SSRS, jak i VB, więc mocno podejrzewam, że jest dużo miejsca na ulepszenia, ale podstawowa idea wydaje się rozsądna (i była przydatna dla mnie), więc chciałem to wyrzucić tutaj.
Wypróbowałem wszystkie te rozwiązania na zgrupowanym tablixie z odstępami między wierszami i żadne nie działało w całym raporcie. Rezultatem były zduplikowane kolorowe wiersze, a inne rozwiązania spowodowały naprzemienne kolumny!
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 tablixa z 7 kolumnami używam tego wyrażenia dla Row (of Cells) Backcolour:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Ponieważ żadna z powyższych odpowiedzi nie wydawała się działać w mojej macierzy, zamieszczam to tutaj:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
W moich danych macierzowych brakowało wartości, więc nie udało mi się uzyskać rozwiązania Ahmada, ale to rozwiązanie działało dla mnie
Podstawowym pomysłem jest utworzenie grupy podrzędnej i pola na najbardziej wewnętrznej grupie zawierającej kolor. Następnie ustaw kolor dla każdej komórki w wierszu na podstawie wartości tego pola.
Nieznaczna modyfikacja innych odpowiedzi z tego miejsca, które działały dla mnie. Moja grupa ma dwie wartości do zgrupowania, więc mogłem po prostu umieścić je obie w pierwszym argumencie z +, aby uzyskać poprawną zmianę
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Podczas korzystania z obu grup wierszy i kolumn miałem problem z naprzemiennymi kolorami 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 zmienia się wiersz:
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 zmienić, ustaw wyrażenie koloru na:
= Code.AlternateColor ()
-
W pozostałych kolumnach ustaw je wszystkie na:
= Code.BGColor
Powinno to spowodować zmianę kolorów dopiero po narysowaniu pierwszej kolumny.
Może to (w sposób nieweryfikowalny) również poprawić wydajność, ponieważ nie ma potrzeby wykonywania obliczeń matematycznych dla każdej kolumny.