Pergunta

Como sombra alternando linhas em um relatório SQL Server Reporting Services?


Editar: Há um monte de boas respostas listadas abaixo-a partir de rápida e simples para complexo e abrangente.Infelizmente, eu posso escolher apenas um...

Foi útil?

Solução

Vá para a linha da tabela da propriedade BackgroundColor e escolher "Expressão..."

Usar esta expressão:

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Este truque pode ser aplicada a muitas áreas do relatório.

E em .NET 3.5+, Você poderá usar:

= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Não olhando para rep-eu só pesquisei esta pergunta a mim mesmo e pensei que eu iria partilhar.

Outras dicas

Usando IIF(RowNumber...) pode levar a alguns problemas quando as linhas estão sendo agrupados e outra alternativa é a utilização de uma simples função de VBScript para determinar a cor.

É um pouco mais de esforço, mas quando a solução básica não é suficiente, é uma boa alternativa.

Basicamente, você pode adicionar código para o 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 da seguinte forma:

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

Todos os detalhes estão neste Wrox artigo

Eu tenho o xadrez efeito de quando eu costumava Catch22 solução, eu acho, porque a minha matriz tiver mais de uma coluna no design.que expressão funcionou bem para mim :

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

Eu mudei @Catch22 a solução de Um pouco como eu não gosto da idéia de ter que ir em cada campo, se eu decidir que eu precisava para mudar de cores.Isso é especialmente importante em relatórios onde são numerosos campos de que teria de ter a cor variável alterada.

'*************************************************************************
' -- 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 eu tenho de alterar a função de um outro que aceita as cores para um que contém as cores a serem utilizadas.

Em seguida, em cada campo de adicionar:

=Code.AlternateColor(rownumber(nothing))

Isso é muito mais robusto do que alterar manualmente a cor em cada um dos campos cor de plano de fundo.

Uma coisa que eu notei é que nenhum dos dois métodos têm qualquer noção de qual a cor a primeira linha deve estar em um grupo;o grupo vai começar com a cor oposta a partir da última linha do que o grupo anterior.Eu queria que a minha grupos para que se inicie 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 foi para redefinir a alternância, em que cada grupo começa, então eu 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 diferentes tipos de planos de fundo da célula agora:

  1. Primeira coluna da linha de dados tem =Código.AlternateColor("AliceBlue", "Branco", True) (Este é o mesmo da resposta anterior.)
  2. Colunas restantes da linha de dados tem =Código.AlternateColor("AliceBlue", "Branco", False) (Este, também, é a mesma resposta anterior.)
  3. Primeira coluna de agrupamento linha tem =Código.RestartColor("AliceBlue") (Esta é nova.)
  4. Restantes colunas de agrupamento de linha têm =Código.AlternateColor("AliceBlue", "Branco", False) (Este foi usado antes, mas não há menção de que para o agrupamento de linha).

Isso funciona para mim.Se você deseja que o agrupamento de linha a ser não colorido ou uma cor diferente, ele deve ser bastante óbvio que este como alterá-la aí.

Por favor, sinta-se livre para adicionar comentários sobre o que poderia ser feito para melhorar este código:Eu sou novo para o SSRS e VB, então não posso deixar de suspeitar de que existe muito espaço para melhorias, mas a idéia básica parece o som (e que foi útil para mim) então, eu queria jogá-lo fora aqui.

para o grupo de cabeçalhos/rodapés:

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

Você também pode usar isso para "repor" a linha cor de contagem dentro de cada grupo.Eu queria que a primeira linha de detalhes em cada sub-grupo para começar Branco e esta solução (quando usado na linha de detalhes) permitiu que isso acontecesse:

=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")

Veja: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx

Michael Haren, a solução funciona bem para mim.No entanto, eu tenho um aviso dizendo que "Transparente" não é válido BackgroundColor quando pré-Visualizar.Encontrei uma rápida correcção de Definição BackgroundColor de elementos de Relatório do SSRS.Usar Nada, em vez de "Transparente"

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)

