Agregar color de fila alterno al informe de SQL Server Reporting services


¿Cómo sombrear filas alternas en un informe de SQL Server Reporting Services?


Edit: Hay un montón de buenas respuestas enumeradas a continuación from desde quick y simple hasta complex and comprehensive. Por desgracia, sólo puedo elegir uno...

Author: Community, 2008-09-04

18 answers

Vaya a la propiedad backgroundColor de la fila de la tabla y elija "Expression..."

Use esta expresión:

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

Este truco se puede aplicar a muchas áreas del informe.

Y en. NET 3.5 + puedes usar:

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

No busco representante just acabo de investigar esta pregunta yo mismo y pensé en compartir.

 205
Author: Michael Haren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-03 04:00:01

Usando IIF(RowNumber...) puede dar lugar a algunos problemas cuando las filas se agrupan y otra alternativa es utilizar una función VBScript simple para determinar el color.

Es un poco más de esfuerzo, pero cuando la solución básica no es suficiente, es una buena alternativa.

Básicamente, se agrega código al informe de la siguiente manera...

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

Luego en cada celda, establezca el color de fondo de la siguiente manera:

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

Los detalles completos están en este Wrox artículo

 84
Author: Catch22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 14:29:35

Obtuve el efecto de ajedrez cuando usé la solución de Catch22, creo que porque mi matriz tiene más de una columna en diseño. esa expresión funcionó bien para mí :

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
 62
Author: ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-21 14:47:17

He cambiado un poco la solución de @Catch22 ya que no me gusta la idea de tener que entrar en cada campo si decido que quiero cambiar uno de los colores. Esto es especialmente importante en los informes donde hay numerosos campos que necesitarían cambiar la variable de color.

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

Noté que he cambiado la función de una que acepta los colores a una que contiene los colores a usar.

Luego en cada campo agregue:

=Code.AlternateColor(rownumber(nothing))

Esto es mucho más robusto que cambiar manualmente el color en el color de fondo de cada campo.

 20
Author: Michael Eakins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 17:30:29

Una cosa que noté es que ninguno de los dos métodos superiores tiene ninguna noción de qué color debe ser la primera fila en un grupo; el grupo simplemente comenzará con el color opuesto de la última línea del grupo anterior. Quería que mis grupos empezaran siempre con el mismo color...la primera fila de cada grupo siempre debe ser blanca, y la siguiente fila de color.

El concepto básico era restablecer la palanca cuando se inicia cada grupo, así que agregué un poco de código:

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

Así que tengo tres diferentes tipos de fondos de celda ahora:

  1. La primera columna de la fila de datos tiene =Código.AlternateColor ("AliceBlue"," White", True) (Esta es la misma que la respuesta anterior.)
  2. Las columnas restantes de la fila de datos tienen =Código.AlternateColor ("AliceBlue", "White", False) (Esta, también, es la misma que la respuesta anterior.)
  3. La primera columna de la fila de agrupación tiene =Código.RestartColor ("AliceBlue") (Esto es nuevo.)
  4. Las columnas restantes de la fila de agrupación tienen =Codificar.AlternateColor ("AliceBlue", "White", False) (Esto se usó antes, pero no se menciona para agrupar filas.)

Esto funciona para mí. Si desea que la fila de agrupación no sea de color, o de un color diferente, debería ser bastante obvio a partir de esto cómo cambiarla.

Por favor, siéntase libre de agregar comentarios sobre lo que se podría hacer para mejorar este código: Soy nuevo en SSRS y VB, por lo que sospecho firmemente que hay mucho espacio para mejorar, pero la idea básica parece sonido (y fue útil para mí)así que quería tirarlo aquí.

 16
Author: Beska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-03 21:09:46

Para los encabezados/pies de grupo:

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

También puede usar esto para "restablecer" el recuento de colores de fila dentro de cada grupo. Quería que la primera fila de detalles en cada subgrupo comenzara con blanco y esta solución (cuando se usa en la fila de detalles) permitió que eso sucediera:

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

Véase: http://msdn.microsoft.com/en-us/library/ms159136 (v = sql.100).aspx

 10
Author: John Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 04:10:13

La solución de Michael Haren funciona bien para mí. Sin embargo, recibí una advertencia diciendo que "Transparente" no es un color de fondo válido cuando se Previsualiza. Encontrado una solución rápida de Setting backgroundColor of Report elements in SSRS. Use Nada en lugar de"Transparente"

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
 7
