Aggiungere il colore delle righe alternate al report dei servizi di report di SQL Server


142

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


2
= IIf (RowNumber (Nothing) Mod 2 = 0, "No Color", "# DDEBF7")
Stefan Steiger,

Se selezioni più celle non puoi modificare le proprietà della casella di testo, ma puoi accedere al colore di riempimento nel pannello delle proprietà e impostare un'espressione lì!
kitsu.eb,

Risposte:


213

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.


10
Ciò fallisce in determinate circostanze, in particolare nelle tabelle e negli oggetti matrice con molti totali parziali. La risposta di Catch22 non ha gli stessi limiti. Inoltre, il metodo di Catch22 può essere usato per forzare le colonne in una matrice ad avere colori di colonna alternati che è utile una volta in una luna blu.
Utente registrato

16
Mi assicuro sempre di votare qualcuno che risponda alla propria domanda. Troppo spesso, chi chiede trova da solo una risposta e poi non torna più a postarla, lasciando il resto di noi che potrebbe avere la stessa domanda al buio. Un urto per lei, signore.
Matt DiTrolio,

4
Quando uso il codice sopra, ricevo un messaggio di avviso come [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ò.
Russell B,

2
Questo dà il problema in caso di raggruppamento e visualizzazione dei dettagli

3
alcuni browser non possono gestire "Trasparente" o "Niente". La migliore scommessa sarebbe quella di usare "White"
Nate S.

89

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


Il codice sopra riportato viene aggiunto alla sezione Codice del report o a una pagina code-behind in un progetto VB.NET, compilato e distribuito come DLL che fa riferimento come assembly. Raccomando di fare lo sforzo supplementare per distribuire questo come dll poiché generalmente lo fai riferimento in numerosi rapporti.
Utente registrato

Questo è il mio modo preferito per gestire il problema di raggruppamento, dopo aver provato alcuni altri hack. Non si interrompe quando l'ordinamento interattivo viene applicato a una colonna. +1 e molte grazie.
Rex Miller,

I colori sono sfalsati quando si dispone di un numero dispari di righe.
K Richard,

20
Non dimenticare di cambiare "Vero" in "Falso" per tutte le colonne della riga dopo la prima, altrimenti vedrai un effetto a scacchiera! Grazie per la soluzione - funziona alla grande!
Peter Mularien,

Peter Mularien: sto riscontrando questo problema, puoi spiegare come risolverlo?
Bill Software Engineer,

65

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")

13
Questa risposta merita molta più attenzione: è una soluzione pulita che funziona perfettamente in una matrice con gruppi di righe e gruppi di colonne e non richiede alcun codice personalizzato per funzionare. Bellissimo!
Stefan Mohr,

9
In realtà, questo funziona bene anche per più colonne, ma non se si dispone di dati "mancanti" in un raggruppamento. Quindi, se hai dati che hanno 12 mesi di dati nel 2007 ma nessun dato di gennaio nel 2006, e raggruppa per mese su righe e anno su colonne, la colorazione del 2006 sarà disattivata di uno perché RunningValue diventa off-sync perché anche se c'è ancora una casella nella matrice per "gennaio 2006" non ci sono dati nel set di dati e RunningValue rimane lo stesso, nessun cambio di colore, ecc.
Kyle Hale,

2
@ahmad è così vicino. Sto riscontrando il problema per cui le scatole vuote usano il colore opposto. come posso assicurarmi che le caselle vuote siano colorate correttamente?
FistOfFury

@KyleHale hai una correzione per la colorazione della scatola mancante?
FistOfFury

2
@FistOfFury L'unica soluzione che conosco è quella di garantire che sia impostato un valore (di solito 0) per i dati mancanti.
Kyle Hale,

20

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.


1
Bella aggiunta a questa discussione! Mi piace non dover impostare "Vero" o "Falso" in ogni colonna. Mi piace anche l'opzione di "mod 3", quindi posso ombreggiare solo ogni 3a fila.
Baodad,

Mi piace anche questa soluzione. Tuttavia, non funziona per me quando utilizzo il raggruppamento di righe. La soluzione di @ ahmad sopra ha funzionato per me però.
Baodad,

Questa è un'ottima soluzione per un tablix se non desideri aggiungere campi aggiuntivi al tuo DataSet!
Clamchoda,

16

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:

  1. La prima colonna della riga di dati ha = Code.AlternateColor ("AliceBlue", "White", True) (Questa è la stessa della risposta precedente.)
  2. Le colonne rimanenti della riga di dati hanno = Code.AlternateColor ("AliceBlue", "White", False) (Anche questa è uguale alla risposta precedente.)
  3. La prima colonna della riga di raggruppamento ha = Code.RestartColor ("AliceBlue") (Questo è nuovo.)
  4. Le colonne rimanenti della riga di raggruppamento hanno = Code.AlternateColor ("AliceBlue", "White", False) (Questo era usato in precedenza, ma nessuna menzione per raggruppare la riga.)

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.


Puoi anche ripristinare la numerazione delle righe per ciascun gruppo come descritto in questa risposta .
StackOverthrow,

10

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


8

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)

