SQL Server Raporlama hizmetleri raporuna alternatif satır rengi ekleme


142

Bir SQL Server Reporting Services raporunda alternatif satırları nasıl gölgelendirirsiniz?


Düzenleme: Hızlı ve basit , karmaşık ve kapsamlı - aşağıda listelenen iyi cevaplar bir demet vardır . Ne yazık ki, sadece birini seçebilirim ...


2
= IIf (RowNumber (Nothing) Mod 2 = 0, "Renk Yok", "# DDEBF7")
Stefan Steiger

Birden fazla hücre seçerseniz metin kutusu özelliklerini düzenleyemezsiniz, ancak özellikler panelinde dolgu rengine erişebilir ve orada bir ifade ayarlayabilirsiniz!
kitsu.eb

Yanıtlar:


213

Tablo satırının BackgroundColor özelliğine gidin ve "İfade ..." yi seçin

Bu ifadeyi kullanın:

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

Bu hile raporun birçok alanına uygulanabilir.

Ve .NET 3.5 ve sonraki sürümlerinde şunları kullanabilirsiniz:

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

Temsilci aramıyorum - sadece bu soruyu kendim araştırdım ve paylaşacağımı düşündüm.


10
Bu, belirli koşullar altında, özellikle çok sayıda alt toplam içeren tablolarda ve matris nesnelerinde başarısız olur. Catch22'nin yanıtı aynı sınırlamalara sahip değildir. Ayrıca, Catch22'nin yöntemi, bir matristeki sütunları, mavi ayda bir kez yararlı olan alternatif sütun renklerine sahip olmaya zorlamak için kullanılabilir.
Kayıtlı Kullanıcı

16
Her zaman kendi sorusunu cevaplayan birisini onayladığımdan emin olurum. Çoğu zaman, asker kendi başına bir cevap bulur ve daha sonra geri göndermek için geri gelmez, aynı soruya sahip olan geri kalanımız karanlıkta kalır. Senin için bir darbe, efendim.
Matt DiTrolio

4
Yukarıdaki kodu kullandığımda [rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor. doğru ifade gibi görünüyor gibi bir uyarı mesajı alıyorum =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing). Yine de bahşiş için teşekkürler.
Russell B

2
Bu gruplama ve ayrıntı görünümü durumunda sorunu verir

3
bazı tarayıcılar "Şeffaf" veya "Hiçbir Şey" işleyemez. En iyi bahis "Beyaz" kullanmak olacaktır
Nate S.

89

IIF (RowNumber ...) kullanılması, satırlar gruplanırken bazı sorunlara yol açabilir ve başka bir alternatif, rengi belirlemek için basit bir VBScript işlevi kullanmaktır.

Biraz daha fazla çaba ama temel çözüm yeterli olmadığında güzel bir alternatif.

Temel olarak, Rapora aşağıdaki gibi kod eklersiniz ...

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

Daha sonra her bir hücrede BackgroundColor'u aşağıdaki gibi ayarlayın:

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

Tüm detaylar bu Wrox makalesinde


Yukarıdaki kod, raporun Kod bölümüne veya bir VB.NET projesindeki arka plan kod sayfasına eklenir, derlenir ve derleme olarak başvurulan bir DLL olarak dağıtılır. Ben genel olarak çok sayıda raporda referans beri bu bir dll olarak dağıtmak için ekstra çaba göstermenizi öneririz.
Kayıtlı Kullanıcı

Bu, diğer birkaç hack'i denedikten sonra, gruplama sorununu ele almak için tercih ettiğim yol. Bir sütuna etkileşimli sıralama uygulandığında bozulmaz. +1 ve çok teşekkürler.
Rex Miller

Tek sayıda satırınız olduğunda renkler dengelenir.
K Richard

20
İlkinden sonraki satırdaki tüm sütunlar için "Doğru" ifadesini "Yanlış" olarak değiştirmeyi unutmayın, aksi takdirde bir dama tahtası etkisi görürsünüz! Çözüm için teşekkürler - harika çalışıyor!
Peter Mularien

