¿Cómo sombrea las filas alternas en un informe de SQL Server Reporting Services?
Editar: Hay un montón de buenas respuestas enumeradas a continuación, desde rápidas y simples hasta complejas y completas . Por desgracia, solo puedo elegir uno ...
¿Cómo sombrea las filas alternas en un informe de SQL Server Reporting Services?
Editar: Hay un montón de buenas respuestas enumeradas a continuación, desde rápidas y simples hasta complejas y completas . Por desgracia, solo puedo elegir uno ...
Respuestas:
Vaya a la propiedad BackgroundColor de la fila de la tabla y elija "Expresión ..."
Usa 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+ podría usar:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
No busco representante: solo investigué esta pregunta y pensé en compartirla.
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
Parece que sería la expresión correcta =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Gracias por el consejo.
El uso de IIF (RowNumber ...) puede generar algunos problemas cuando se agrupan las filas y otra alternativa es usar 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, 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, configure el Color de fondo de la siguiente manera:
=Code.AlternateColor("AliceBlue", "White", True)
Los detalles completos están en este artículo de Wrox
Obtuve el efecto ajedrez cuando utilicé 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")
He cambiado la solución de @ Catch22 un poco, ya que no me gusta la idea de tener que ir a 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 que se utilizarán.
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.
Una cosa que noté es que ninguno de los dos métodos principales tiene noción de qué color debe ser la primera fila en un grupo; el grupo solo comenzará con el color opuesto a la última línea del grupo anterior. Quería que mis grupos siempre comenzaran con el mismo color ... la primera fila de cada grupo siempre debe ser blanca y la siguiente fila coloreada.
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
Ahora tengo tres tipos diferentes de fondos celulares:
Esto funciona para mi. Si desea que la fila de agrupación no tenga color o sea de un color diferente, debería ser bastante obvio a partir de esto cómo cambiarla.
No dude en agregar comentarios sobre lo que podría hacerse para mejorar este código: soy nuevo en SSRS y VB, por lo que sospecho que hay mucho margen de mejora, pero la idea básica parece sólida (y fue útil para mí) así que quería tirarlo aquí.
para 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 color 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")
Ver: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
La solución de Michael Haren funciona bien para mí. Sin embargo, recibí una advertencia que decía que "Transparente" no es un Color de fondo válido en la Vista previa. Encontró una solución rápida al establecer elementos de Color de fondo de informe en SSRS . No use nada en lugar de "transparente"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
La única forma 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 hacer referencia 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 hace 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:
Establezca el valor del cuadro de texto RowGroupColor en
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Establezca la propiedad BackgroundColor de todas sus celdas de fila en
"=ReportItems!RowGroupColor.Value"
Voila! Esto también resuelve muchos de los problemas mencionados en este hilo:
Sería increíble si SSRS exponga propiedades además del valor en cuadros de texto. Simplemente puede rellenar este tipo de cálculo en una propiedad BackgroundColor de los cuadros de texto del grupo de filas y luego hacer referencia a ella como ReportItems! RowGroup.BackgroundColor en todas las demás celdas.
Ahh bueno, podemos soñar ...
Mi problema era que quería que todas las columnas seguidas tuvieran el mismo fondo. Agrupé tanto por fila como por columna, y con las dos soluciones principales aquí obtuve todas las filas de la columna 1 con un fondo de color, todas las filas de la columna 2 con un fondo blanco, todas las filas de la columna 3 con un fondo de color , y así. Es como si RowNumber
ybOddRow
(de la solución de Catch22) prestara atención a mi grupo de columnas en lugar de ignorar eso y solo alternando con una nueva fila.
Lo que quería era que todas las columnas de la fila 1 tuvieran un fondo blanco, luego todas las columnas de la fila 2 tuvieran un fondo de color, luego todas las columnas de la fila 3 tuvieran 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 otra persona.
En cualquier tipo de matriz compleja, cuando desea colores de celda alternativos, ya sea en fila o columna, la solución de trabajo es,
Si desea un color alternativo de las celdas, entonces,
= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
Eso es todo.
Lo mismo para la fila de color alternativa, solo tiene que editar la solución en consecuencia.
NOTA: Aquí, a veces necesita establecer el borde de las celdas en consecuencia, generalmente desaparece.
Además, no olvide eliminar el valor 1 en el informe que apareció en la imagen cuando creó un grupo de padres falso.
La respuesta de @ Aditya es excelente, pero hay casos en los que el formato se descartará si la primera celda de la fila (para el formato de fondo de la fila) tiene un valor faltante (en tablixes complejos con grupos de columnas / filas y valores faltantes).
La solución de @Aditya aprovecha inteligentemente el countDistinct
resultado de la runningValue
función para identificar números de fila dentro de un grupo tablix (fila). Si tiene filas de tablix con valor perdido en la primera celda, runningValue
no incrementará el countDistinct
resultado y devolverá el número de la fila anterior (y, por lo tanto, afectará el formato de esa celda). Para tener en cuenta eso, deberá agregar un término adicional para compensar el countDistinct
valor. Mi decisión fue verificar el primer valor en ejecución en el grupo de filas en sí (consulte la línea 3 del fragmento 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.
¿Podría alguien explicar la lógica detrás de convertir el resto de los campos en falso en el código a continuación (desde la publicación anterior)
Una cosa que noté es que ninguno de los dos métodos principales tiene noción de qué color debe ser la primera fila en un grupo; el grupo solo comenzará con el color opuesto a la última línea del grupo anterior. Quería que mis grupos siempre comenzaran con el mismo color ... la primera fila de cada grupo siempre debe ser blanca y la siguiente fila coloreada.
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
Ahora tengo tres tipos diferentes de fondos celulares:
Esto funciona para mi. Si desea que la fila de agrupación no tenga color o sea de un color diferente, debería ser bastante obvio a partir de esto cómo cambiarla.
No dude en agregar comentarios sobre lo que podría hacerse para mejorar este código: soy nuevo en SSRS y VB, por lo que sospecho que hay mucho margen de mejora, pero la idea básica parece sólida (y fue útil para mí) así que quería tirarlo aquí.
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 conteo 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, uso esta expresión para el color de fondo de la fila (de celdas):
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
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
Mis datos de matriz tenían valores faltantes, por lo que no pude lograr que la solución de ahmad funcionara, pero esta solución funcionó para mí
La idea básica es crear un grupo secundario y un campo en su grupo más interno que contenga el color. Luego configure el color para cada celda de la fila en función del valor de ese campo.
Ligera modificación de otras respuestas desde aquí que funcionó para mí. Mi grupo tiene dos valores para agrupar, así que pude ponerlos a ambos en el primer argumento con un + para que se alternara correctamente
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Cuando utilicé los grupos de filas y columnas, tuve un problema en el que los colores alternarían entre las columnas a pesar de que era la misma fila. Resolví esto usando una variable global que alterna solo cuando cambia la fila:
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, configúrelas todas para:
= Código.BGColor
Esto debería alternar los colores solo después de dibujar la primera columna.
Esto también puede mejorar (no verificable), ya que no necesita hacer un cálculo matemático para cada columna.