Comment ombrer les lignes alternées dans un rapport SQL Server Reporting Services?
Edit: Il y a un tas de bonnes réponses énumérées ci-dessous - de rapide et simple à complexe et complet . Hélas, je ne peux en choisir qu'un ...
Comment ombrer les lignes alternées dans un rapport SQL Server Reporting Services?
Edit: Il y a un tas de bonnes réponses énumérées ci-dessous - de rapide et simple à complexe et complet . Hélas, je ne peux en choisir qu'un ...
Réponses:
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 nombreuses zones 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é partager.
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
Il semble que l'expression correcte serait =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Merci pour le tuyau, cependant.
L'utilisation de IIF (RowNumber ...) peut entraîner des problèmes lorsque les lignes sont groupé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 le BackgroundColor comme suit:
=Code.AlternateColor("AliceBlue", "White", True)
Tous les détails sont sur cet article de Wrox
J'ai eu l'effet d'échecs lorsque j'ai utilisé la solution de Catch22, je pense que ma matrice a plus d'une colonne en 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 que je veux 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
Remarqué que j'ai changé la fonction de celle qui accepte les couleurs à celle qui contient les couleurs à utiliser.
Ensuite, dans chaque champ, ajoutez:
=Code.AlternateColor(rownumber(nothing))
C'est beaucoup plus robuste que de changer manuellement la couleur de 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 de la première ligne dans 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 ligne de chaque groupe devrait toujours être blanche et la ligne suivante colorée.
Le concept de base était de réinitialiser la bascule lorsque chaque groupe démarre, 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 trois types différents d'arrière-plans de cellules maintenant:
Cela fonctionne pour moi. Si vous voulez que la ligne de regroupement soit non colorée ou d'une couleur différente, il devrait être assez évident de la changer.
N'hésitez pas à ajouter des commentaires sur ce qui pourrait être fait pour améliorer ce code: je suis tout nouveau à la fois dans SSRS et VB, donc je soupçonne fortement qu'il y a beaucoup de place pour l'amélioration, mais l'idée de base semble bonne (et c'était utile pour moi) alors je voulais le jeter 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 dans chaque groupe. Je voulais que la première ligne de détail de chaque sous-groupe commence par White 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 très bien pour moi. Cependant, j'ai reçu un avertissement disant que "Transparent" n'est pas un BackgroundColor valide lors de la prévisualisation. Nous avons trouvé une solution rapide à partir de la définition de BackgroundColor des éléments de rapport dans SSRS . N'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 du module de groupement de lignes dans le groupement de lignes (et en dehors du groupement de colonnes) et de la référencer explicitement dans ton groupement de colonnes. J'ai trouvé cette solution à
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Mais Ankeet n'est pas le meilleur travail pour expliquer ce qui se passe, et sa solution recommande l'étape inutile de créer un regroupement sur une valeur constante, alors voici mon processus étape par étape pour une matrice avec un seul groupe de lignes RowGroup1:
Définissez la valeur de la zone de texte de RowGroupColor sur
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Définissez la propriété BackgroundColor de toutes vos cellules de ligne sur
"=ReportItems!RowGroupColor.Value"
Voila! Cela résout également de nombreux problèmes mentionnés dans ce fil:
Ce serait génial si SSRS exposait des propriétés en plus de Value sur les zones de texte. Vous pouvez simplement remplir ce type de calcul dans une propriété BackgroundColor des zones de texte du groupe de lignes, puis le référencer comme ReportItems! RowGroup.BackgroundColor dans toutes les autres cellules.
Ahh bien, on peut rêver ...
Mon problème était que je voulais que toutes les colonnes d'affilé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 toutes 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é , etc. C'est comme si RowNumber
etbOddRow
(de la solution de Catch22) faites attention à mon groupe de colonnes au lieu d'ignorer cela et d'alterner uniquement avec une nouvelle ligne.
Ce que je voulais, c'est que toutes les colonnes de la ligne 1 aient un fond blanc, puis toutes les colonnes de la ligne 2 aient un fond coloré, puis toutes les colonnes de la ligne 3 aient 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 passé le nom de mon groupe de colonnes, par exemple
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
J'ai pensé que cela pourrait être utile à quelqu'un d'autre.
Dans tout type de matrice complexe, lorsque vous voulez des couleurs de cellule alternatives, soit par ligne, soit par colonne, la solution de travail est la suivante:
Si vous voulez une couleur alternative de cellules, alors,
= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
C'est tout.
Idem pour la ligne de couleur alternative, il vous suffit de modifier la solution en conséquence.
REMARQUE: 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ée en photo lorsque vous avez créé un faux groupe parent.
Si, pour l'ensemble du rapport, vous avez besoin d'une couleur alternative, vous pouvez utiliser le DataSet auquel votre tableau matriciel 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 y a des cas où la mise en forme sera rejetée si la toute première cellule de la ligne (pour la mise en forme de l'arrière-plan de la ligne) a une valeur manquante (dans les tableaux complexes avec des groupes de colonnes / lignes et des valeurs manquantes).
La solution de @ Aditya exploite intelligemment le countDistinct
résultat de la runningValue
fonction pour identifier les numéros de ligne dans un groupe de tableaux matriciels (lignes). Si vous avez des lignes de tableau matriciel avec une valeur manquante dans la première cellule, runningValue
n'incrémentera pas le countDistinct
résultat et renverra le numéro de la ligne précédente (et, par conséquent, affectera la mise en forme de cette cellule). Pour tenir compte de cela, vous devrez ajouter un terme supplémentaire pour compenser la countDistinct
valeur. Ma prise é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 post 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 de la première ligne dans 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 ligne de chaque groupe doit toujours être blanche et la ligne suivante colorée.
Le concept de base était de réinitialiser la bascule lorsque chaque groupe démarre, 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 trois types différents d'arrière-plans de cellules maintenant:
Cela fonctionne pour moi. Si vous voulez que la ligne de regroupement soit non colorée ou d'une couleur différente, il devrait être assez évident de la changer.
N'hésitez pas à ajouter des commentaires sur ce qui pourrait être fait pour améliorer ce code: je suis tout nouveau à la fois dans SSRS et VB, donc je soupçonne fortement qu'il y a beaucoup de place pour l'amélioration, mais l'idée de base semble bonne (et c'était utile pour moi) alors je voulais le jeter ici.
J'ai essayé toutes ces solutions sur un tableau matriciel groupé avec des espaces de ligne et aucune n'a fonctionné dans tout le rapport. Le résultat était des lignes colorées en double et d'autres solutions ont donné lieu à des colonnes alternées!
Voici la fonction que j'ai écrite 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 Backcolour de ligne (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 des autres réponses d'ici qui ont fonctionné pour moi. Mon groupe a deux valeurs sur lesquelles regrouper, donc j'ai pu simplement 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 des deux groupes de lignes et de colonnes, j'ai eu 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 cela 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 la première 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 de faire un calcul mathématique pour chaque colonne.