Domanda

Come si ombreggiano le righe alternate in un report di SQL Server Reporting Services?


Modificare: Ci sono un sacco di buone risposte elencate di seguito: da presto E semplice A complesso e completo.Ahimè, posso sceglierne solo uno...

È stato utile?

Soluzione

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+ potresti usare:

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

Non sto cercando un rappresentante: ho appena studiato questa domanda da solo e ho pensato di condividerla.

Altri suggerimenti

L'uso di IIF(RowNumber...) può portare ad alcuni problemi quando le righe vengono raggruppate e un'altra alternativa consiste nell'utilizzare una semplice funzione VBScript per determinare il colore.

È un po' più impegnativo ma quando la soluzione base non è sufficiente è una bella alternativa.

Fondamentalmente, aggiungi il codice al report 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 ciascuna cella, imposta BackgroundColor come segue:

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

Tutti i dettagli sono su questo Articolo sbagliato

Ho ottenuto l'effetto degli 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 un po' la soluzione di @ Catch22 perché non mi piace l'idea di dover entrare in ogni campo se decido di voler cambiare uno dei colori.Ciò è particolarmente importante nei report in cui sono presenti numerosi campi per i quali sarebbe necessario modificare la 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 quella che accetta i colori a quella che contiene i colori da utilizzare.

Poi in ogni campo aggiungi:

=Code.AlternateColor(rownumber(nothing))

Questo è molto più efficace rispetto alla modifica manuale del colore di sfondo di ciascun campo.

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à semplicemente con il colore opposto 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 l'interruttore 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 cella:

  1. La prima colonna della riga di dati ha =Code.AlternateColor("AliceBlue", "White", True) (è uguale alla risposta precedente.)
  2. Le restanti colonne della riga di dati hanno =Code.AlternateColor("AliceBlue", "White", False) (Anche questa è la stessa risposta precedente.)
  3. La prima colonna della riga di raggruppamento ha =Code.RestartColor("AliceBlue") (Questa è una novità.)
  4. Le colonne rimanenti della riga di raggruppamento hanno =Code.AlternateColor("AliceBlue", "White", False) (utilizzato in precedenza, ma non se ne fa menzione per la riga di raggruppamento.)

Questo funziona per me.Se vuoi che la riga di raggruppamento non sia colorata o abbia un colore diverso, dovrebbe essere abbastanza ovvio come modificarla.

Non esitate ad aggiungere commenti su cosa si potrebbe fare per migliorare questo codice:Sono nuovo di zecca sia in SSRS che in VB, quindi sospetto fortemente che ci sia molto margine di miglioramento, ma l'idea di base sembra valida (ed è stata utile per me), quindi volevo buttarla 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 "reimpostare" il conteggio dei colori delle righe all'interno di ciascun gruppo.Volevo che la prima riga di dettaglio in ciascun sottogruppo iniziasse con il bianco e questa soluzione (se utilizzata sulla riga di dettaglio) ha permesso che ciò accadesse:

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

Vedere: 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 dice che "Trasparente" non è un colore di sfondo valido durante l'anteprima.Ho trovato una soluzione rapida daImpostazione del colore di sfondo degli elementi del report in SSRS.Utilizza Niente invece di "Trasparente"

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

L'unico modo efficace per risolvere questo problema senza utilizzare VB è "memorizzare" il valore del modulo del raggruppamento di righe all'interno del raggruppamento di righe (e all'esterno del raggruppamento di colonne) e farvi riferimento esplicitamente all'interno del raggruppamento di colonne.Ho trovato questa soluzione su

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

Ma Ankeet non spiega al meglio cosa sta succedendo e la sua soluzione consiglia il passaggio non necessario di creare un raggruppamento su un valore costante, quindi ecco il mio processo passo passo per una matrice con un gruppo di righe singole RowGroup1:

  1. Crea una nuova colonna all'interno di RowGroup1.Rinominare la casella di testo in qualcosa come RowGroupColor.
  2. Imposta il valore della casella di testo di RowGroupColor su

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

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

    "=ReportItems!RowGroupColor.Value"

  4. Imposta la larghezza della colonna RowGroupColor su 0pt e imposta Cangrow su False per nasconderla dai clienti.

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 Valore in esecuzione SU suo valori del gruppo.
  • Non è necessario preoccuparsi della commutazione vero/falso.
  • 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é sulla larghezza)

Sarebbe fantastico se SSRS esponesse proprietà oltre a Value su Textboxes.Potresti semplicemente inserire questo tipo di calcolo in una proprietà BackgroundColor delle caselle di testo del gruppo di righe e quindi farvi riferimento come ReportItems!RowGroup.BackgroundColor in tutte le altre celle.

