Dodaj zmienny kolor wiersza do raportu usług SQL Server Reporting Services


141

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 ...


2
= IIf (RowNumber (Nothing) Mod 2 = 0, "No Color", "# DDEBF7")
Stefan Steiger

Jeśli zaznaczysz wiele komórek, nie możesz edytować właściwości pola tekstowego, ale możesz uzyskać dostęp do koloru wypełnienia w panelu właściwości i ustawić tam wyrażenie!
kitsu.eb

Odpowiedzi:


213

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ę.


10
W pewnych okolicznościach to się nie powiedzie, szczególnie w tabelach i obiektach macierzy z wieloma sumami częściowymi. Odpowiedź Catch22 nie ma takich samych ograniczeń. Ponadto metoda Catch22 może być używana do wymuszenia na kolumnach w macierzy naprzemiennych kolorów kolumn, co jest przydatne, gdy pojawia się niebieski księżyc.
Zarejestrowany użytkownik

16
Zawsze staram się głosować za kimś, kto odpowie na ich własne pytanie. Pytający zbyt często znajduje odpowiedź samodzielnie i nigdy nie wraca, aby ją opublikować, pozostawiając resztę z nas, którzy mogliby mieć to samo pytanie, w ciemności. Guz dla pana, sir.
Matt DiTrolio

