Pregunta

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


Editar: Hay un montón de buenas respuestas enumeradas a continuación, desde rápido y simple a complejo y completo.Por desgracia, sólo puedo elegir uno...

¿Fue útil?

Solución

Vaya a la propiedad BackgroundColor de la fila de la tabla y elija "Expresión..."

Utilice 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. Simplemente investigué esta pregunta y pensé en compartirla.

Otros consejos

El uso de IIF(RowNumber...) puede generar algunos problemas cuando se agrupan filas y otra alternativa es usar una función VBScript simple para determinar el color.

Requiere 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, establezca el Color de fondo de la siguiente manera:

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

Todos los detalles están en esto. 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 el diseño.esa expresión funcionó bien para mí:

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

He cambiado un poco la solución de @Catch22 porque 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 informes donde hay numerosos campos en los que sería necesario 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 cambié 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 sólido que cambiar manualmente 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 simplemente comenzará con el color opuesto al de la última línea del grupo anterior.Quería que mis grupos comenzaran siempre con el mismo color... la primera fila de cada grupo siempre debería ser blanca y la siguiente fila de color.

El concepto básico era restablecer el interruptor cuando comienza 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 de celda:

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

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

No dude en 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 margen de mejora, pero la idea básica parece sólida (y fue útil para mí), así que quería descartarla aquí.

para encabezados/pies de página de grupo:

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

También puede utilizar esto para "restablecer" el recuento de colores de fila dentro de cada grupo.Quería que la primera fila de detalles de 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 deConfiguración del color de fondo de los elementos del informe en SSRS.Utilice 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 a él 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 al 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 grupo de una sola fila RowGroup1:

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

    =iif(RunningValue(Fields![Campo de grupo de filas].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  3. Establezca la propiedad BackgroundColor de todas las celdas de su fila en

    "=ReportItems!RowGroupColor.Value"

  4. Establezca el ancho de la columna RowGroupColor en 0PT y configure CanGrow en falso para ocultarlo de los clientes.

¡Voilá!Esto también resuelve muchos de los problemas mencionados en este hilo:

  • Restablecimientos automáticos para subgrupos:Simplemente agregue una nueva columna para ese grupo de filas, realizando un Valor en ejecución en es valores del grupo.
  • No hay necesidad de preocuparse por los cambios Verdadero/Falso.
  • Los colores solo se mantienen en un lugar para facilitar su modificación.
  • Se puede usar indistintamente en grupos de filas o columnas (simplemente establezca la altura en 0 en lugar del ancho)

Sería fantástico si SSRS expusiera propiedades además del Valor en los cuadros de texto.Podría simplemente incluir este tipo de cálculo en una propiedad BackgroundColor de los cuadros de texto del grupo de filas y luego hacer referencia a él 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 de una fila tuvieran el mismo fondo.Agrupé tanto por fila como por columna, y con las dos soluciones principales aquí obtuve todo las filas de la columna 1 con fondo de color, todas las filas de la columna 2 con fondo blanco, todas las filas de la columna 3 con fondo de color, y así sucesivamente.Es como si RowNumber y bOddRow (de la solución de Catch22) preste atención a mi grupo de columnas en lugar de ignorarlo y alternar solo con una nueva fila.

Lo que queria es para todos los columnas en la fila 1 para que tenga un fondo blanco, luego todas las columnas de la fila 2 para que tengan un fondo de color, luego todas las columnas de la fila 3 para que 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, p.e.

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

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

Creo que este truco no se trata aquí.Asi que aqui esta,

En cualquier tipo de matriz compleja, cuando desea colores de celda alternativos, ya sea en cuanto a filas o en cuanto a columna, la solución de trabajo es,

Si desea un color alternativo de las columnas de las celdas, entonces,

  1. En la esquina inferior derecha de una vista de diseño de informe, en "grupos de columnas", cree un grupo principal falso en 1 (usando la expresión), llamado "FakeParentGroup".
  2. Luego, en el diseño del informe, para que las celdas se coloreen alternativamente, use siguiendo la expresión de color de fondo

=IIF(RunningValue( Campos![ColumnGroupField].Valor, countDistinct, "FakeParentGroup" ) MOD 2, "Blanco", "Gris claro")

Eso es todo.

Lo mismo ocurre con la fila de colores alternativos, solo tienes que editar la solución en consecuencia.

NOTA:Aquí, a veces es necesario establecer el borde de las celdas en consecuencia, normalmente desaparece.

Además, no olvide eliminar el valor 1 en el informe que apareció en la imagen cuando creó un grupo de padres falso.

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

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

La respuesta de @Aditya es excelente, pero hay casos en los que el formato se descartará si a la primera celda de la fila (para el formato de fondo de la fila) le falta un valor (en tablix complejos con grupos de columnas/filas y valores faltantes).

La solución de @Aditya aprovecha inteligentemente countDistinct consecuencia de runningValue función para identificar números de fila dentro de un grupo tablix (fila).Si tiene filas de Tablix a las que les falta un valor en la primera celda, runningValue no aumentará 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, tendrá que agregar un término adicional para compensar el countDistinct valor.Mi opinión fue verificar el primer valor en ejecución en el grupo de filas (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.

¿Alguien podría explicar la lógica detrás de convertir el resto de los campos en falso en el siguiente código (de 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 simplemente comenzará con el color opuesto al de la última línea del grupo anterior.Quería que mis grupos comenzaran siempre con el mismo color... la primera fila de cada grupo siempre debería ser blanca y la siguiente fila de color.

El concepto básico era restablecer el interruptor cuando comienza 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 de celda:

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

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

No dude en 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 margen de mejora, pero la idea básica parece sólida (y fue útil para mí), así que quería descartarla aquí.

Probé todas estas soluciones en un Tablix agrupado con espacios de fila y ninguna funcionó en todo el informe.¡El resultado fueron filas de colores duplicadas y otras soluciones dieron como resultado columnas alternas!

Aquí está la función que escribí y 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, 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, publico esto aquí:

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

A mis datos matriciales les faltaban valores, por lo que no pude hacer funcionar la solución de ahmad, 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, establezca el color para cada celda de la fila según el valor de ese campo.

Ligera modificación de otras respuestas de aquí que funcionaron 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")

Al usar grupos de filas y columnas, tuve un problema por el cual los colores alternaban entre las columnas aunque fuera 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 el primero columna de la fila que desea alternar, establezca la expresión de color en:

=Código.ColorAlterno()

-

En las columnas restantes, configúrelas todas en:

=Código.BGColor

Esto debería hacer que los colores se alternen sólo después de dibujar la primera columna.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top