Додайте змінний колір рядка до звіту про послуги звітування SQL Server


142

Як відтіняти чергування рядків у звіті про послуги звітування SQL Server?


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


2
= IIf (RowNumber (нічого) Mod 2 = 0, "Без кольору", "# DDEBF7")
Стефан Штайгер

Якщо ви вибрали кілька комірок, ви не можете редагувати властивості текстового поля, але ви можете отримати доступ до кольору заповнення на панелі властивостей і встановити вираз там!
kitsu.eb

Відповіді:


213

Перейдіть до властивості BackgroundColor рядка таблиці та виберіть "Вираз ..."

Використовуйте цей вираз:

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

Ця хитрість може бути застосована до багатьох областей звіту.

І в .NET 3.5+ ви можете використовувати:

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

Не шукаю представників - я просто досліджував це питання сам і думав, що поділюсь.


10
Це відбувається за певних обставин, особливо у таблицях та матричних об'єктах з великою кількістю підсумків. Відповідь Catch22 не має однакових обмежень. Також метод Catch22 може використовуватися для примушування стовпців у матриці до змінних кольорів стовпців, що корисно один раз на синьому місяці.
Зареєстрований користувач

16
Я завжди обов'язково підтримую когось, хто відповідає на їхнє власне питання. Занадто часто запитуючий самостійно знаходить відповідь, а потім ніколи не повертається, щоб залишити його, залишаючи решту з нас, у кого може виникнути те саме питання в темряві. Важкий удар для вас, сер.
Метт Дітроліо

4
Коли я використовую вищевказаний код, я отримую попереджувальне повідомлення на зразок. [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). Дякую за пораду, хоча.
Рассел Б

2
Це ставить проблему у випадку перегляду груп та деталей

3
деякі веб-переглядачі не справляються з "Прозорим" або "Нічим". Найкраще було б скористатися "Білими"
Nate S.

89

Використання 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


Вищевказаний код або додається до розділу «Код» звіту, або на сторінку з кодовим кодом у проекті VB.NET, складений та розгорнутий у вигляді DLL, який посилається як збірка. Я рекомендую докласти додаткових зусиль для розгортання цього тексту як dll, оскільки ви загалом посилаєтесь на це у численних звітах.
Зареєстрований користувач

Це мій кращий спосіб вирішити проблему з групуванням, після спроби кількох інших хак. Він не руйнується, коли інтерактивне сортування застосовується до стовпця. +1 і велике спасибі
Рекс Міллер

Кольори зміщуються, коли у вас є непарна кількість рядків.
К Річард

20
Не забудьте змінити "True" на "False" для всіх стовпців у рядку після першого, інакше ви побачите ефект шашки! Дякую за рішення - це чудово працює!
Пітер Муларієн

Пітер Муларієн: У мене є ця проблема, чи можете ви пояснити, як її виправити?
інженер програмного забезпечення Білла

65

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

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")

13
Ця відповідь заслуговує на набагато більше уваги - це чисте рішення, яке ідеально працює в матриці з групами рядків і групами стовпців і не потребує спеціального коду для роботи. Гарний!
Стефан Мор

9
Насправді це працює добре навіть для кількох стовпців - але не, якщо у вас є "відсутні" дані в групі. Отже, якщо у вас є дані, які мають дані 12 місяців у 2007 році, але немає даних за січень у 2006 році, а групуйте за місяцем за рядками та роком за стовпцями, забарвлення 2006 буде вимкнено на одне, тому що RunningValue виходить з ладу, тому що навіть якщо є досі в полі матриці для "січня 2006 року" немає даних у наборі даних, і RunningValue залишається тим самим, не змінюється колір тощо.
Kyle Hale

2
@ahmad це так близько. У мене виникає проблема, коли порожні поля використовують протилежний колір. як я можу переконатися, що порожні коробки правильно пофарбовані?
FistOfFury

@KyleHale У вас є виправлення відсутньої забарвлення коробки?
FistOfFury

2
@FistOfFury Єдине відоме мені рішення - забезпечити встановлення значення (зазвичай 0) для відсутніх даних.
Кайл Хейл

20

Я змінив рішення @ 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))

Це набагато надійніше, ніж вручну змінювати колір у фоновому кольорі кожного поля.


1
Гарне доповнення до цієї нитки! Мені подобається не встановлювати "True" або "False" у кожному стовпці. Мені також подобається варіант "мод 3", тому я можу затінювати лише кожен 3-й ряд.
Баодад

Мені також подобається це рішення. Однак для мене це не працює, коли використовую групування рядків. @ ahmad рішення вище працювало для мене.
Баодад

Це відмінне рішення для таблиць, якщо ви не хочете додавати додаткові поля у свій DataSet!
clamchoda

16

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

