Question

Comment ombrer des lignes alternées dans un rapport SQL Server Reporting Services ?


Modifier: Il y a un tas de bonnes réponses répertoriées ci-dessous - de rapide et simple à complexe et complet.Hélas, je ne peux en choisir qu'un...

Était-ce utile?

La solution

Accédez à la propriété BackgroundColor de la ligne du tableau et choisissez "Expression...".

Utilisez cette expression :

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

Cette astuce peut être appliquée à de nombreux domaines du rapport.

Et dans .NET 3.5+, vous pouvez utiliser :

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

Je ne cherche pas de représentant - j'ai juste recherché cette question moi-même et j'ai pensé la partager.

Autres conseils

L'utilisation d'IIF(RowNumber...) peut entraîner certains problèmes lorsque les lignes sont regroupées et une autre alternative consiste à utiliser une simple fonction VBScript pour déterminer la couleur.

C'est un peu plus d'effort mais quand la solution de base ne suffit pas, c'est une belle alternative.

Fondamentalement, vous ajoutez du code au rapport comme suit...

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

Ensuite, sur chaque cellule, définissez BackgroundColor comme suit :

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

Tous les détails sont à ce sujet Article sur Wrox

J'ai eu l'effet d'échecs lorsque j'ai utilisé la solution de Catch22, je pense parce que ma matrice a plus d'une colonne dans sa conception.cette expression a bien fonctionné pour moi :

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

J'ai changé la solution de @Catch22 Un peu car je n'aime pas l'idée de devoir entrer dans chaque champ si je décide de changer l'une des couleurs.Ceci est particulièrement important dans les rapports dans lesquels de nombreux champs nécessiteraient une modification de la variable de couleur.

'*************************************************************************
' -- 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

J'ai remarqué que j'ai changé la fonction de celle qui accepte les couleurs à celle qui contient les couleurs à utiliser.

Puis dans chaque champ ajoutez :

=Code.AlternateColor(rownumber(nothing))

C'est beaucoup plus robuste que de changer manuellement la couleur d'arrière-plan de chaque champ.

Une chose que j'ai remarquée est qu'aucune des deux méthodes principales n'a la moindre idée de la couleur que devrait avoir la première ligne d'un groupe ;le groupe commencera simplement avec la couleur opposée à la dernière ligne du groupe précédent.Je voulais que mes groupes commencent toujours par la même couleur... la première rangée de chaque groupe doit toujours être blanche et la rangée suivante colorée.

Le concept de base était de réinitialiser la bascule au démarrage de chaque groupe, j'ai donc ajouté un peu de code :

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