Peter Mularien: Bu sorunu yaşıyorum, nasıl düzelteceğinizi açıklayabilir misiniz?
Bill Yazılım Mühendisi

65

Catch22'nin çözümünü kullandığımda satranç etkisini aldım, sanırım çünkü matrisimin tasarımda birden fazla sütunu var. bu ifade benim için iyi çalıştı:

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

13
Bu cevap çok daha fazla ilgiyi hak ediyor - satır grupları ve sütun grupları içeren bir matriste mükemmel çalışan ve çalışmak için özel kod gerektirmeyen temiz bir çözüm. Güzel!
Stefan Mohr

9
Aslında, bu, birden çok sütun için bile iyi çalışır - ancak bir gruplandırmada "eksik" verileriniz yoksa işe yaramaz. Dolayısıyla, 2007'de 12 aylık veri verisi olan ancak 2006'da Ocak ayı verisi olmayan verileriniz varsa ve satırlarda satırlara ve sütunlara göre yıllara göre gruplandırırsanız, 2006 renklendirme biri tarafından kapatılacaktır çünkü RunningValue, senkronize olmasa bile hala "Ocak 2006" matrisinde bir kutu veri kümesinde veri yok ve RunningValue aynı kalıyor, renk değişikliği yok, vb.
Kyle Hale

2
@ahmad bu çok yakın. Boş kutuların zıt rengi kullandığı sorunu yaşıyorum. boş kutuların düzgün renklendiğinden nasıl emin olabilirim?
FistOfFury

@KyleHale eksik kutu renklendirme için bir düzeltme var mı?
FistOfFury

2
@FistOfFury Bildiğim tek çözüm, eksik veriler için bir değerin ayarlandığından (genellikle 0) emin olmaktır.
Kyle Hale

20

@ Catch22'nin çözümünü değiştirdim Biraz renkten birini değiştirmek istediğime karar verirseniz her alana girme fikrini sevmiyorum. Bu, özellikle renk değişkeninin değiştirilmesi gereken çok sayıda alanın olduğu raporlarda önemlidir.

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

İşlevi renkleri kabul edecek birinden, kullanılacak renkleri içeren bir işleve değiştirdiğimi fark ettim.

Sonra her alana ekleyin:

=Code.AlternateColor(rownumber(nothing))

Bu, her alanın arka plan rengindeki rengi manuel olarak değiştirmekten çok daha sağlamdır.


1
Bu konuya güzel bir ek! Her sütunda "True" veya "False" ayarını yapmak zorunda değilim. Ben de sadece her 3 satır gölgelemek için "mod 3" seçeneğini seviyorum.
Baodad

Ben de bu çözümü seviyorum. Ancak, satır gruplama kullandığımda benim için çalışmıyor. @ ahmad'in yukarıdaki çözümü benim için çalıştı.
Baodad

DataSet'inize ek alanlar eklemek istemiyorsanız, bu bir tablix için harika bir çözümdür!
clamchoda

16

Fark ettiğim bir şey, ilk iki yöntemden hiçbirinin ilk satırın bir grupta hangi renkte olması gerektiğine dair bir fikri olmadığı; grup, önceki grubun son satırındaki karşıt renkle başlayacaktır. Gruplarımın her zaman aynı renkle başlamasını istedim ... her grubun ilk satırı her zaman beyaz olmalı ve bir sonraki satır renkli olmalıdır.

Temel konsept, her grup başladığında geçişi sıfırlamaktı, bu yüzden biraz kod ekledim:

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

Şimdi üç farklı hücre arka planım var:

  1. Veri satırının ilk sütununda = Code.AlternateColor ("AliceBlue", "Beyaz", Doğru) (Bu, önceki yanıtla aynıdır.)
  2. Veri satırının kalan sütunlarında = Code.AlternateColor ("AliceBlue", "Beyaz", Yanlış) (Bu da önceki yanıtla aynıdır).
  3. Gruplama satırının ilk sütununda = Code.RestartColor ("AliceBlue") (Bu yeni.)
  4. Gruplama satırının kalan sütunları = Code.AlternateColor ("AliceBlue", "Beyaz", Yanlış) (Bu daha önce kullanıldı, ancak satır gruplama için bundan söz edilmedi.)

