sql-server - parametros - repetir encabezado de tabla en reporting services
Agregue colores de fila alternativos al informe de servicios de informes de SQL Server (18)
¿Cómo sombrea las filas alternas en un informe de SQL Server Reporting Services?
Editar: hay un montón de buenas respuestas que se enumeran a continuación, desde quick y simple hasta complejas e integrales . Por desgracia, puedo elegir solo uno ...
Creo que este truco no se trata aquí. Asi que aqui esta,
En cualquier tipo de matriz compleja, cuando desee colores de celda alternativos, ya sea en filas o en columnas, la solución de trabajo es:
Si desea un color alternativo de células coloumn sabio, entonces,
- En la esquina inferior derecha de una vista de diseño de informe, en "Grupos de columnas", cree un grupo primario falso en 1 (usando expresión), llamado "FakeParentGroup".
- Luego, en el diseño del informe, para las celdas que se van a colorear de forma alternativa, use la siguiente expresión de color de fondo
= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "Blanco", "LightGrey")
Eso es todo.
Lo mismo para la hilera de colores alternativos, solo tiene que editar la solución en consecuencia.
NOTA: Aquí, algunas veces necesita establecer el borde de las celdas en consecuencia, generalmente desaparece.
Tampoco olvides borrar el valor 1 en el informe que entró en la imagen cuando creaste el grupo padre falso.
¿Podría alguien explicar la lógica detrás de convertir el resto de los campos a falso en el código a continuación (desde arriba de la publicación)
Una cosa que noté es que ninguno de los dos mejores métodos tiene ninguna noción de qué color debe ser la primera fila en un grupo; el grupo comenzará con el color opuesto a 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 alternar 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
Entonces tengo tres tipos diferentes de fondos de celda ahora:
- La primera columna de fila de datos tiene = Code.AlternateColor ("AliceBlue", "White", True) (Esto es lo mismo que la respuesta anterior).
- Las columnas restantes de la fila de datos tienen = Code.AlternateColor ("AliceBlue", "White", False) (Esto, también, es el mismo que la respuesta anterior).
- La primera columna de la fila de agrupación tiene = Code.RestartColor ("AliceBlue") (Esto es nuevo).
- Las columnas restantes de la fila de agrupación tienen = Code.AlternateColor ("AliceBlue", "White", False) (Esto se utilizó anteriormente, pero no se menciona para agrupar la fila).
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.
Por favor, siéntase libre de agregar comentarios sobre lo que se puede hacer para mejorar este código: soy nuevo en SSRS y VB, así 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í.
Al usar los grupos de filas y columnas, tuve un problema donde los colores se alternarían entre las columnas aunque fuera la misma fila. Resolví esto mediante el uso de una variable global que solo se alterna 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, configure la expresión de color como:
= Code.AlternateColor ()
-
En las columnas restantes, configúrelas todas para:
= Code.BGColor
Esto debería hacer que los colores alternen solo después de dibujar la primera columna.
Esto también puede mejorar (de manera no verificable) el rendimiento, ya que no necesita hacer un cálculo matemático para cada columna.
El uso de IIF (RowNumber ...) puede ocasionar algunos problemas cuando las filas se agrupan y otra alternativa es utilizar una función de 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, agregas 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 BackgroundColor de la siguiente manera:
=Code.AlternateColor("AliceBlue", "White", True)
Los detalles completos están en este artículo de Wrox
He cambiado un poco la solución @ 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 cambié la función de una que acepta los colores a una que contiene los colores que se usarán.
Luego en cada campo agrega:
=Code.AlternateColor(rownumber(nothing))
Esto es mucho más sólido que cambiar manualmente el color en el color de fondo de cada campo.
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 es el mejor trabajo para 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:
- Crea una nueva columna dentro de RowGroup1. Cambie el nombre del cuadro de texto para esto a algo así como RowGroupColor.
Establezca el valor del cuadro de texto de 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"
- Establezca el ancho de la columna RowGroupColor en 0pt y establezca CanGrow en false para ocultarlo de los clientes.
Voila! 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, ejecutando RunningValue en sus valores de grupo.
- No hay necesidad de preocuparse por los conmutadores True / False.
- Los colores solo se mantienen en un solo lugar para una fácil modificación.
- Se puede usar indistintamente en grupos de filas o columnas (simplemente configure la altura en 0 en lugar de ancho)
Sería increíble si SSRS expondría propiedades además del valor en los cuadros de texto. Podría rellenar este tipo de cálculos en una propiedad BackgroundColor de los cuadros de texto del grupo de filas y luego hacer referencia a ellos como ReportItems! RowGroup.BackgroundColor en todas las otras celdas.
Ahh bien, podemos soñar ...
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 perdido (en tablas complejas con columnas / grupos de filas y valores faltantes).
La solución de countDistinct
aprovecha countDistinct
resultado runningValue
función runningValue
para identificar los números de fila dentro de un grupo tablix (fila). Si tiene filas tablix con valor perdido en la primera celda, runningValue
no incrementará el resultado countDistinct
y devolverá el número de la fila anterior (y, por lo tanto, afectará el formateo de esa celda). Para dar cuenta de eso, tendrá que agregar un término adicional para compensar el valor countDistinct
. Lo que hice fue verificar el primer valor en ejecución en el grupo de filas (ver 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.
La solución de Michael Haren funciona bien para mí. Sin embargo, recibí una advertencia que decía que "Transparente" no es un BackgroundColor válido cuando Vista previa. Se ha encontrado una solución rápida al establecer BackgroundColor de elementos de informe en SSRS . Use Nothing en lugar de "Transparent"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
Leve modificación de otras respuestas desde 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 alternen correctamente
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Mi matriz de datos tenía 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 de niños y un campo en su grupo más interno que contenga el color. Luego, configure el color para cada celda en la fila según el valor de ese campo.
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 superiores obtuve todas las filas de la columna 1 con un 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í. Es como si RowNumber
y bOddRow
(de la solución de Catch22) prestaran atención a mi grupo de columnas en lugar de ignorar eso y solo alternar con una nueva fila.
Lo que quería es que todas las columnas de la fila 1 tengan un fondo blanco, luego todas las columnas de la fila 2 tengan un fondo de color, luego todas las columnas de la fila 3 tengan un fondo blanco, y así sucesivamente. RowNumber
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.
Obtuve el efecto de 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")
Probé todas estas soluciones en un Tablix agrupado con espacios de filas y ninguno funcionó en todo el informe. ¡El resultado fue filas de colores duplicados y otras soluciones dieron como resultado 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 Backcolour de la Fila (de las Celdas):
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Si para todo el informe necesita un color alternativo, puede usar el conjunto de datos para el que está vinculado su Tablix para un número de identificación de todo el informe en el informe y usarlo en la función RowNumber ...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
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
Una cosa que noté es que ninguno de los dos mejores métodos tiene ninguna noción de qué color debe ser la primera fila en un grupo; el grupo comenzará con el color opuesto a 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 alternar 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
Entonces tengo tres tipos diferentes de fondos de celda ahora:
- La primera columna de fila de datos tiene = Code.AlternateColor ("AliceBlue", "White", True) (Esto es lo mismo que la respuesta anterior).
- Las columnas restantes de la fila de datos tienen = Code.AlternateColor ("AliceBlue", "White", False) (Esto, también, es el mismo que la respuesta anterior).
- La primera columna de la fila de agrupación tiene = Code.RestartColor ("AliceBlue") (Esto es nuevo).
- Las columnas restantes de la fila de agrupación tienen = Code.AlternateColor ("AliceBlue", "White", False) (Esto se utilizó anteriormente, pero no se menciona para agrupar la fila).
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.
Por favor, siéntase libre de agregar comentarios sobre lo que se puede hacer para mejorar este código: soy nuevo en SSRS y VB, así 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í.
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ías usar:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
No busco representante. Acabo de investigar esta pregunta y pensé que la compartiría.
para encabezados / pies de página 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 de cada subgrupo comenzara con Blanco y esta solución (cuando se utilizaba en la fila de detalles) permitía 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