J'ai donc maintenant trois types différents d'arrière-plans de cellules :

  1. La première colonne de la ligne de données contient =Code.AlternateColor("AliceBlue", "White", True) (C'est la même chose que la réponse précédente.)
  2. Les colonnes restantes de la ligne de données ont =Code.AlternateColor("AliceBlue", "White", False) (C'est également la même chose que la réponse précédente.)
  3. La première colonne de la ligne de regroupement contient =Code.RestartColor("AliceBlue") (C'est nouveau.)
  4. Les colonnes restantes de la ligne de regroupement ont =Code.AlternateColor("AliceBlue", "White", False) (Ceci a été utilisé auparavant, mais aucune mention n'en est faite pour le regroupement de lignes.)

Cela fonctionne pour moi.Si vous souhaitez que la ligne de regroupement ne soit pas colorée ou qu'elle soit d'une couleur différente, il devrait être assez évident de savoir comment la modifier.

N'hésitez pas à ajouter des commentaires sur ce qui pourrait être fait pour améliorer ce code :Je suis tout nouveau sur SSRS et VB, donc je soupçonne fortement qu'il y a beaucoup de place à l'amélioration, mais l'idée de base semble bonne (et elle m'a été utile), donc je voulais la lancer ici.

pour les en-têtes/pieds de page de groupe :

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

Vous pouvez également l'utiliser pour « réinitialiser » le nombre de couleurs de ligne au sein de chaque groupe.Je voulais que la première ligne de détail de chaque sous-groupe commence par Blanc et cette solution (lorsqu'elle est utilisée sur la ligne de détail) a permis que cela se produise :

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

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

La solution de Michael Haren fonctionne bien pour moi.Cependant, j'ai reçu un avertissement indiquant que "Transparent" n'est pas une couleur d'arrière-plan valide lors de l'aperçu.J'ai trouvé une solution rapide à partir deDéfinition de la couleur d'arrière-plan des éléments du rapport dans SSRS.Utilisez Rien au lieu de "Transparent"

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

Le seul moyen efficace de résoudre ce problème sans utiliser VB est de "stocker" la valeur modulo du regroupement de lignes dans le groupement de lignes (et en dehors du groupement de colonnes) et de la référencer explicitement dans votre groupement de colonnes.J'ai trouvé cette solution sur

http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html

Mais Ankeet ne fait pas le meilleur travail pour expliquer ce qui se passe, et sa solution recommande l'étape inutile de création d'un groupe sur une valeur constante, voici donc mon processus étape par étape pour une matrice avec un groupe de lignes unique RowGroup1 :

  1. Créez une nouvelle colonne dans RowGroup1.Renommez la zone de texte correspondante en quelque chose comme RowGroupColor.
  2. Définissez la valeur de la zone de texte de RowGroupColor sur

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

  3. Définissez la propriété BackgroundColor de toutes vos cellules de ligne sur

    "=ReportItems!RowGroupColor.Value"

  4. Définissez la largeur de la colonne RowGroupColor sur 0pt et définissez CANGROW sur FAUX pour le masquer aux clients.

Voilà !Cela résout également beaucoup des problèmes mentionnés dans ce fil :

  • Réinitialisations automatiques pour les sous-groupes :Ajoutez simplement une nouvelle colonne pour ce groupe de lignes, en effectuant un Valeur en cours sur c'est valeurs du groupe.
  • Pas besoin de vous soucier des bascules Vrai/Faux.
  • Les couleurs ne sont conservées qu’au même endroit pour une modification facile.
  • Peut être utilisé de manière interchangeable sur des groupes de lignes ou de colonnes (il suffit de définir la hauteur sur 0 au lieu de la largeur)

Ce serait génial si SSRS exposait des propriétés autres que Value sur les zones de texte.Vous pouvez simplement insérer ce type de calcul dans une propriété BackgroundColor des zones de texte du groupe de lignes, puis le référencer en tant que ReportItems!RowGroup.BackgroundColor dans toutes les autres cellules.

Ahh ben on peut rêver...

Mon problème était que je voulais que toutes les colonnes d'une rangée aient le même arrière-plan.J'ai regroupé à la fois par ligne et par colonne, et avec les deux premières solutions ici, j'ai obtenu tous les lignes de la colonne 1 avec un fond coloré, toutes les lignes de la colonne 2 avec un fond blanc, toutes les lignes de la colonne 3 avec un fond coloré, et ainsi de suite.C'est comme si RowNumber et bOddRow (de la solution de Catch22) faites attention à mon groupe de colonnes au lieu de l'ignorer et d'alterner uniquement avec une nouvelle ligne.

Ce que je voulais, c'est pour tout le Colonnes dans la ligne 1 pour avoir un fond blanc, puis toutes les colonnes de la ligne 2 pour avoir un fond coloré, puis toutes les colonnes de la ligne 3 pour avoir un fond blanc, et ainsi de suite.J'ai obtenu cet effet en utilisant la réponse sélectionnée mais au lieu de passer Nothing à RowNumber, j'ai transmis le nom de mon groupe de colonnes, par ex.

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

J'ai pensé que cela pourrait être utile à quelqu'un d'autre.

Je pense que cette astuce n'est pas abordée ici.Alors voilà,

Dans tout type de matrice complexe, lorsque vous voulez des couleurs de cellules alternatives, sage ou colonne, la solution de travail est,

Si vous souhaitez une autre couleur de cellules par colonne, alors

  1. Dans le coin inférieur droit d'une vue de conception de rapport, dans "Column Groups", créez un faux groupe parent sur 1 (en utilisant l'expression), nommé "FakeParentGroup".
  2. Ensuite, dans la conception du rapport, pour les cellules qui sont colorées alternativement, utilisez l'expression de la couleur d'arrière-plan suivant

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

C'est tout.

Idem pour la ligne de couleur alternative, il vous suffit de modifier la solution en conséquence.

NOTE:Ici, vous devez parfois définir la bordure des cellules en conséquence, généralement elle disparaît.

N'oubliez pas non plus de supprimer la valeur 1 dans le rapport qui est entré dans la photo lorsque vous avez créé un faux groupe parent.

Si pour l'ensemble du rapport vous avez besoin d'une couleur alternée, vous pouvez utiliser le DataSet auquel votre tableau est lié pour un numéro de ligne d'identité à l'échelle du rapport sur le rapport et l'utiliser dans la fonction RowNumber...

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

La réponse de @Aditya est excellente, mais il existe des cas où le formatage sera annulé si la toute première cellule de la ligne (pour le formatage de l'arrière-plan de la ligne) a une valeur manquante (dans des tableaux complexes avec des groupes de colonnes/lignes et des valeurs manquantes).

La solution de @Aditya exploite intelligemment countDistinct résultat de runningValue fonction pour identifier les numéros de ligne dans un groupe de tableau (ligne).Si vous avez des lignes de tableau avec une valeur manquante dans la première cellule, runningValue n'augmentera pas countDistinct résultat et il renverra le numéro de la ligne précédente (et, par conséquent, affectera le formatage de cette cellule).Pour en tenir compte, vous devrez ajouter un terme supplémentaire pour compenser le countDistinct valeur.Mon objectif était de vérifier la première valeur courante dans le groupe de lignes lui-même (voir la ligne 3 de l'extrait ci-dessous) :

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

J'espère que cela t'aides.

Quelqu'un pourrait-il expliquer la logique derrière la transformation du reste des champs en faux dans le code ci-dessous (à partir du message ci-dessus)

Une chose que j'ai remarquée est qu'aucune des deux méthodes principales n'a la moindre idée de la couleur que devrait avoir la première ligne d'un groupe ;le groupe commencera simplement avec la couleur opposée à la dernière ligne du groupe précédent.Je voulais que mes groupes commencent toujours par la même couleur... la première rangée de chaque groupe doit toujours être blanche et la rangée suivante colorée.

Le concept de base était de réinitialiser la bascule au démarrage de chaque groupe, j'ai donc ajouté un peu de code :

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

J'ai donc maintenant trois types différents d'arrière-plans de cellules :

  1. La première colonne de la ligne de données contient =Code.AlternateColor("AliceBlue", "White", True) (C'est la même chose que la réponse précédente.)
  2. Les colonnes restantes de la ligne de données ont =Code.AlternateColor("AliceBlue", "White", False) (C'est également la même chose que la réponse précédente.)
  3. La première colonne de la ligne de regroupement contient =Code.RestartColor("AliceBlue") (C'est nouveau.)
  4. Les colonnes restantes de la ligne de regroupement ont =Code.AlternateColor("AliceBlue", "White", False) (Ceci a été utilisé auparavant, mais aucune mention n'en est faite pour le regroupement de lignes.)

Cela fonctionne pour moi.Si vous souhaitez que la ligne de regroupement ne soit pas colorée ou qu'elle soit d'une couleur différente, il devrait être assez évident de savoir comment la modifier.

N'hésitez pas à ajouter des commentaires sur ce qui pourrait être fait pour améliorer ce code :Je suis tout nouveau sur SSRS et VB, donc je soupçonne fortement qu'il y a beaucoup de place à l'amélioration, mais l'idée de base semble bonne (et elle m'a été utile), donc je voulais la lancer ici.

J'ai essayé toutes ces solutions sur un tableau matriciel groupé avec des espaces de ligne et aucune n'a fonctionné dans l'ensemble du rapport.Le résultat était des lignes colorées en double et d'autres solutions aboutissaient à des colonnes alternées !

Voici la fonction que j'ai écrite et qui a fonctionné pour moi en utilisant un nombre de colonnes :

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

Pour un tableau à 7 colonnes, j'utilise cette expression pour la couleur de fond des lignes (de cellules) :

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

Juste parce qu'aucune des réponses ci-dessus ne semble fonctionner dans ma matrice, je poste ceci ici :

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

Mes données matricielles contenaient des valeurs manquantes, je n'ai donc pas pu faire fonctionner la solution d'Ahmad, mais cette solution a fonctionné pour moi

L'idée de base est de créer un groupe enfant et un champ sur votre groupe le plus interne contenant la couleur.Définissez ensuite la couleur de chaque cellule de la ligne en fonction de la valeur de ce champ.

Légère modification d'autres réponses d'ici qui ont fonctionné pour moi.Mon groupe a deux valeurs sur lesquelles regrouper, j'ai donc pu les mettre toutes les deux dans le premier argument avec un + pour qu'il alterne correctement

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

Lors de l'utilisation de groupes de lignes et de colonnes, j'avais un problème où les couleurs alternaient entre les colonnes même s'il s'agissait de la même ligne.J'ai résolu ce problème en utilisant une variable globale qui alterne uniquement lorsque la ligne change :

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

Maintenant, dans le d'abord colonne de la ligne que vous souhaitez alterner, définissez l'expression de couleur sur :

=Code.AlternateColor()

-

Dans les colonnes restantes, définissez-les toutes sur :

=Code.BGColor

Cela devrait faire alterner les couleurs seulement après le dessin de la première colonne.

Cela peut également (de manière non vérifiable) améliorer les performances, car il n'est pas nécessaire d'effectuer un calcul mathématique pour chaque colonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top