Основна концепція полягала в тому, щоб скинути тумблер при запуску кожної групи, тому я додав трохи коду:

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, тому я сильно підозрюю, що є багато місця для вдосконалення, але основна ідея здається здоровою (і вона була корисною для мене), тому я хотів його тут викинути.


Ви також можете скинути нумерацію рядків для кожної групи, як описано в цій відповіді .
StackOverthrow

10

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

=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


8

Рішення Майкла Харена для мене добре працює. Однак я отримав попередження про те, що "Прозорий" не є дійсним BackgroundColor під час попереднього перегляду. Швидке виправлення знайдено з налаштування елементів BackgroundColor звіту в SSRS . Нічого не використовуйте замість "Прозорого"

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

Білим було б краще, ніж Нічого.
Nate S.

6

Єдиний ефективний спосіб вирішити це без використання VB - це "зберігати" значення модуля групування рядків у групі рядків (і поза групою стовпців) та чітко посилатись на це у групування стовпців. Я знайшов це рішення у

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

Але в Ankeet не найкраща робота з пояснення того, що відбувається, і його рішення рекомендує зайвий крок створення угруповання за постійним значенням, тому ось мій покроковий процес для матриці з однорядковою групою 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 виставив властивості, окрім значення в Textboxes. Ви можете просто заповнити такий обчислення у властивості BackgroundColor текстових полів групи рядків, а потім посилати його як ReportItems! RowGroup.BackgroundColor у всіх інших клітинках.

Ах, ну, ми можемо мріяти ...


5

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

Я хотів, щоб усі стовпці першого ряду мали білий фон, потім усі стовпці у другому рядку мали кольоровий фон, потім усі стовпці у рядку 3 мали білий фон тощо. Цей ефект я отримав за допомогою обраної відповіді, але замість того, Nothingщоб переходити до RowNumber, я передав назву моєї групи стовпців, наприклад

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

Думав, що це може бути корисним комусь іншому.


4

Я думаю, що цей фокус тут не обговорюється. Так ось це,

У будь-якому типі складної матриці, коли вам потрібні альтернативні кольори комірок, будь то рядкові або стовпчикові, робочим рішенням є:

Якщо ви хочете, щоб черговий колір колон колони був мудрим,

  1. У правому нижньому куті подання дизайну звіту в "Групі стовпців" створіть підроблену батьківську групу на 1 (використовуючи вираз), названу "FakeParentGroup".
  2. Потім в дизайні звіту для осередків, які слід пофарбувати альтернативно, використовуйте наступне вираження кольору тла

= IIF (RunningValue (Поля! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")

Це все.

Те ж саме для альтернативного кольорового ряду мудрий, просто вам потрібно редагувати рішення відповідно.

ПРИМІТКА. Тут іноді потрібно встановити межу комірок відповідно, зазвичай це зникає.

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


1
Ця відповідь, безумовно, чудова знахідка для тих, кому доводиться створювати смуги рядків у складних таблицях! Якщо існує батьківська група, використовуйте її. В іншому випадку створіть FakeParentGroup. Відсутнє значення в таблицях, що мають групи стовпців і рядків, зазвичай скидає форматування. Дивіться мою відповідь, що ґрунтується на @ Aditya для обліку пропущених значень у першій комірці.
рпиж

2

Якщо для всього звіту потрібен змінний колір, ви можете використовувати DataSet, до якого прив’язаний ваш Tablix, для ідентифікаційного списку ідентифікаційних номерів у звіті у звіті та використовувати його у функції RowNumber ...

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

2

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

@ Рішення Aditya вміло використовує countDistinctрезультат runningValueфункції для виявлення номерів рядків у групі tablix (рядок). Якщо у першій комірці є рядки tablix з пропущеним значенням, результат 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")

Сподіваюся, це допомагає.


Дякую @rpyzh, це рішення, яке працювало для моєї багаторядкової групи із загальним звітом про батьківську групу рядків!
Найллті

1

Чи може хтось пояснити логіку, що перетворює решту полів на значення 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

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

Ось функція, яку я написав, яка працювала на мене за допомогою підрахунку стовпців:

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 стовпців я використовую цей вираз для рядкового (із клітин) фонового кольору:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)


0

У моїх матричних даних в ньому були відсутні значення, тому я не зміг отримати рішення Ахмада для роботи, але це рішення працювало на мене

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


Перевірте відповіді @ Aditya та мою відповідь на обробку пропущених значень у матриці. Корисно, якщо ви вже маєте (або бажаєте створити підроблену) батьківську групу. Вам не доведеться створювати окреме поле таким чином.
рпиж

0

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

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

0

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

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

-

У решті стовпців встановіть їх на:

= Код.BGColor

Це повинно зробити чергування кольорів лише після того, як намальовано перший стовпець.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.