Adicionar uma cor alternada da linha ao relatório dos serviços de relatórios do servidor de SQL
Como é que se enrolam linhas alternadas num relatório dos Serviços de relatórios do servidor SQL?
Edit: há um monte de boas respostas listadas abaixo -- de rápido e simples para complexo e abrangente . Infelizmente, só posso escolher um...
18 answers
Vá para a propriedade BackgroundColor da table row e escolha a expressão"..."
Utilizar esta expressão:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Este truque pode ser aplicado em muitas áreas do relatório.
E em. Net 3, 5+, podias usar:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Não estou à procura de um representante ... eu mesmo pesquisei esta questão e pensei em partilhar.
Usando IIF (número de linha...) pode levar a alguns problemas quando as linhas estão sendo agrupadas e outra alternativa é usar uma função VBScript simples para determinar a cor.
É um pouco mais de esforço, mas quando a solução básica não é suficiente, é uma boa alternativa. Basicamente, adiciona-se Código ao relatório da seguinte forma...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
Em seguida, em cada célula, definir o BackgroundColor como se segue:
=Code.AlternateColor("AliceBlue", "White", True)
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Mudei um pouco a solução do @Catch22 porque não gosto da ideia de ter de ir a cada campo se decidir que quero mudar uma das cores. Isto é especialmente importante em relatórios onde os campos são numerosos que precisariam ter a variável de cor mudada.
'*************************************************************************
' -- 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
Notei que mudei a função de uma que aceita as cores para uma que contém as cores a serem usadas.
Em seguida, em cada campo adicionar:
=Code.AlternateColor(rownumber(nothing))
Isto é muito mais robusto. do que alterar manualmente a cor de fundo de cada campo.
Uma coisa que eu notei é que nenhum dos dois métodos superiores tem qualquer noção de que cor a primeira linha deve ser em um grupo; o grupo vai apenas começar com a cor oposta da última linha do grupo anterior. Queria que os meus grupos começassem sempre com a mesma cor...a primeira linha de cada grupo deve ser sempre branca, e a próxima linha colorida.
O conceito básico era reiniciar a comutação quando cada grupo começa, por isso adicionei um pouco 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
Então eu tenho três tipos diferentes de células agora:
- a primeira coluna da linha de dados tem = Código.AlternateColor ("AliceBlue"," White", True) (este é o mesmo que a resposta anterior.)
- as restantes colunas da linha de dados têm =Código.AlternateColor ("AliceBlue"," Branco", False) (esta, também, é a mesma que a resposta anterior.)
- a primeira coluna da linha de agrupamento tem =Código.RestartColor ("AliceBlue") (isto é novo.)
- as restantes colunas da linha de agrupamento têm =Codigo.AlternateColor ("AliceBlue"," Branco", False) (isto foi usado antes, mas nenhuma menção dele para agrupar linha.)
Para cabeçalhos/rodapés de grupo:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
Também pode usar isto para "repor" a contagem de cores das linhas dentro de cada grupo. Eu queria que a primeira linha de detalhes de cada sub-grupo começasse com branco e esta solução (quando usada na linha de detalhes) permitia que isso acontecesse:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
Ver: http://msdn.microsoft.com/en-us/library/ms159136 (V = sql.100).aspx
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
A única forma eficaz de resolver isto sem usar o VB é "guardar" o valor de linha que agrupa o módulo dentro do Agrupamento de linhas (e fora do Agrupamento de colunas) e referenciá-lo explicitamente dentro do seu agrupamento de colunas. Encontrei esta solução em
Http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Mas Ankeet não é o melhor trabalho de explicar o que está acontecendo, e sua solução recomenda o passo desnecessário de criar um agrupamento em um valor constante, então aqui está meu processo passo-a-passo para uma matriz com um único grupo de linha RowGroup1:- crie uma nova coluna dentro do RowGroup1. Muda o nome da caixa de texto para algo como RowGroupColor.
-
Define o valor da caixa de texto do RowGroupColor em
=iif(RunningValue(Fields![RowGroupField].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
-
Configure a propriedade BackgroundColor de todas as células das suas linhas para
"=ReportItems!RowGroupColor.Value"
- defina a largura da coluna RowGroupColor como 0pt e defina o CanGrow para falso para esconder dos clientes.
- reiniciar automaticamente os subgrupos: basta adicionar uma nova coluna para isso rowgroup, executando um RunningValue em os valores do seu grupo.
- não há necessidade de se preocupar com as opções Verdadeiro/Falso.
- As cores só foram mantidas num lugar para uma modificação fácil.
- pode ser usado indistintamente em grupos de linhas ou colunas (basta definir a altura para 0 em vez de largura)
Seria fantástico se o SSRS expusesse propriedades para além do valor nas caixas de texto. Você poderia simplesmente colocar este tipo de cálculo em uma propriedade BackgroundColor das Caixas de texto do grupo row e, em seguida, referenciá-lo como ReportItems!Grupo de filas.Cor traseira em todas as outras células.
Bem, podemos sonhar ...O meu problema era que eu queria que todas as colunas de uma fila tivessem o mesmo fundo. Agrupei tanto por linha como por coluna, e com as duas soluções de topo aqui tenho todas as linhas na coluna 1 com um fundo colorido, todas as linhas na coluna 2 com um fundo branco, todas as linhas na coluna 3 com um fundo colorido, e assim por diante. É como se RowNumber
e bOddRow
(da solução de Catch22) prestassem atenção ao meu grupo de colunas em vez de ignorarem isso e apenas alternarem com um novo linha.
O que eu queria era que todas as colunas da linha 1 tivessem um fundo branco, depois todas as colunas da linha 2 tivessem um fundo colorido, depois todas as colunas da linha 3 tivessem um fundo branco, e assim por diante. Eu consegui este efeito usando a resposta selecionada, mas em vez de passar Nothing
para RowNumber
, eu passei o nome do meu grupo de colunas, por exemplo
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Pensei que isto pudesse ser útil a outra pessoa.
Em qualquer tipo de matriz complexa, quando quiser cores alternadas de células, tanto em relação à linha como em relação à coluna, a solução de trabalho é,
Se você quiser uma cor alternativa de células coloumn SÁBIO Então,
- no canto inferior direito de uma vista de projecto de relatório, em " coluna Groups", criar um grupo pai falso no 1 (usando a expressão), chamado "FakeParentGroup".
- então, no desenho do relatório, para células a colorir em alternativa, usar a expressão de cor de fundo
É tudo.=IIF(RunningValue (Fields![ColumnGroupField].Value, countDistinct," FakeParentGroup") MOD 2," White","LightGrey")
O mesmo para a linha de cores alternativa, só que você tem que editar a solução de acordo.
Nota:aqui, por vezes, é necessário definir o contorno das células em conformidade, normalmente desaparece.Também não se esqueça de apagar o valor 1 em relatório que veio para a foto quando criaste o Grupo Pai falso.
Se, para todo o relatório, necessitar de uma cor alternada, poderá usar o conjunto de dados a que o seu Tablix Está ligado para um número de linha de identidade no relatório e usá-lo na função de numeração de linhas...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
Alguém poderia explicar a lógica por trás de transformar o resto dos Campos em falso em baixo do código (de cima do post)
Uma coisa que eu notei é que nenhum dos dois métodos superiores tem qualquer noção de que cor a primeira linha deve ser em um grupo; o grupo vai apenas começar com a cor oposta da última linha do grupo anterior. Queria que os meus grupos começassem sempre com a mesma cor...a primeira linha de cada grupo deve ser sempre branca, e a próxima linha colorida.
A o conceito básico era reiniciar a comutação quando cada grupo começa, por isso adicionei um pouco 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
Então agora tenho três tipos diferentes de células:
- a primeira coluna da linha de dados tem = Código.AlternateColor ("AliceBlue"," White", True) (este é o mesmo que a resposta anterior.)
- as restantes colunas da linha de dados têm =Código.AlternateColor ("AliceBlue"," Branco", False) (esta, também, é a mesma que a resposta anterior.)
- a primeira coluna da linha de agrupamento tem =Codigo.RestartColor ("AliceBlue") (isto é novo.)
- as restantes colunas da linha de agrupamento têm =Código.AlternateColor ("AliceBlue"," Branco", False) (isto foi usado antes, mas nenhuma menção dele para agrupar linha.)
Por favor, sinta-se à vontade para adicionar comentários sobre o que poderia ser feito para melhorar este código: eu sou novo em ambas as SSRS
A resposta do@Aditya é óptima, mas existem casos em que a formatação será desligada se a primeira célula da linha (para a formatação de fundo da linha) tiver um valor em falta (em tabelas complexas com grupos de colunas/linhas e valores em falta).
A solução de @ Aditya alavanca habilmente countDistinct
o resultado da função runningValue
para identificar números de linhas dentro de um grupo tablix (linha). Se tiver linhas de tablix com valor em falta na primeira célula, runningValue
não irá aumentar o resultado countDistinct
e irá retorne o número da linha anterior (e, portanto, afetará a formatação dessa célula). Para explicar isso, você terá que adicionar um termo adicional para compensar o valor countDistinct
. A minha tomada foi verificar o primeiro valor em execução no próprio grupo de linhas (ver a linha 3 do excerto abaixo):
=iif(
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")
Espero que isto ajude.
Tentei todas estas soluções num Tablix agrupado com espaços em linha e nenhum funcionou em todo o relatório. O resultado foi linhas coloridas duplicadas e outras soluções resultaram em colunas alternadas!
Aqui está a função que eu escrevi que funcionou para mim usando uma contagem de colunas:
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 um Tablix de 7 colunas, uso Esta expressão para a Cor Traseira Da Linha (das células):
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
A ideia básica é criar um grupo de crianças e um campo no seu grupo mais íntimo que contenha a cor. Em seguida, defina a cor para cada célula na linha com base no valor desse campo.
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Ao usar os grupos de linha e coluna, ambos, eu tinha um problema em que as cores alternariam entre as colunas, mesmo que fosse a mesma linha. Resolvi isto usando uma variável global que só se altera quando a linha muda:
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
Agora, na primeira coluna da linha que deseja alternar, defina a expressão de cores para:
= Código.AlternateColor ()
-
Nas restantes colunas, coloque-as todas em:
= Código.BGColor
Isto deve fazer com que as cores alternem apenas após a primeira coluna ser desenhada.
Isso pode (sem verificar) melhorar o desempenho, também, uma vez que não precisa fazer um cálculo matemático para cada coluna.