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...

Author: Community, 2008-09-04

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.
 205
Author: Michael Haren, 2009-12-03 04:00:01

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)

Todos os pormenores estão neste artigo

 84
Author: Catch22, 2008-09-17 14:29:35
Tive o efeito de xadrez quando usei a solução do Catch22, porque a minha matriz tem mais do que uma coluna em design. essa expressão funcionou bem para mim.
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
 62
Author: ahmad, 2011-07-21 14:47:17

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.
 20
Author: Michael Eakins, 2015-03-27 17:30:29

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:
  1. a primeira coluna da linha de dados tem = Código.AlternateColor ("AliceBlue"," White", True) (este é o mesmo que a resposta anterior.)
  2. as restantes colunas da linha de dados têm =Código.AlternateColor ("AliceBlue"," Branco", False) (esta, também, é a mesma que a resposta anterior.)
  3. a primeira coluna da linha de agrupamento tem =Código.RestartColor ("AliceBlue") (isto é novo.)
  4. 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.)
Isto funciona comigo. Se você quiser que a linha de agrupamento não seja colorida, ou uma cor diferente, deve ser bastante óbvio a partir disso como mudá-lo em torno. Por favor, sinta-se à vontade para adicionar comentários sobre o que poderia ser feito para melhorar este código: sou novinho em folha tanto para o SSRS quanto para o VB, por isso suspeito que há muito espaço para melhorias, mas a ideia básica parece som (e foi útil para mim) então eu queria jogá-lo para fora aqui.
 16
Author: Beska, 2009-08-03 21:09:46

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

 10
Author: John Saunders, 2015-01-13 04:10:13
A solução do Michael Haren funciona bem para mim. No entanto, eu tenho um aviso dizendo que" Transparente " não é um BackgroundColor válido quando antevisão. Foi encontrada uma correcção rápida de Alterar a cor de base dos elementos de relatório no SSRS . Não usar nada em vez de "transparente"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
 7
Author: nonetaku, 2011-04-06 07:44:38

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:
  1. crie uma nova coluna dentro do RowGroup1. Muda o nome da caixa de texto para algo como RowGroupColor.
  2. Define o valor da caixa de texto do RowGroupColor em

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

  3. Configure a propriedade BackgroundColor de todas as células das suas linhas para

    "=ReportItems!RowGroupColor.Value"

  4. defina a largura da coluna RowGroupColor como 0pt e defina o CanGrow para falso para esconder dos clientes.
Voilà! Isto também resolve muitos dos problemas mencionados neste tópico:
  • 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 ...
 6
Author: Kyle Hale, 2012-12-03 21:27:22

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.
 5
Author: Sarah Vessels, 2009-09-25 15:45:01
Acho que este truque não é discutido aqui. Então aqui está,

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,

  1. 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".
  2. então, no desenho do relatório, para células a colorir em alternativa, usar a expressão de cor de fundo

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

É tudo.

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.

 3
Author: Aditya, 2014-05-16 12:40:36

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")
 2
Author: Matt, 2011-06-05 18:35:18

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:
  1. a primeira coluna da linha de dados tem = Código.AlternateColor ("AliceBlue"," White", True) (este é o mesmo que a resposta anterior.)
  2. as restantes colunas da linha de dados têm =Código.AlternateColor ("AliceBlue"," Branco", False) (esta, também, é a mesma que a resposta anterior.)
  3. a primeira coluna da linha de agrupamento tem =Codigo.RestartColor ("AliceBlue") (isto é novo.)
  4. 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.)
Isto funciona comigo. Se você quiser que a linha de agrupamento não seja colorida, ou uma cor diferente, deve ser bastante óbvio a partir disso como mudá-lo em torno.

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

 1
Author: misha, 2012-03-01 04:12:37

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.
 1
Author: rpyzh, 2014-05-20 19:59:06

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)
 1
Author: Jeremy Thompson, 2015-01-13 04:07:03
Só porque nenhuma das respostas acima parecia funcionar na minha matriz, estou a postar isto aqui:

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

 0
Author: CodeRedick, 2013-11-28 00:41:07
Os meus dados matrix tinham valores em falta, por isso não consegui pôr a solução do ahmad a funcionar, mas esta solução funcionou comigo.

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.

 0
Author: FistOfFury, 2013-12-02 19:57:53
Uma ligeira modificação de outras respostas daqui que funcionaram para mim. Meu grupo tem dois valores para agrupar, então eu fui capaz de colocar ambos no primeiro arg com um + para que ele alternasse corretamente
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
 0
Author: Soy Sauce Johnson, 2016-07-11 22:00:20

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.

 0
Author: nrg, 2016-11-11 23:06:50