Bu benim için çalışıyor. Gruplama satırının renkli veya farklı bir renk olmasını istiyorsanız, bundan nasıl değiştirileceği oldukça açık olmalıdır.

Bu kodu geliştirmek için neler yapılabileceği hakkında yorum eklemek için lütfen çekinmeyin: Hem SSRS hem de VB için yepyeni biriyim, bu yüzden iyileştirme için yeterince alan olduğundan şüpheleniyorum, ancak temel fikir sağlam görünüyor (ve yararlı oldu) bu yüzden buraya atmak istedim.


Ayrıca, her grup için satır numaralandırmayı açıklandığı gibi sıfırlayabilirsiniz. bu yanıtta .
StackOverthrow

10

grup üstbilgileri / altbilgileri için:

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

Bunu, her gruptaki satır rengi sayısını “sıfırlamak” için de kullanabilirsiniz. Her alt gruptaki ilk ayrıntı satırının Beyaz ile başlamasını istedim ve bu çözüm (ayrıntı satırında kullanıldığında) bunun gerçekleşmesine izin verdi:

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

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


8

Michael Haren'in çözümü benim için iyi çalışıyor. Ancak Önizleme "Şeffaf" geçerli bir BackgroundColor olmadığını söyleyerek bir uyarı var. SSRS'de Rapor öğelerinin BackgroundColor Ayarı öğesinden hızlı bir düzeltme bulundu . "Şeffaf" yerine Hiçbir Şey Kullanmayın

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

Beyaz, hiçbir şeyden daha iyi olamazdı.
Nate

6

Bunu VB kullanmadan çözmenin tek etkili yolu, satır gruplama modulo değerini satır gruplaması içinde (ve sütun gruplaması dışında) "depolamak" ve sütun gruplandırmanızda açıkça referans almaktır. Bu çözümü buldum

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

Ancak Ankeet, neler olduğunu açıklamak için en iyi işi yapmaz ve çözümü, sabit bir değer üzerinde bir gruplama oluşturmanın gereksiz adımını önerir, bu yüzden tek bir satır grubu RowGroup1 olan bir matris için adım adım işlemim:

  1. RowGroup1 içinde yeni bir sütun oluşturun. Bunun için metin kutusunu RowGroupColor gibi bir adla yeniden adlandırın.
  2. RowGroupColor metin kutusunun Değerini

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

  3. Tüm satır hücrelerinizin BackgroundColor özelliğini

    "=ReportItems!RowGroupColor.Value"

  4. RowGroupColor sütununun genişliğini 0pt olarak ayarlayın ve CanGrow'u istemcilerden gizlemek için false olarak ayarlayın.

İşte bu kadar! Bu aynı zamanda bu iş parçacığında bahsedilen sorunları da çözer:

  • Alt gruplar için otomatik sıfırlar: Sadece bir performans o rowgroup için yeni bir sütun eklemek RunningValue üzerinde kendi grup değerlerine.
  • Doğru / Yanlış geçişleri hakkında endişelenmenize gerek yok.
  • Kolay değişiklik için renkler sadece tek bir yerde tutulur.
  • Satır veya sütun gruplarında birbirinin yerine kullanılabilir (yüksekliği yalnızca genişlik yerine 0 olarak ayarlayın)

SSRS'nin Metin Kutularındaki Değer dışındaki özellikleri göstermesi harika olurdu. Bu tür bir hesaplamayı yalnızca satır grubu metin kutularının BackgroundColor özelliğinde yapabilir ve daha sonra diğer tüm hücrelerde ReportItems! RowGroup.BackgroundColor olarak başvurabilirsiniz.

Ahh, hayal edebiliriz ...


5