A única forma eficaz de resolver isso sem usar o VB é para "armazenar" a linha agrupamento modulo valor dentro da linha de agrupamento (e fora da coluna de agrupamento) e a referência explícita dentro de sua coluna de agrupamento.Eu encontrei esta solução, no

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 desnecessária a passo da criação de um agrupamento em um valor constante, então aqui está o meu passo-a-passo, para uma matriz com uma única linha, grupo RowGroup1:

  1. Criar uma nova coluna no RowGroup1.Mudar o nome de caixa de texto para que este algo como RowGroupColor.
  2. Defina o Valor de RowGroupColor da caixa de texto para

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

  3. Defina a propriedade BackgroundColor de toda a sua linha de células para

    "=ReportItems!RowGroupColor.Value"

  4. Defina a largura do RowGroupColor coluna para 0pt e definir Ampliável para false para escondê-la dos clientes.

Voila!Isso também resolve um monte de problemas mencionados neste segmento:

  • Automático redefine para os subgrupos:Basta adicionar uma nova coluna para que rowgroup, a realização de uma RunningValue no o seu os valores do grupo.
  • Não há necessidade de se preocupar com True/False alterna.
  • Cores apenas realizada em um local de fácil modificação.
  • Pode ser usado de forma intercambiável em linhas ou grupos de colunas (apenas definir a altura de 0 em vez de largura)

Seria incrível se SSRS iria expor propriedades, além de Valor em caixas de Texto.Você poderia apenas coisas que esse tipo de cálculo em uma propriedade BackgroundColor do grupo de linhas, caixas de texto e, em seguida, fazer referência a ela como ReportItems!RowGroup.BackgroundColor em todas as outras células.

Ahh bem, podemos sonhar ...

Meu problema era que eu queria que todas as colunas em uma fila para ter o mesmo plano de fundo.Eu agrupadas tanto por linha e por coluna, e com os dois melhores soluções aqui eu tenho todos as linhas na coluna 1 com um plano de fundo colorido, todas as linhas na coluna 2, com um plano de fundo branco, todas as linhas na coluna 3 com um plano de fundo colorido, e assim por diante.É como se RowNumber e bOddRow (de Catch22 da solução) prestar atenção à minha coluna de grupo, em vez de ignorar, e alternando-se com uma nova linha.

O que eu queria é para todos os colunas na linha 1 temos um plano de fundo branco e, em seguida, todas as colunas na linha 2 para ter um plano de fundo colorido e, em seguida, todas as colunas na linha 3 para ter um plano de fundo branco, e assim por diante.Eu tenho esse efeito usando a resposta selecionada, mas em vez de passar Nothing para RowNumber, Eu passei o nome da minha coluna de grupo, por exemplo,

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

Pensei que isso poderia ser útil para alguém.

Eu acho que este truque não é discutido aqui.Então aqui está,

Em qualquer tipo de matriz complexa, quando você quiser alternativo cores de células, cada linha sábio ou coluna sábio, a solução de trabalho é,

Se você quer uma cor alternativa de células coloumn sábio em seguida,

  1. No canto direito inferior da exibição de design de relatório, na Coluna " Grupos", criar um falso pai grupo 1 (com expressão), denominado "FakeParentGroup".
  2. Em seguida, no design do relatório, para as células que para ser colorido como alternativa, use o seguinte a cor de plano de fundo de expressão

=IIF(RunningValue( Campos![ColumnGroupField].Valor, countDistinct, "FakeParentGroup" ) MOD 2, "Branco", "LightGrey")

Isso é tudo.

Mesmo para o suplente de cor de linha sábio, só você tem que editar a solução de acordo.

NOTA:Aqui, às vezes, você precisa definir limite de células assim, geralmente ela desaparece.

Também não se esqueça de excluir o valor 1 no relatório que veio a pic quando você criou falso grupo de pais.

Se para todo o relatório que você precisa de uma alternância de cores, você pode usar o conjunto de dados do Tablix é vinculado a um relatório-grande identidade rownumber sobre o relatório e use-o na função RowNumber...

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

