Добавьте чередующийся цвет строки в отчет служб отчетов SQL Server - PullRequest
141 голосов
/ 04 сентября 2008

Как закрасить чередующиеся строки в отчете служб отчетов SQL Server?


Редактировать: Ниже приведены несколько хороших ответов - от быстрый и простой до сложный и всеобъемлющий . Увы, я могу выбрать только одну ...

Ответы [ 18 ]

2 голосов
/ 20 мая 2014

@ Ответ Адитьи отличный, но есть случаи, когда форматирование будет отброшено, если в самой первой ячейке строки (для фонового форматирования строки) отсутствует значение (в сложных таблицах с группами столбцов / строк и отсутствующими значениями) .

@ Решение Aditya умело использует countDistinct результат функции runningValue для определения номеров строк в группе табликсов (строк). Если в первой ячейке есть строки табликса с пропущенным значением, runningValue не будет увеличивать результат countDistinct и вернет номер предыдущей строки (и, следовательно, повлияет на форматирование этой ячейки). Чтобы учесть это, вам нужно будет добавить дополнительный термин, чтобы компенсировать значение countDistinct. Мне нужно было проверить первое значение в самой группе строк (см. Строку 3 фрагмента ниже):

=iif(
    (RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
    + iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
    ) mod 2, "White", "LightGrey")

Надеюсь, это поможет.

2 голосов
/ 06 августа 2010

Если для всего отчета вам нужен чередующийся цвет, вы можете использовать набор данных, к которому привязан ваш Tablix, для общего идентификатора отчета в отчете и использовать его в функции RowNumber ...

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")
1 голос
/ 01 марта 2012

Может ли кто-нибудь объяснить логику включения остальных полей в false в приведенном ниже коде (из сообщения выше)

Одна вещь, которую я заметил, состоит в том, что ни один из двух верхних методов не имеет никакого представления о том, какого цвета должен быть первый ряд в группе; группа будет начинаться с цвета, противоположного последней строке предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета ... первый ряд каждой группы всегда должен быть белым, а следующий - цветным.

Основная концепция состояла в том, чтобы сбросить переключатель при запуске каждой группы, поэтому я добавил немного кода:

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

Итак, теперь у меня есть три разных типа фона клетки:

  1. Первый столбец строки данных имеет значение = Code.AlternateColor («AliceBlue», «White», True) (совпадает с предыдущим ответом.)
  2. Оставшиеся столбцы строки данных имеют = Code.AlternateColor («AliceBlue», «White», False) (также, как и предыдущий ответ).
  3. Первый столбец строки группировки имеет = Code.RestartColor ("AliceBlue") (Это новое.)
  4. Остальные столбцы строки группировки имеют = Code.AlternateColor («AliceBlue», «White», False) (раньше использовался, но не упоминается об этом для группировки строк.)

Это работает для меня. Если вы хотите, чтобы строка группировки была неокрашенной или другого цвета, из этого должно быть совершенно очевидно, как ее изменить.

Пожалуйста, не стесняйтесь добавлять комментарии о том, что можно сделать для улучшения этого кода: я новичок как в SSRS, так и в VB, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется обоснованной это было полезно для меня), поэтому я хотел выбросить это здесь.

1 голос
/ 13 января 2015

Я попробовал все эти решения на сгруппированном таблике с пробелами в строках, и ни одно из них не работало по всему отчету. Результатом были дублированные цветные строки, а другие решения - чередующиеся столбцы!

Вот функция, которую я написал, которая работала для меня с использованием счетчика столбцов:

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

Для 7-колонного табликса я использую это выражение для строки (ячеек) Backcolour:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)
0 голосов
/ 12 ноября 2016

При использовании обеих групп строк и столбцов у меня возникла проблема, когда цвета чередовались между столбцами, даже если это была одна и та же строка. Я решил эту проблему, используя глобальную переменную, которая меняется только при изменении строки:

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

Теперь, в столбце первый строки, которую вы хотите чередовать, установите цветовое выражение на:

= Code.AlternateColor ()

-

В оставшихся столбцах установите для них все значения:

= Code.BGColor

Это должно привести к чередованию цветов только после прорисовки первого столбца.

Это также может (не поддающееся проверке) повысить производительность, поскольку не требуется выполнять математические вычисления для каждого столбца.

0 голосов
/ 12 июля 2016

Небольшая модификация других ответов отсюда, которые работали для меня. У моей группы есть два значения для группировки, поэтому я смог просто поместить их оба в первый аргумент с помощью +, чтобы заставить его чередоваться правильно

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
0 голосов
/ 28 ноября 2013

Просто потому, что ни один из приведенных выше ответов не работает в моей матрице, я публикую это здесь:

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

0 голосов
/ 02 декабря 2013

В моих данных матрицы отсутствовали значения, поэтому я не смог заставить работать решение Ахмада, но это решение сработало для меня

Основная идея - создать дочернюю группу и поле в самой внутренней группе, содержащей цвет. Затем установите цвет для каждой ячейки в строке на основе значения этого поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...