Добавьте чередующийся цвет строки в отчет служб отчетов SQL Server

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


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

4.09.2008 18:18:32
= IIf (RowNumber (Nothing) Mod 2 = 0, «Нет цвета», «# DDEBF7»)
Stefan Steiger 27.05.2016 11:19:46
Если вы выберете несколько ячеек, вы не сможете редактировать свойства текстового поля, но вы сможете получить доступ к цвету заливки на панели свойств и установить там выражение!
kitsu.eb 3.02.2017 20:55:11
18 ОТВЕТОВ
РЕШЕНИЕ

Перейдите к свойству BackgroundColor строки таблицы и выберите «Выражение ...»

Используйте это выражение:

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

Этот прием можно применить ко многим областям отчета.

А в .NET 3.5+ вы можете использовать:

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

Не ищу репутацию - я просто исследовал этот вопрос сам и думал, что поделюсь.

212
3.12.2009 04:00:01
Это не удается при определенных обстоятельствах, особенно в таблицах и матричных объектах с большим количеством промежуточных итогов. Ответ Catch22 не имеет таких же ограничений. Кроме того, метод Catch22 можно использовать, чтобы заставить столбцы в матрице иметь чередующиеся цвета столбцов, что полезно один раз в голубой луне.
Registered User 1.01.2009 17:53:33
Я всегда стараюсь поддержать человека, который отвечает на его собственный вопрос. Слишком часто спрашивающий находит ответ самостоятельно, а затем никогда не возвращается, чтобы опубликовать его, оставляя остальных из нас, кто может иметь тот же вопрос в темноте. Удар для вас, сэр.
Matt DiTrolio 31.08.2011 14:43:15
Когда я использую приведенный выше код, я получаю предупреждающее сообщение, как будто [rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor. выглядит правильное выражение =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing). Спасибо за совет, хотя.
Russell B 27.08.2013 19:10:58
Это дает проблему в случае группировки и просмотра подробностей
user2721874 6.09.2013 05:03:19
некоторые браузеры не могут обрабатывать «прозрачный» или «ничего». Лучше всего было бы использовать «Белый»
Nate S. 16.09.2014 18:05:20

Использование IIF (RowNumber ...) может привести к некоторым проблемам при группировании строк, а другой альтернативой является использование простой функции VBScript для определения цвета.

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

По сути, вы добавляете код в отчет следующим образом ...

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

Затем в каждой ячейке установите BackgroundColor следующим образом:

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

Полная информация по этой статье Wrox

89
17.09.2008 14:29:35
Приведенный выше код либо добавляется в раздел «Код» отчета, либо на страницу с выделенным кодом в проекте VB.NET, компилируется и развертывается как библиотека DLL, которая является ссылкой как сборка. Я рекомендую приложить дополнительные усилия для развертывания этого как DLL, так как вы обычно ссылаетесь на это в многочисленных отчетах.
Registered User 1.01.2009 17:58:56
Это мой предпочтительный способ решения проблемы с группировкой после нескольких попыток взлома. Он не ломается, когда к столбцу применяется интерактивная сортировка. +1 и большое спасибо.
Rex Miller 27.01.2009 03:07:13
Цвета смещены, если у вас есть нечетное количество строк.
K Richard 14.06.2010 17:41:38
Не забудьте изменить «True» на «False» для всех столбцов в строке после первого, иначе вы увидите эффект шахматной доски! Спасибо за решение - оно отлично работает!
Peter Mularien 13.03.2011 05:13:10
Питер Мулариен: У меня возникла эта проблема, вы можете объяснить, как ее исправить?
Bill Software Engineer 22.12.2012 17:19:59

для групповых колонтитулов:

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

Вы также можете использовать это для «сброса» количества цветов строк в каждой группе. Я хотел, чтобы первая строка подробностей в каждой подгруппе начиналась с белого, и это решение (при использовании в строке подробностей) позволило этому произойти:

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

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

10
13.01.2015 04:10:13

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

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

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, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется здравой (и это было полезно для меня) поэтому я хотел выбросить это здесь.

16
3.08.2009 21:09:46
Вы также можете сбросить нумерацию строк для каждой группы, как описано в этом ответе .
StackOverthrow 21.08.2018 21:44:29

Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели одинаковый фон. Я сгруппировал по строкам и по столбцам, и с двумя верхними решениями здесь я получил все строки в столбце 1 с цветным фоном, все строки в столбце 2 с белым фоном, все строки в столбце 3 с цветным фоном , и так далее. Это как если бы RowNumberи bOddRow(решения Catch22) обращать внимание на мою группу столбцов вместо того, чтобы игнорировать это и только чередоваться с новой строкой.

Я хотел, чтобы все столбцы в строке 1 имели белый фон, затем все столбцы в строке 2 имели цветной фон, затем все столбцы в строке 3 имели белый фон и так далее. Я получил этот эффект, используя выбранный ответ, но вместо того, Nothingчтобы перейти к RowNumber, я передал имя моей группы столбцов, например

=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")

Думал, что это может быть полезно для кого-то еще.

5
25.09.2009 15:45:01

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

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")
2
5.06.2011 18:35:18

Решение Майкла Харена прекрасно работает для меня. Однако я получил предупреждение о том, что «Прозрачный» не является допустимым BackgroundColor при предварительном просмотре. Нашел быстрое решение в разделе Настройка BackgroundColor элементов отчета в SSRS . Ничего не используйте вместо «Прозрачный»

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
7
6.04.2011 07:44:38
Белый был бы лучше, чем Ничто.
Nate S. 16.09.2014 18:04:29

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

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
64
21.07.2011 14:47:17
Этот ответ заслуживает гораздо большего внимания - это чистое решение, которое отлично работает в матрице с группами строк и столбцов и не требует никакого специального кода для работы. Красивая!
Stefan Mohr 9.03.2012 23:19:48
На самом деле, это прекрасно работает даже для нескольких столбцов, но не в том случае, если в группе «отсутствуют» данные. Таким образом, если у вас есть данные, которые имеют данные за 12 месяцев в 2007 году, но не имеют данных за январь 2006 года, и сгруппированы по месяцам по строкам и по годам по столбцам, раскраска 2006 года будет отключена на единицу, потому что RunningValue отключается от синхронизации, потому что даже при наличии все еще поле в матрице для «января 2006», в наборе данных нет данных, и значение RunningValue остается тем же, без изменения цвета и т. д.
Kyle Hale 3.12.2012 20:18:47
@ Ахмад, это так близко. У меня проблема, когда пустые коробки используют противоположный цвет. Как я могу убедиться, что пустые коробки окрашены правильно?
FistOfFury 2.12.2013 18:32:51
@KyleHale у вас есть исправление для отсутствующей окраски коробки?
FistOfFury 2.12.2013 18:35:50
@FistOfFury Единственное известное мне решение - убедиться, что для пропущенных данных установлено значение (обычно 0).
Kyle Hale 2.12.2013 19:27:30

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

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

Заметил, что я изменил функцию с той, которая принимает цвета, на ту, которая содержит используемые цвета.

Затем в каждом поле добавьте:

=Code.AlternateColor(rownumber(nothing))

Это гораздо надежнее, чем вручную менять цвет фона каждого поля.

20
27.03.2015 17:30:29
Хорошее дополнение к этой теме! Мне нравится не устанавливать «True» или «False» в каждом столбце. Мне также нравится опция «мод 3», поэтому я могу затенять только каждый третий ряд.
Baodad 25.11.2013 21:09:29
Мне также нравится это решение. Однако, это не работает для меня, когда я использую группирование строк. Решение @ Ахмада выше работало для меня все же.
Baodad 22.03.2016 21:17:52
Это отличное решение для табликса, если вы не хотите добавлять дополнительные поля в свой DataSet!
clamchoda 8.09.2016 15:57:20

Может ли кто-нибудь объяснить логику включения остальных полей в 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
1.03.2012 04:12:37

Единственный эффективный способ решить эту проблему без использования VB - это «сохранить» значение группирования по модулю внутри группировки строк (и вне группировки столбцов) и явно ссылаться на него внутри группировки столбцов. Я нашел это решение в

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

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

  1. Создайте новый столбец в RowGroup1. Переименуйте текстовое поле для этого к чему-то как RowGroupColor.
  2. Установите значение текстового поля RowGroupColor в

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

  3. Установите свойство BackgroundColor всех ваших ячеек строки в

    "=ReportItems!RowGroupColor.Value"

  4. Установите для ширины столбца RowGroupColor значение 0pt, а для CanGrow - значение false, чтобы скрыть его от клиентов.

Вуаля! Это также решает много проблем, упомянутых в этой теме:

  • Автоматический сброс для подгрупп: Просто добавьте новый столбец для этого rowgroup, выполняя RunningValue на своих групповых ценностях.
  • Не нужно беспокоиться о переключателях True / False.
  • Цвета хранятся только в одном месте для легкой модификации.
  • Может использоваться взаимозаменяемо в группах строк или столбцов (просто установите высоту 0 вместо ширины)

Было бы замечательно, если бы SSRS выставлял свойства помимо Value on Textboxes. Вы можете просто вставить этот вид вычисления в свойство BackgroundColor текстовых полей группы строк, а затем ссылаться на него как ReportItems! RowGroup.BackgroundColor во всех других ячейках.

Ах, хорошо, мы можем мечтать ...

6
3.12.2012 21:27:22

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

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

0
28.11.2013 00:41:07

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

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

0
2.12.2013 19:57:53
Посмотрите @ Adity и мой ответ, чтобы обработать пропущенные значения в матрице. Полезно, если у вас уже есть (или вы хотите создать поддельную) родительская группа. Вам не нужно будет создавать отдельное поле таким образом.
rpyzh 21.05.2014 15:27:01

Я думаю, что этот трюк здесь не обсуждается. Итак, вот оно,

В любом типе сложной матрицы, когда вам нужны чередующиеся цвета ячеек, будь то строка или столбец, рабочее решение,

Если вам нужен альтернативный цвет клеток, то,

  1. В правом нижнем углу представления дизайна отчета в разделе «Группы столбцов» создайте поддельную родительскую группу 1 (с использованием выражения) с именем «FakeParentGroup».
  2. Затем в дизайне отчета для ячеек, которые будут окрашиваться альтернативно, используйте следующее выражение цвета фона

= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "Белый", "LightGrey")

Это все.

То же самое для альтернативного цветного ряда, просто вы должны соответственно изменить решение.

ПРИМЕЧАНИЕ. Здесь иногда требуется соответственно установить границу ячеек, обычно она исчезает.

Также не забудьте удалить значение 1 в отчете, который появился в pic, когда вы создали поддельную родительскую группу.

4
16.05.2014 12:40:36
Этот ответ, безусловно, отличная находка для тех, кто должен создавать группирование строк в сложных таблицах! Если есть родительская группа, используйте ее. В противном случае создайте FakeParentGroup. Отсутствующие значения в таблицах, в которых есть группы столбцов и строк, обычно отбрасывают форматирование. Смотрите мой ответ, который основан на @ Aditya's, чтобы учесть пропущенные значения в первой ячейке.
rpyzh 20.05.2014 19:29:33

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

Решение @ 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
20.05.2014 19:59:06
Спасибо @rpyzh, это было решением, которое работало для моей многострочной группы с общей родительской группой строк Report!
Niallty 6.11.2018 18:23:08

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

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

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)
1
13.01.2015 04:07:03

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

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
0
11.07.2016 22:00:20

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

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
11.11.2016 23:06:50