Come si ombreggiano le righe alternate in un report di SQL Server Reporting Services?
Edit: Ci sono un sacco di buone risposte di seguito elencati - da rapido e semplice al complesso e completo . Ahimè, posso sceglierne solo uno ...
Come si ombreggiano le righe alternate in un report di SQL Server Reporting Services?
Edit: Ci sono un sacco di buone risposte di seguito elencati - da rapido e semplice al complesso e completo . Ahimè, posso sceglierne solo uno ...
Risposte:
Vai alla proprietà BackgroundColor della riga della tabella e scegli "Espressione ..."
Usa questa espressione:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Questo trucco può essere applicato a molte aree del report.
E in .NET 3.5+ è possibile utilizzare:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Non cerco rappresentante - ho appena cercato questa domanda da solo e ho pensato di condividere.
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
Sembra che sarebbe l'espressione corretta =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Grazie per la punta, però.
L'uso di IIF (RowNumber ...) può causare alcuni problemi quando le righe vengono raggruppate e un'altra alternativa è quella di utilizzare una semplice funzione VBScript per determinare il colore.
È un po 'più di sforzo, ma quando la soluzione di base non è sufficiente, è una buona alternativa.
Fondamentalmente, aggiungi il codice al rapporto come segue ...
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
Quindi su ogni cella, imposta BackgroundColor come segue:
=Code.AlternateColor("AliceBlue", "White", True)
I dettagli completi sono su questo articolo di Wrox
Ho avuto l'effetto scacchi quando ho usato la soluzione di Catch22, penso perché la mia matrice ha più di una colonna nel design. quell'espressione ha funzionato bene per me:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Ho cambiato la soluzione di @ Catch22 Un po 'perché non mi piace l'idea di dover andare in ogni campo se decido di cambiare uno dei colori. Ciò è particolarmente importante nei report in cui sono presenti numerosi campi che richiedono la modifica della variabile colore.
'*************************************************************************
' -- 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
Ho notato che ho cambiato la funzione da una che accetta i colori a una che contiene i colori da usare.
Quindi in ogni campo aggiungere:
=Code.AlternateColor(rownumber(nothing))
Ciò è molto più robusto rispetto alla modifica manuale del colore nel colore di sfondo di ciascun campo.
Una cosa che ho notato è che nessuno dei due metodi principali ha idea di quale colore dovrebbe essere la prima riga in un gruppo; il gruppo inizierà con il colore opposto rispetto all'ultima riga del gruppo precedente. Volevo che i miei gruppi iniziassero sempre con lo stesso colore ... la prima riga di ogni gruppo dovrebbe essere sempre bianca e la riga successiva colorata.
Il concetto di base era reimpostare la levetta all'avvio di ciascun gruppo, quindi ho aggiunto un po 'di codice:
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
Quindi ora ho tre diversi tipi di sfondi di celle:
Questo funziona per me. Se vuoi che la riga di raggruppamento non sia colorata o di un colore diverso, dovrebbe essere abbastanza ovvio da questo come cambiarla.
Non esitate a aggiungere commenti su ciò che potrebbe essere fatto per migliorare questo codice: sono nuovo di zecca sia per SSRS che per VB, quindi sospetto fortemente che ci sia un ampio margine di miglioramento, ma l'idea di base sembra valida (ed è stata utile per me) quindi volevo buttarlo qui.
per intestazioni / piè di pagina di gruppo:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
Puoi anche usarlo per "resettare" il conteggio dei colori delle righe all'interno di ciascun gruppo. Volevo che la prima riga di dettaglio in ciascun sottogruppo iniziasse con White e questa soluzione (se utilizzata nella riga di dettaglio) ha permesso che ciò accadesse:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
Vedi: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
La soluzione di Michael Haren funziona bene per me. Tuttavia ho ricevuto un avviso che diceva che "Trasparente" non è un BackgroundColor valido durante l'anteprima. È stata trovata una soluzione rapida dall'impostazione di BackgroundColor degli elementi del report in SSRS . Non utilizzare nulla anziché "Trasparente"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
L'unico modo efficace per risolverlo senza usare VB è "memorizzare" il valore del modulo di raggruppamento di righe all'interno del raggruppamento di righe (e all'esterno del raggruppamento di colonne) e fare riferimento esplicitamente all'interno del raggruppamento di colonne. Ho trovato questa soluzione a
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Ma Ankeet non ha il compito migliore di spiegare cosa sta succedendo e la sua soluzione raccomanda il passaggio non necessario della creazione di un raggruppamento su un valore costante, quindi ecco il mio processo passo-passo per una matrice con un singolo gruppo di righe RowGroup1:
Impostare il valore della casella di testo di RowGroupColor su
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Impostare la proprietà BackgroundColor di tutte le celle della riga su
"=ReportItems!RowGroupColor.Value"
Ecco! Questo risolve anche molti dei problemi menzionati in questo thread:
Sarebbe fantastico se SSRS esponesse proprietà oltre a Valore nelle caselle di testo. Potresti semplicemente inserire questo tipo di calcolo in una proprietà BackgroundColor delle caselle di testo del gruppo di righe e quindi fare riferimento a ReportItems! RowGroup.BackgroundColor in tutte le altre celle.
Ahh bene, possiamo sognare ...
Il mio problema era che volevo che tutte le colonne di fila avessero lo stesso sfondo. Ho raggruppato sia per riga che per colonna e con le prime due soluzioni qui ho ottenuto tutte le righe nella colonna 1 con uno sfondo colorato, tutte le righe nella colonna 2 con uno sfondo bianco, tutte le righe nella colonna 3 con uno sfondo colorato , e così via. È come se RowNumber
e bOddRow
(della soluzione di Catch22) presta attenzione al mio gruppo di colonne invece di ignorarlo e alternare solo con una nuova riga.
Quello che volevo è che tutte le colonne della riga 1 avessero uno sfondo bianco, quindi tutte le colonne della riga 2 avessero uno sfondo colorato, quindi tutte le colonne della riga 3 avessero uno sfondo bianco e così via. Ho ottenuto questo effetto usando la risposta selezionata ma invece di passare Nothing
a RowNumber
, ho passato il nome del mio gruppo di colonne, ad es
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Ho pensato che potesse essere utile a qualcun altro.
In qualsiasi tipo di matrice complessa, quando desideri colori di celle alternati, riga o colonna, la soluzione di lavoro è,
Se vuoi un colore alternato di celle a colori, allora,
= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
È tutto.
Lo stesso vale per la riga di colori alternativa, basta modificare la soluzione di conseguenza.
NOTA: qui, a volte è necessario impostare il bordo delle celle di conseguenza, di solito svanisce.
Inoltre, non dimenticare di eliminare il valore 1 nel rapporto che è entrato in foto quando hai creato un gruppo genitore falso.
La risposta di @ Aditya è ottima, ma ci sono casi in cui la formattazione verrà scartata se la prima cella della riga (per la formattazione dello sfondo delle righe) ha un valore mancante (in tablix complesse con gruppi di colonne / righe e valori mancanti).
La soluzione di @ Aditya sfrutta abilmente il countDistinct
risultato della runningValue
funzione per identificare i numeri di riga all'interno di un gruppo tablix (riga). Se hai righe Tablix con valore mancante nella prima cella, runningValue
non aumenterà il countDistinct
risultato e restituirà il numero della riga precedente (e, quindi, influenzerà la formattazione di quella cella). Per tener conto di ciò, dovrai aggiungere un termine aggiuntivo per compensare il countDistinct
valore. Il mio intento era quello di verificare il primo valore corrente nel gruppo di righe stesso (vedere la riga 3 dello snippet di seguito):
=iif(
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")
Spero che questo ti aiuti.
Qualcuno potrebbe spiegare la logica dietro la trasformazione del resto dei campi su false nel codice sottostante (dal post sopra)
Una cosa che ho notato è che nessuno dei due metodi principali ha alcuna idea di quale colore dovrebbe essere la prima riga in un gruppo; il gruppo inizierà con il colore opposto rispetto all'ultima riga del gruppo precedente. Volevo che i miei gruppi iniziassero sempre con lo stesso colore ... la prima riga di ogni gruppo dovrebbe essere sempre bianca e la riga successiva colorata.
Il concetto di base era reimpostare la levetta all'avvio di ciascun gruppo, quindi ho aggiunto un po 'di codice:
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
Quindi ora ho tre diversi tipi di sfondi di celle:
Questo funziona per me. Se vuoi che la riga di raggruppamento non sia colorata o di un colore diverso, dovrebbe essere abbastanza ovvio da questo come cambiarla.
Non esitate a aggiungere commenti su ciò che potrebbe essere fatto per migliorare questo codice: sono nuovo di zecca sia per SSRS che per VB, quindi sospetto fortemente che ci sia un ampio margine di miglioramento, ma l'idea di base sembra valida (ed è stata utile per me) quindi volevo buttarlo qui.
Ho provato tutte queste soluzioni su un Tablix raggruppato con spazi di riga e nessuno ha funzionato nell'intero rapporto. Il risultato è stato una duplicazione di righe colorate e altre soluzioni hanno prodotto colonne alternate!
Ecco la funzione che ho scritto che ha funzionato per me usando un conteggio di colonne:
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
Per una Tablix a 7 colonne uso questa espressione per Backcolour Row (of Cells):
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Solo perché nessuna delle risposte sopra sembra funzionare nella mia matrice, sto pubblicando questo qui:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
I dati della mia matrice contenevano valori mancanti, quindi non ero in grado di far funzionare la soluzione di ahmad, ma questa soluzione ha funzionato per me
L'idea di base è quella di creare un gruppo figlio e un campo nel gruppo più interno contenente il colore. Quindi imposta il colore per ogni cella della riga in base al valore di quel campo.
Leggera modifica di altre risposte da qui che ha funzionato per me. Il mio gruppo ha due valori su cui raggruppare, quindi sono stato in grado di metterli entrambi nel primo argomento con un + per farlo alternare correttamente
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Quando ho usato entrambi i gruppi di righe e colonne, ho avuto un problema in cui i colori si alternavano tra le colonne anche se era la stessa riga. Ho risolto questo problema utilizzando una variabile globale che si alterna solo quando cambia la riga:
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
Ora, nella prima colonna della riga che si desidera alternare, impostare l'espressione del colore su:
= Code.AlternateColor ()
-
Nelle restanti colonne, impostale tutte su:
= Code.BGColor
Questo dovrebbe far alternare i colori solo dopo aver disegnato la prima colonna.
Ciò può (in modo non verificabile) migliorare anche le prestazioni, poiché non è necessario eseguire un calcolo matematico per ogni colonna.