Author: nonetaku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-06 07:44:38

La única manera efectiva de resolver esto sin usar VB es "almacenar" el valor del módulo de agrupación de filas dentro de la agrupación de filas (y fuera de la agrupación de columnas) y referenciarlo explícitamente dentro de su agrupación de columnas. Encontré esta solución en

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

Pero Ankeet no es el mejor trabajo de explicar lo que está sucediendo, y su solución recomienda el paso innecesario de crear una agrupación en un valor constante, así que aquí está mi proceso paso a paso para una matriz con un solo grupo de filas RowGroup1:

  1. Cree una nueva columna dentro del RowGroup1. Cambie el nombre del cuadro de texto para esto a algo como RowGroupColor.
  2. Establezca el valor del cuadro de texto de RowGroupColor en

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

  3. Establezca la propiedad backgroundColor de todas sus celdas de fila en

    "=ReportItems!RowGroupColor.Value"

  4. Establezca el ancho de la columna RowGroupColor en 0pt y establezca CanGrow a false para escóndelo de los clientes.

Voila! Esto también resuelve muchos de los problemas mencionados en este hilo:

  • Reinicios automáticos para subgrupos: Simplemente agregue una nueva columna para eso rowgroup, realizando un Valor de ejecución en sus valores de grupo.
  • No hay necesidad de preocuparse por los conmutadores Verdadero/Falso.
  • Los colores solo se mantienen en un lugar para una fácil modificación.
  • Se puede usar indistintamente en grupos de filas o columnas (simplemente establezca la altura en 0 en lugar de anchura)

Sería increíble si los SSRS expusieran propiedades además del Valor en los cuadros de texto. Simplemente podría rellenar este tipo de cálculo en una propiedad backgroundColor de los cuadros de texto del grupo de filas y luego referenciarlo como ReportItems!RowGroup.BackgroundColor en todas las otras células.

Ahh bueno, podemos soñar ...

 6
Author: Kyle Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-03 21:27:22

Mi problema era que quería que todas las columnas en una fila tuvieran el mismo fondo. Agrupé por fila y por columna, y con las dos soluciones superiores aquí tengo todas las filas en la columna 1 con un fondo coloreado, todas las filas en la columna 2 con un fondo blanco, todas las filas en la columna 3 con un fondo coloreado, y así sucesivamente. Es como si RowNumber y bOddRow (de la solución de Catch22) prestaran atención a mi grupo de columnas en lugar de ignorarlo y solo alternar con un nuevo fila.

Lo que quería es que todas las columnas en la fila 1 tengan un fondo blanco, luego todas las columnas en la fila 2 tengan un fondo coloreado, luego todas las columnas en la fila 3 tengan un fondo blanco, y así sucesivamente. Obtuve este efecto usando la respuesta seleccionada, pero en lugar de pasar Nothing a RowNumber, pasé el nombre de mi grupo de columnas, por ejemplo,

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

Pensé que esto podría ser útil para alguien más.

 5
Author: Sarah Vessels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 15:45:01

Creo que este truco no se discute aquí. Así que aquí está,

En cualquier tipo de matriz compleja, cuando desee colores de celda alternativos, ya sea en fila o en columna, la solución de trabajo es,

Si desea un color alternativo de las células color wise entonces,

  1. En la esquina inferior derecha de una vista de diseño de informe, en la columna" Grupos", crear un grupo padre falso en 1 (usando expresión), llamado "FakeParentGroup" (en inglés).
  2. Luego, en el diseño del informe, para las celdas que para ser coloreado alternativamente, utilice la siguiente expresión de color de fondo

= IIF (RunningValue (Fields![ColumnGroupField].Valor, countDistinct," FakeParentGroup") MOD 2," White","LightGrey")

Eso es todo.

Lo mismo para la fila de color alternativo, solo tiene que editar la solución en consecuencia.

NOTA: Aquí, a veces es necesario establecer el borde de las celdas en consecuencia, por lo general se desvanece.

También no se olvide de eliminar el valor 1 en el informe que entró en pic cuando creaste un grupo de padres falsos.

 3
Author: Aditya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-16 12:40:36

Si para todo el informe necesita un color alternativo, puede usar el conjunto de datos al que está vinculado Tablix para un número de fila de identidad de todo el informe y usarlo en la función Número de fila...

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")
 2
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-05 18:35:18

¿Podría alguien explicar la lógica detrás de convertir el resto de los campos a false en el código de abajo (desde arriba post)