@Aditya, a resposta é grande, mas há casos em que a formatação vai ser jogado fora se a primeira célula da linha (linha formatação de plano de fundo) tem um valor em falta (no complexo tablixes com colunas/linhas e grupos de valores em falta).

@Aditya solução inteligente aproveita countDistinct resultado runningValue função de identificar os números de linha dentro de um tablix (linha) de grupo.Se você tem tablix linhas com valor ausente na primeira célula, runningValue não será incrementado countDistinct resultado e ele irá retornar a linha anterior do número (e, portanto, irá afectar a formatação da célula).A conta, para isso, você terá que adicionar um termo adicional para compensar o countDistinct o valor.Na minha opinião, foi o de verificar o primeiro valor em execução na linha próprio grupo (ver linha 3 do trecho abaixo):

=iif(
    (RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
    + iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
    ) mod 2, "White", "LightGrey")

Espero que isso ajude.

Alguém poderia explicar a lógica por trás de viragem resto dos campos para false no código abaixo (a partir do post acima)

Uma coisa que eu notei é que nenhum dos dois métodos têm qualquer noção de qual a cor a primeira linha deve estar em um grupo;o grupo vai começar com a cor oposta a partir da última linha do que o grupo anterior.Eu queria que a minha grupos para que se inicie 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 foi para redefinir a alternância, em que cada grupo começa, então eu 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 diferentes tipos de planos de fundo da célula agora:

  1. Primeira coluna da linha de dados tem =Código.AlternateColor("AliceBlue", "Branco", True) (Este é o mesmo da resposta anterior.)
  2. Colunas restantes da linha de dados tem =Código.AlternateColor("AliceBlue", "Branco", False) (Este, também, é a mesma resposta anterior.)
  3. Primeira coluna de agrupamento linha tem =Código.RestartColor("AliceBlue") (Esta é nova.)
  4. Restantes colunas de agrupamento de linha têm =Código.AlternateColor("AliceBlue", "Branco", False) (Este foi usado antes, mas não há menção de que para o agrupamento de linha).

Isso funciona para mim.Se você deseja que o agrupamento de linha a ser não colorido ou uma cor diferente, ele deve ser bastante óbvio que este como alterá-la aí.

Por favor, sinta-se livre para adicionar comentários sobre o que poderia ser feito para melhorar este código:Eu sou novo para o SSRS e VB, então não posso deixar de suspeitar de que existe muito espaço para melhorias, mas a idéia básica parece o som (e que foi útil para mim) então, eu queria jogá-lo fora aqui.

Eu tentei de todas estas soluções, em um Agrupados Tablix com linha espaços e nenhum funcionou em todo o relatório.O resultado foi duplicado linhas coloridas e outras soluções resultou em colunas alternadas!

Aqui é a função que eu escrevi que trabalhou para mim, usando um número 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 7 de Colunas Tablix eu uso esta expressão para a Linha (das Células) Backcolour:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)

Só porque nenhuma das respostas acima parecia funcionar na minha matriz, estou postando isso aqui:

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

A minha matriz de dados de valores em falta, para que eu não era capaz de obter ahmad solução para o trabalho, mas esta solução funcionou para mim

A idéia básica é criar um grupo de subordinados e de campo sobre o seu grupo interno que contém a cor.Em seguida, defina a cor para cada célula na linha com base no valor do campo.

Ligeira modificação de outras respostas aqui que funcionou para mim.O meu grupo tem dois valores para o grupo, então eu era capaz de só colocá-los tanto no primeiro arg com um + para chegar a alternativa corretamente

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")

Ao usar grupos de linhas e colunas de ambos, eu tinha um problema onde as cores seria alternar entre as colunas, mesmo que fosse a mesma linha.Resolvi isso usando uma variável global que alterna apenas quando as alterações de linha:

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, no primeira coluna da linha que você deseja alternativa, defina a cor de expressão para:

=Código.AlternateColor()

-

Nas restantes colunas, defina-a todos para:

=Código.BGColor

Isso deve fazer as cores se alternam somente após a primeira coluna é desenhada.

Isso pode (unverifiably) melhorar o desempenho, também, desde que ele não precisa fazer uma matemática computação para cada coluna.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top