SSRS Sütun Bazlı Renklendirme
SQL Server’ın bizlere verileri göstermemiz için sunmuş olduğu yapıların en başında Reporting Service gelmektedir. Farklı veri kaynaklarına bağlanıp sonucunda hazırladığımız sorguları Reporing Service raporları aracılığı ile son kullanıcılarla paylaşabiliyoruz.
Bir raporun kullanıma hazır hale gelmesi aslında büyük çaplı projelerde birçok fazdan oluşuyor. Bunlardan birincisi ve aslında olmazsa olmazı rapor için çalıştırılacak sorguların optimize şekilde hazırlanması. Fakat günümüzde halen şirketlerin büyük bir çoğunluğunda rapor dendiğinde akla sadece Excel üzerinde yer alan bulk veri yığını geliyor olsa dahi raporun belirli süreçleri takip ederek kullanıcının ihtiyaçlarını karşılamasının yanı sıra anlaşılırlığının da rahat olması gerekmektedir.
Özellikle kurumsal süreçleri yüksek oranda oturmuş şirketlere hizmet ediyorsanız kullanacağınız yazı tipinden, terminolojide geçerli olan (kullanacağınız) kelimelere, kullanmakla yükümlü olduğunuz renklerden gönderim tipine kadar herşey belirlenmiş olabilir.
Olaya bu şekilde yaklaşıldığında raporun geliştirilmesi ve revize edilmesi süreçleri işin sadece bir ayağı olarak karşımıza çıkmaktadır. Görsellikte kullanmanız gereken yapılar, kurallar olabilir. Öte yandan raporun çalıştırılma saatleri, gönderim sıklığı vb. Durumlar hem kullanıcılara ek maliyet çıkarmayıp hemde veri tabanı sunucularınızın en optimum seviyede çalışmasına destek sağlayabilir.
Şirketinizde kullanacağını raporlardan bazılarında hücrelere farklı renkler vermeniz gerekebilir. Genellikle bu işlemi expression yazarak rahatlıkla halledebilirsiniz. Özetle background color alanında belirli aralıklardaki değerlerin hangi renklere denk geldiğini rahatlıkla yapabilirsiniz. Fakat bu aralıklar static değil dinamik ise burada expression yardımı ile çözüm bulmanız sorun yaratacaktır. Çünkü sutün bazında karşınıza çıkacak değerleri hiçbir şekilde bilmiyorsunuz. Bilseniz dahi illa sizin belirlediğiniz kurallar çerçevesinde olmak durumunda olmayabilir. Örneğin A sutunundaki değerler 3 farklı renk alacakken B sutunundaki değerler 5 farklı renk alabilir. Başka bir raporda ise tam tersi.
Özellikle Müşterinin sadakatini ölçmede şirketlerin kullanmakta olduğu Cohort raporunun ilk bakışta hemen anlaşılması açısından böyle bir ihtiyaç ile karşılaştım. Çözmek için ise Reporting Service’ın sağlamış olduğu Embedded Code ile Visual Basic kod parçacığı kullanmak durumunda kaldım.
Raporunuzda kullanacağınız Code alanı için arayüz üzerinde farenin sağ tuşuna basarak properties ekranına gelmeniz gerekmektedir.

İlgili alana aşağıdaki kodumuzu yazalım :
Public Shared Function ColorDWB(ByVal Value As Decimal, ByVal MaxPositive As Decimal, ByVal Neutral As Decimal, ByVal ColStr As String) As String
Dim ColVar1 As Integer
Dim ColVar2 As Integer
Dim ColVar3 As Integer
ColVar1 = Convert.ToInt32(left(right(ColStr, 6), 2), 16)
ColVar2 = Convert.ToInt32(left(right(ColStr, 4), 2), 16)
ColVar3 = Convert.ToInt32(right(ColStr, 2), 16)
Dim decPosRange As Decimal = Math.Abs(MaxPositive - Neutral)
Dim Shd As Decimal = 255
Dim iColor1 As Integer
Dim iColor2 As Integer
Dim iColor3 As Integer
Dim strColor As String
iColor1 = ColVar1 + CInt(Math.Round((MaxPositive - Value) * ((Shd - ColVar1) / decPosRange)))
iColor2 = ColVar2 + CInt(Math.Round((MaxPositive - Value) * ((Shd - ColVar2) / decPosRange)))
iColor3 = ColVar3 + CInt(Math.Round((MaxPositive - Value) * ((Shd - ColVar3) / decPosRange)))
strColor = "#" & iColor1.ToString("X2") & iColor2.ToString("X2") & iColor3.ToString("X2")
Return strColor
End Function
Fonksiyonumuz kullanıma hazır. Bundan sonra ise içerisinde barındırdığı değerlere göre otomatik renklendirmeyi sağlayacak kolonların properties ekranında Fill sekmesi altında yer alan BackGroundColor alanına bu fonksiyonumuzu tetikleyecek expression’ı yazmamız gerekir :
=Code.ColorDWB(Fields!Month_0.Value, Max(Fields!Month_0.Value, "ds_Cohort"), Min(Fields!Month_0.Value, "ds_Cohort"), "#800000")
Buna göre sonda belirttiğim renk koduna göre otomatik olarak segmentasyon gerçekleşecek ve aslında raporumuz çalıştığında aşağıdaki gibi bir ekran görüntüsü ile karşılaşıyor olacağız.