Il bianco sarebbe meglio di niente.
Nate S.

6

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:

  1. Creare una nuova colonna all'interno del RowGroup1. Rinominare la casella di testo per questo in qualcosa come RowGroupColor.
  2. Impostare il valore della casella di testo di RowGroupColor su

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

  3. Impostare la proprietà BackgroundColor di tutte le celle della riga su

    "=ReportItems!RowGroupColor.Value"

  4. Impostare la larghezza della colonna RowGroupColor su 0pt e impostare CanGrow su false per nasconderlo dai client.

Ecco! Questo risolve anche molti dei problemi menzionati in questo thread:

  • Ripristini automatici per sottogruppi: basta aggiungere una nuova colonna per quel gruppo di righe, eseguendo un RunningValue su di esso valori di gruppo.
  • Non c'è bisogno di preoccuparsi degli interruttori True / False.
  • I colori sono tenuti in un solo posto per una facile modifica.
  • Può essere utilizzato in modo intercambiabile su gruppi di righe o colonne (basta impostare l'altezza su 0 anziché su larghezza)

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


5

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


4

Penso che questo trucco non sia discusso qui. Quindi eccolo qui,

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,

  1. Nell'angolo in basso a destra di una vista di progettazione del report, in "Gruppi di colonne", crea un gruppo principale falso su 1 (usando l'espressione), chiamato "FakeParentGroup".
  2. Quindi, nella progettazione del report, per le celle da colorare in alternativa, utilizzare la seguente espressione del colore di sfondo

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


1
Questa risposta è sicuramente un'ottima scoperta per coloro che devono creare bande di righe in tablix complesse! Se esiste un gruppo padre esistente, usalo. Altrimenti, crea FakeParentGroup. I valori mancanti nelle tablix che hanno sia gruppi di colonne che di righe di solito eliminano la formattazione. Vedi la mia risposta che si basa su @ Aditya per tenere conto dei valori mancanti nella prima cella.
rpyzh,

2

Se per l'intero report è necessario un colore alternato, è possibile utilizzare il DataSet a cui Tablix è associato per un rownumber di identità a livello di report sul report e utilizzarlo nella funzione RowNumber ...

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

2

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 countDistinctrisultato della runningValuefunzione per identificare i numeri di riga all'interno di un gruppo tablix (riga). Se hai righe Tablix con valore mancante nella prima cella, runningValuenon aumenterà il countDistinctrisultato 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 countDistinctvalore. 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.


Grazie @rpyzh, questa è stata la soluzione che ha funzionato per il mio gruppo multi-fila con un gruppo comune di file della fila principale Rapporto!
Niallty,

1

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:

  1. La prima colonna della riga di dati ha = Code.AlternateColor ("AliceBlue", "White", True) (Questa è la stessa della risposta precedente.)
  2. Le colonne rimanenti della riga di dati hanno = Code.AlternateColor ("AliceBlue", "White", False) (Anche questa è uguale alla risposta precedente.)
  3. La prima colonna della riga di raggruppamento ha = Code.RestartColor ("AliceBlue") (Questo è nuovo.)
  4. Le colonne rimanenti della riga di raggruppamento hanno = Code.AlternateColor ("AliceBlue", "White", False) (Questo era usato in precedenza, ma nessuna menzione per raggruppare la riga.)

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.


1

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)


0

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.


Dai un'occhiata a @ Aditya e alla mia risposta per gestire i valori mancanti nella matrice. Utile se hai già (o sei disposto a creare un falso) gruppo di genitori. Non dovrai creare un campo separato in quel modo.
rpyzh,

0

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")

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.