Ahh beh, 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 ho ottenuto qui Tutto le righe della colonna 1 con sfondo colorato, tutte le righe della colonna 2 con sfondo bianco, tutte le righe della colonna 3 con 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 alternarlo solo con una nuova riga.

Quello che volevo è per tutti colonne nella riga 1 per avere uno sfondo bianco, poi tutte le colonne nella riga 2 per avere uno sfondo colorato, quindi tutte le colonne nella riga 3 per avere uno sfondo bianco e così via.Ho ottenuto questo effetto utilizzando 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.

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

In qualsiasi tipo di matrice complessa, quando si desidera colori di cella alternati, per quanto riguarda le righe o per quanto riguarda la colonna, la soluzione di lavoro è,

Se desideri un colore alternativo delle celle in base alle colonne, allora,

  1. Nell'angolo in basso a destra di una vista di progettazione del report, in "Gruppi di colonne", crea un falso gruppo genitore su 1 (usando l'espressione), chiamato "false direntgroup".
  2. Quindi, nel design del rapporto, per le celle che devono essere colorate in alternativa, utilizzare la seguente espressione del colore di sfondo

=IIF(RunningValue( Fields![ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "Bianco", "Grigio chiaro")

È tutto.

Lo stesso vale per la riga di colore alternativa, devi solo modificare la soluzione di conseguenza.

NOTA:Qui, a volte è necessario impostare di conseguenza il bordo delle celle, di solito svanisce.

Inoltre, non dimenticare di eliminare il valore 1 nel rapporto che è arrivato nell'immagine quando hai creato un gruppo genitore falso.

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

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

La risposta di @Aditya è ottima, ma ci sono casi in cui la formattazione verrà eliminata se la primissima cella della riga (per la formattazione dello sfondo della riga) ha un valore mancante (in tablix complesse con gruppi di colonne/righe e valori mancanti).

La soluzione di @Aditya sfrutta abilmente countDistinct risultato di 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à countDistinct result e restituirà il numero della riga precedente (e, quindi, influenzerà la formattazione di quella cella).Per tenere conto di ciò, dovrai aggiungere un termine aggiuntivo per compensare il countDistinct valore.La mia opinione è stata quella di controllare il primo valore corrente nel gruppo di righe stesso (vedi 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 in false nel codice seguente (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à semplicemente con il colore opposto 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 l'interruttore 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 cella:

  1. La prima colonna della riga di dati ha =Code.AlternateColor("AliceBlue", "White", True) (è uguale alla risposta precedente.)
  2. Le restanti colonne della riga di dati hanno =Code.AlternateColor("AliceBlue", "White", False) (Anche questa è la stessa risposta precedente.)
  3. La prima colonna della riga di raggruppamento ha =Code.RestartColor("AliceBlue") (Questa è una novità.)
  4. Le colonne rimanenti della riga di raggruppamento hanno =Code.AlternateColor("AliceBlue", "White", False) (utilizzato in precedenza, ma non se ne fa menzione per la riga di raggruppamento.)

Questo funziona per me.Se vuoi che la riga di raggruppamento non sia colorata o abbia un colore diverso, dovrebbe essere abbastanza ovvio come modificarla.

Non esitate ad aggiungere commenti su cosa si potrebbe fare per migliorare questo codice:Sono nuovo di zecca sia in SSRS che in VB, quindi sospetto fortemente che ci sia molto margine di miglioramento, ma l'idea di base sembra valida (ed è stata utile per me), quindi volevo buttarla qui.

Ho provato tutte queste soluzioni su una Tablix raggruppata con spazi di riga e nessuna ha funzionato nell'intero report.Il risultato sono state righe colorate duplicate e altre soluzioni hanno prodotto colonne alternate!

Ecco la funzione che ho scritto che ha funzionato per me utilizzando un conteggio 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 utilizzo questa espressione per il colore di sfondo della riga (di celle):

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

Solo perché nessuna delle risposte di cui sopra sembrava funzionare nella mia matrice, la pubblico qui:

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

I miei dati della matrice contenevano valori mancanti, quindi non sono riuscito a far funzionare la soluzione di Ahmad, ma questa soluzione ha funzionato per me

L'idea di base è creare un gruppo figlio e un campo nel gruppo più interno contenente il colore.Quindi imposta il colore per ogni cella nella 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 ho potuto semplicemente inserirli 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 utilizzavo entrambi i gruppi di righe e colonne, riscontravo un problema per 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 la riga cambia:

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, nel Primo colonna della riga che desideri alternare, imposta l'espressione del colore su:

=Codice.ColoreAlternativo()

-

Nelle restanti colonne, impostale tutte su:

=Codice.BGColore

Questo dovrebbe far sì che i colori si alternino solo dopo aver disegnato la prima colonna.

Ciò può anche migliorare (in modo non verificabile) le prestazioni, poiché non è necessario eseguire un calcolo matematico per ciascuna colonna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top