4
Kiedy używam powyższego kodu, otrzymuję komunikat ostrzegawczy, taki jak: [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.
Russell B

2
Daje to problem w przypadku grupowania i podglądu szczegółów

3
niektóre przeglądarki nie obsługują „Przezroczystość” lub „Nic”. Najlepszym rozwiązaniem byłoby użycie „białych”
Nate S.

89

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


Powyższy kod jest dodawany do sekcji Kod raportu lub do strony związanej z kodem w projekcie VB.NET, skompilowany i wdrożony jako biblioteka DLL, która jest referencją jako zestaw. Zalecam podjęcie dodatkowych wysiłków, aby wdrożyć to jako bibliotekę DLL, ponieważ zwykle odwołujesz się do tego w wielu raportach.
Zarejestrowany użytkownik

To jest mój ulubiony sposób rozwiązania problemu grupowania, po wypróbowaniu kilku innych hacków. Nie ulega awarii, gdy do kolumny zostanie zastosowane sortowanie interaktywne. +1 i wielkie dzięki.
Rex Miller

Kolory są przesunięte, gdy masz nieparzystą liczbę wierszy.
K Richard

20
Nie zapomnij zmienić „True” na „False” dla wszystkich kolumn w wierszu po pierwszej, w przeciwnym razie zobaczysz efekt szachownicy! Dzięki za rozwiązanie - działa świetnie!
Peter Mularien

Peter Mularien: Mam ten problem, czy możesz wyjaśnić, jak go naprawić?
Bill Software Engineer

64

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")

13
Ta odpowiedź zasługuje na znacznie więcej uwagi - jest to przejrzyste rozwiązanie, które działa doskonale w macierzy z grupami wierszy i grupami kolumn i nie wymaga żadnego niestandardowego kodu do działania. Piękny!
Stefan Mohr

9
W rzeczywistości działa to dobrze nawet w przypadku wielu kolumn - ale nie w przypadku „brakujących” danych w grupie. Jeśli więc masz dane, które zawierają dane z 12 miesięcy w 2007 r., Ale nie zawierają danych ze stycznia 2006 r., I pogrupuj według miesięcy w wierszach i roku w kolumnach, kolorystyka 2006 będzie przesunięta o jeden, ponieważ wartość RunningValue nie jest synchronizowana, ponieważ nawet jeśli istnieje nadal ramka w macierzy dla „stycznia 2006” nie ma danych w zbiorze danych, a RunningValue pozostaje taka sama, bez zmiany koloru itp.
Kyle Hale

2
@ahmad, to jest tak blisko. Mam problem, w którym puste pudełka mają przeciwny kolor. jak upewnić się, że puste pudełka zostaną odpowiednio pokolorowane?
FistOfFury

@KyleHale czy masz poprawkę na brakującą kolorystykę pudełka?
FistOfFury

2
@FistOfFury Jedynym rozwiązaniem, które znam, jest upewnienie się, że ustawiona jest wartość (zwykle 0) dla brakujących danych.
Kyle Hale

20

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.


1
Fajny dodatek do tego wątku! Nie lubię ustawiać „True” lub „False” w każdej kolumnie. Podoba mi się również opcja „mod 3”, dzięki czemu mogę zacienić tylko co 3 rzędy.
Baodad

Podoba mi się też to rozwiązanie. Jednak to nie działa, gdy używam grupowania wierszy. Rozwiązanie @ ahmad powyżej zadziałało jednak dla mnie.
Baodad

To świetne rozwiązanie dla tablix, jeśli nie chcesz dodawać dodatkowych pól do swojego DataSet!
clamchoda,

16

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:

  1. Pierwsza kolumna wiersza danych zawiera = Code.AlternateColor ("AliceBlue", "White", True) (To jest to samo, co poprzednia odpowiedź).
  2. Pozostałe kolumny w wierszu danych mają = Code.AlternateColor ("AliceBlue", "White", False) (to również jest to samo, co poprzednia odpowiedź).
  3. Pierwsza kolumna wiersza grupowania ma = Code.RestartColor ("AliceBlue") (To jest nowe.)
  4. Pozostałe kolumny wiersza grupowania mają = Code.AlternateColor ("AliceBlue", "White", False) (to było używane wcześniej, ale nie ma o tym wzmianki przy grupowaniu wierszy).

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.


Możesz także zresetować numerację wierszy dla każdej grupy zgodnie z opisem w tej odpowiedzi .
StackOverthrow

10

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



6

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:

  1. Utwórz nową kolumnę w RowGroup1. Zmień nazwę pola tekstowego na podobną do 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 wierszy na

    "=ReportItems!RowGroupColor.Value"

  4. Ustaw szerokość kolumny RowGroupColor na 0pt i ustaw CanGrow na false, aby ukryć ją przed klientami.

Voila! To również rozwiązuje wiele problemów wymienionych w tym wątku:

  • Automatyczne resetowanie dla podgrup: Po prostu dodaj nową kolumnę dla tej grupy wierszy, wykonując RunningValue na wartościach jej grup.
  • Nie musisz się martwić o przełączniki True / False.
  • Kolory trzymane tylko w jednym miejscu dla łatwej modyfikacji.
  • Może być używany zamiennie w grupach wierszy lub kolumn (wystarczy ustawić wysokość na 0 zamiast szerokości)

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ć ...


5

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 RowNumberi 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ść Nothingdo 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.


4

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

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,

  1. W prawym dolnym rogu widoku projektu raportu, w sekcji „Grupy kolumn”, utwórz 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 mają być pokolorowane naprzemiennie, 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 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.


1
Ta odpowiedź jest zdecydowanie świetnym znaleziskiem dla tych, którzy muszą tworzyć prążki wierszy w złożonych elementach tablix! Jeśli istnieje grupa nadrzędna, użyj jej. W przeciwnym razie utwórz FakeParentGroup. Brakujące wartości w elementach tablix, które mają zarówno grupy kolumn, jak i wierszy, zwykle powodują zmianę formatowania. Zobacz moją odpowiedź, która opiera się na @ Aditya, aby uwzględnić brakujące wartości w pierwszej komórce.
rpyzh

2

Jeśli dla całego raportu potrzebujesz naprzemiennego koloru, możesz użyć zestawu danych, do którego jest przypisany Twój Tablix, aby uzyskać numer identyfikacyjny całego raportu w raporcie i użyć tego w funkcji RowNumber ...

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")

2

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 countDistinctwynik runningValuefunkcji 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, runningValuenie zwiększy countDistinctwyniku 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ć countDistinctwartość. 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.


Dzięki @rpyzh, to było rozwiązanie, które działało w mojej grupie wielorzędowej ze wspólnym raportem nadrzędnej grupy wierszy!
Niallty

1

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:

  1. Pierwsza kolumna wiersza danych zawiera = Code.AlternateColor ("AliceBlue", "White", True) (To jest to samo, co poprzednia odpowiedź).
  2. Pozostałe kolumny w wierszu danych mają = Code.AlternateColor ("AliceBlue", "White", False) (to również jest to samo, co poprzednia odpowiedź).
  3. Pierwsza kolumna wiersza grupowania ma = Code.RestartColor ("AliceBlue") (To jest nowe.)
  4. Pozostałe kolumny wiersza grupowania mają = Code.AlternateColor ("AliceBlue", "White", False) (to było używane wcześniej, ale nie ma o tym wzmianki przy grupowaniu wierszy).

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.


1

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)


0

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.


Sprawdź @ Aditya i moją odpowiedź dotyczącą obsługi brakujących wartości w macierzy. Przydatne, jeśli masz już (lub chcesz stworzyć fałszywą) grupę rodziców. W ten sposób nie będziesz musiał tworzyć osobnego pola.
rpyzh

0

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")

0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.