Una cosa que noté es que ninguno de los dos métodos superiores tiene ninguna noción de qué color debe ser la primera fila en un grupo; el grupo simplemente comenzará con el color opuesto de la última línea del grupo anterior. Quería que mis grupos empezaran siempre con el mismo color...la primera fila de cada grupo siempre debe ser blanca, y la siguiente fila de color.

El básico el concepto era restablecer la palanca cuando se inicia cada grupo, así que agregué un poco de código:

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

Así que ahora tengo tres tipos diferentes de fondos de celda:

  1. La primera columna de la fila de datos tiene =Código.AlternateColor ("AliceBlue"," White", True) (Esta es la misma que la respuesta anterior.)
  2. Las columnas restantes de la fila de datos tienen =Código.AlternateColor ("AliceBlue", "White", False) (Esta, también, es la misma que la respuesta anterior.)
  3. La primera columna de la fila de agrupación tiene =Codificar.RestartColor ("AliceBlue") (Esto es nuevo.)
  4. Las columnas restantes de la fila de agrupación tienen =Código.AlternateColor ("AliceBlue", "White", False) (Esto se usó antes, pero no se menciona para agrupar filas.)

Esto funciona para mí. Si desea que la fila de agrupación no sea de color, o de un color diferente, debería ser bastante obvio a partir de esto cómo cambiarla.

Por favor, siéntase libre de agregar comentarios sobre lo que se podría hacer para mejorar este código: Soy nuevo en ambos SSRS y VB, así que sospecho firmemente que hay mucho espacio para mejorar, pero la idea básica parece sólida (y fue útil para mí), así que quería tirarla aquí.

 1
Author: misha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 04:12:37

La respuesta de@Aditya es genial, pero hay casos en los que el formato se eliminará si la primera celda de la fila (para el formato de fondo de fila) tiene un valor faltante (en tablas complejas con grupos de columnas/filas y valores faltantes).

La solución de@Aditya aprovecha inteligentemente el resultado de countDistinct de la función runningValue para identificar números de fila dentro de un grupo tablix (fila). Si tiene filas tablix con valor faltante en la primera celda, runningValue no incrementará el resultado countDistinct y volverá el número de la fila anterior (y, por lo tanto, afectará el formato de esa celda). Para tener en cuenta eso, tendrá que agregar un término adicional para compensar el valor countDistinct. Mi opinión fue comprobar el primer valor en ejecución en el grupo de filas (consulte la línea 3 del fragmento de código a continuación):

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

Espero que esto ayude.

 1
Author: rpyzh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-20 19:59:06

Probé todas estas soluciones en un Tablix agrupado con espacios de fila y ninguno funcionó en todo el informe. El resultado fue filas de colores duplicados y otras soluciones resultaron en columnas alternas!

Aquí está la función que escribí que funcionó para mí usando un Recuento de columnas:

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

Para un Tablix de 7 columnas utilizo esta expresión para la Fila (de Celdas) Color de fondo:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)
 1
Author: Jeremy Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 04:07:03

Solo porque ninguna de las respuestas anteriores parecía funcionar en mi matriz, estoy publicando esto aquí:

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

 0
Author: CodeRedick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-28 00:41:07

Mis datos de matriz tenían valores faltantes, por lo que no pude hacer que la solución de ahmad funcionara, pero esta solución funcionó para mí

La idea básica es crear un grupo hijo y un campo en su grupo más interno que contenga el color. A continuación, establezca el color para cada celda de la fila en función del valor de ese campo.

 0
Author: FistOfFury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-02 19:57:53

Ligera modificación de otras respuestas de aquí que funcionó para mí. Mi grupo tiene dos valores para agrupar, así que pude simplemente ponerlos en el primer arg con un + para que se alterne correctamente

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
 0
Author: Soy Sauce Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 22:00:20

Al usar los grupos de filas y columnas, tuve un problema en el que los colores se alternaban entre las columnas a pesar de que era la misma fila. Resolví esto usando una variable global que se alterna solo cuando la fila cambia:

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

Ahora, en la primera columna de la fila que desea alternar, establezca la expresión de color en:

=Código.AlternateColor ()

-

En las columnas restantes, establézcalas todas a:

=Código.BGColor

Esto debería hacer que los colores se alternen solo después de que se dibuje la primera columna.

Esto puede (no verificable) mejorar el rendimiento, también, ya que no es necesario hacer un cálculo matemático para cada columna.

 0
Author: nrg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 23:06:50