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 ...
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 ...
Yanıtlar:
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.
[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.
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
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")
@ 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.
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:
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.
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
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)
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:
RowGroupColor metin kutusunun Değerini
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Tüm satır hücrelerinizin BackgroundColor özelliğini
"=ReportItems!RowGroupColor.Value"
İşte bu kadar! Bu aynı zamanda bu iş parçacığında bahsedilen sorunları da çözer:
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 ...
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 RowNumber
vebOddRow
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 Nothing
iç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.
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,
= 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.
@ 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 countDistinct
sonucundan akıllıca yararlanır runningValue
. İlk hücredeki değeri eksik olan tablix satır varsa, runningValue
artım olmaz countDistinct
sonucu ve önceki satırın numarası (ve dolayısıyla o hücreden biçimlendirme etkileyecektir) dönecektir. Bunu hesaba katmak için countDistinct
değ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.
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:
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.
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)
Yukarıdaki cevapların hiçbirinin matrisimde işe yaramadığı için bunu buraya gönderiyorum:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
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.
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")
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.