Benim sorunum üst üste tüm sütunları aynı arka plan olmasını istedim oldu. I var satıra göre ve sütun ve bu iki çözelti burada üst hem gruplandırılmış tüm renkli bir arka plan ile renkli bir arka plan ile sütun 1 satır, bir beyaz arka planlı sütun 2'de tüm satırları, sütun 3'te tüm satırları , ve bunun gibi. Sanki RowNumbervebOddRow sadece yeni satırla dönüşümlü olduğunu ödemeli dikkat (catch22 çözümü arasında) benim sütun grubunun yerine görmezden.

İstediğim, satır 1'deki tüm sütunların beyaz bir arka plana sahip olması, ardından satır 2'deki tüm sütunların renkli bir arka plana sahip olması, ardından satır 3'teki tüm sütunların beyaz bir arka plana sahip olması vb. Ben seçilmiş cevabı kullanarak bu etkiyi var ama bunun yerine geçme Nothingiçin RowNumber, benim sütun grubunun, örneğin adını geçti

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

Bunun başkası için yararlı olabileceğini düşündüm.


4

Bence bu hile burada tartışılmıyor. İşte burada,

Herhangi bir karmaşık matris türünde, satır veya sütun olarak alternatif hücre renkleri istediğinizde, çalışma çözümü,

Hücre sütununun alternatif bir rengini istiyorsanız,

  1. Rapor tasarım görünümünün sağ alt köşesinde, "Sütun Grupları" nda, "FakeParentGroup" adlı 1'de (ifade kullanarak) sahte bir üst grup oluşturun.
  2. Daha sonra, rapor tasarımında, alternatif olarak renklendirilecek hücreler için aşağıdaki arka plan rengi ifadesini kullanın

= IIF (RunningValue (Fields! [ColumnGroupField] .Değer, countDistinct, "FakeParentGroup") MOD 2, "Beyaz", "LightGrey")

Bu kadar.

Alternatif renk satırı akıllıca için aynı, sadece buna göre çözümü düzenlemek zorunda.

NOT: Burada, bazen hücrelerin sınırını buna göre ayarlamanız gerekir, genellikle kaybolur.

Ayrıca, sahte üst grup oluşturduğunuzda resme gelen rapordaki 1 değerini silmeyi de unutmayın.


1
Bu cevap, karmaşık tablixlerde satır şeritlemesi oluşturmak zorunda olanlar için kesinlikle harika bir bulgu! Mevcut bir üst grup varsa, bunu kullanın. Aksi takdirde, FakeParentGroup oluşturun. Hem sütun hem de satır gruplarına sahip tablixlerdeki eksik değerler genellikle biçimlendirmeyi kaldırır. İlk hücrede eksik değerleri hesaba katmak için @ Aditya'ın üzerine kurulu cevabımı görün.
rpyzh

2

Raporun tamamı için alternatif bir renge ihtiyacınız varsa, Tablix'inizin bağlı olduğu DataSet'i raporda rapor genelinde bir kimlik numara numarası için kullanabilir ve bunu RowNumber işlevinde kullanabilirsiniz ...

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

2

@ Aditya'ın cevabı harika, ancak satırın ilk hücresinin (satır arka plan biçimlendirmesi için) eksik bir değeri varsa (sütun / satır grupları ve eksik değerler içeren karmaşık tablixlerde) biçimlendirmenin atılacağı durumlar vardır.

@ Aditya'ın çözümü , tablix (satır) grubundaki satır numaralarını tanımlamak için işlevin countDistinctsonucundan akıllıca yararlanır runningValue. İlk hücredeki değeri eksik olan tablix satır varsa, runningValueartım olmaz countDistinctsonucu ve önceki satırın numarası (ve dolayısıyla o hücreden biçimlendirme etkileyecektir) dönecektir. Bunu hesaba katmak için countDistinctdeğeri dengelemek için ek bir terim eklemeniz gerekecektir . Benim aldığım satır grubundaki ilk çalışan değeri kontrol etmekti (aşağıdaki snippet'in 3. satırına bakın):

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

Bu yardımcı olur umarım.


Teşekkürler @rpyzh, bu ortak bir üst satır grubu Raporu ile çok sıralı grubum için çalışan çözüm oldu!
Niallty

1

Birisi aşağıdaki kodda (yukarıdaki yazıdan) alanların geri kalanını false değerine çevirmenin arkasındaki mantığı açıklayabilir mi?

Fark ettiğim bir şey, ilk iki yöntemden hiçbirinin ilk satırın bir grupta hangi renkte olması gerektiğine dair bir fikri olmadığı; grup, önceki grubun son satırındaki karşıt renkle başlayacaktır. Gruplarımın her zaman aynı renkle başlamasını istedim ... her grubun ilk satırı her zaman beyaz olmalı ve bir sonraki satır renkli olmalıdır.

Temel konsept, her grup başladığında geçişi sıfırlamaktı, bu yüzden biraz kod ekledim:

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

Şimdi üç farklı hücre arka planım var:

  1. Veri satırının ilk sütununda = Code.AlternateColor ("AliceBlue", "Beyaz", Doğru) (Bu, önceki yanıtla aynıdır.)
  2. Veri satırının kalan sütunlarında = Code.AlternateColor ("AliceBlue", "Beyaz", Yanlış) (Bu da önceki yanıtla aynıdır).
  3. Gruplama satırının ilk sütununda = Code.RestartColor ("AliceBlue") (Bu yeni.)
  4. Gruplama satırının kalan sütunları = Code.AlternateColor ("AliceBlue", "Beyaz", Yanlış) (Bu daha önce kullanıldı, ancak satır gruplama için bundan söz edilmedi.)

Bu benim için çalışıyor. Gruplama satırının renkli veya farklı bir renk olmasını istiyorsanız, bundan nasıl değiştirileceği oldukça açık olmalıdır.

Bu kodu geliştirmek için neler yapılabileceği hakkında yorum eklemek için lütfen çekinmeyin: Hem SSRS hem de VB için yepyeni biriyim, bu yüzden iyileştirme için yeterince alan olduğundan şüpheleniyorum, ancak temel fikir sağlam görünüyor (ve yararlı oldu) bu yüzden buraya atmak istedim.


1

Tüm bu çözümleri satır boşlukları olan bir Gruplandırılmış Tablix'te denedim ve hiçbiri tüm raporda çalışmadı. Sonuç, yinelenen renkli satırlar ve alternatif çözümlerle sonuçlanan diğer çözümlerdi!

İşte bir Sütun Sayısı kullanarak benim için çalıştı yazdı işlevi:

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

7 Sütun Tablix için bu ifade Satır (of Cells) Backcolour için kullanın:

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


0

Matris verilerimde eksik değerler vardı, bu yüzden ahmad'in çözümünü çalıştıramadım, ancak bu çözüm benim için çalıştı

Temel fikir, en içteki grubunuzda rengi içeren bir alt grup ve alan oluşturmaktır. Ardından, o alanın değerine göre satırdaki her hücrenin rengini ayarlayın.


Matrisdeki eksik değerleri ele almak için @ Aditya'ın ve cevabımın göz atın. Zaten bir üst grubunuz varsa (veya sahte bir grup oluşturmak istiyorsanız) kullanışlıdır. Bu şekilde ayrı bir alan oluşturmanız gerekmeyecek.
rpyzh

0

Benim için işe yarayan diğer cevapların biraz değiştirilmesi. Grubumun gruplanacak iki değeri var, bu yüzden doğru şekilde değişmesini sağlamak için her ikisini de bir + ile ilk argümana koymayı başardım

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

0

Satır ve sütun gruplarının her ikisini de kullanırken, aynı satır olmasına rağmen renklerin sütunlar arasında değişeceği bir sorun yaşadım. Ben sadece satır değiştiğinde değişen bir global değişken kullanarak çözüldü:

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

Şimdi, değiştirmek istediğiniz satırın ilk sütununda, renk ifadesini şu şekilde ayarlayın:

= Code.AlternateColor ()

-

Kalan sütunlarda, tümünü şu şekilde ayarlayın:

= Code.BGColor

Bu, renkleri yalnızca ilk sütun çizildikten sonra değiştirmelidir.

Bu, her sütun için bir matematik hesaplaması yapmasına gerek olmadığı için performansı (doğrulanamaz şekilde) da artırabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.