Tambahkan warna baris bergantian ke laporan layanan Pelaporan SQL Server

142

Bagaimana Anda menaungi baris bergantian dalam laporan Layanan Pelaporan SQL Server?


Sunting: Ada banyak jawaban bagus yang tercantum di bawah ini - dari yang cepat dan sederhana hingga yang kompleks dan komprehensif . Sayangnya, saya hanya dapat memilih satu ...

Michael Haren
sumber
2
= IIf (RowNumber (Nothing) Mod 2 = 0, "No Color", "# DDEBF7")
Stefan Steiger
Jika Anda memilih banyak sel, Anda tidak dapat mengedit properti kotak teks, tetapi Anda dapat mengakses warna isian di panel properti dan mengatur ekspresi di sana!
kitsu.eb

Jawaban:

213

Buka properti BackgroundColor baris tabel dan pilih "Ekspresi ..."

Gunakan ungkapan ini:

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

Trik ini dapat diterapkan ke banyak area laporan.

Dan di .NET 3.5+ Anda bisa menggunakan:

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

Tidak mencari perwakilan - saya hanya meneliti sendiri pertanyaan ini dan berpikir saya akan membagikannya.

Michael Haren
sumber
10
Ini gagal dalam keadaan tertentu, terutama dalam tabel dan objek matriks dengan banyak sub-total. Respons Catch22 tidak memiliki batasan yang sama. Juga, metode Catch22 dapat digunakan untuk memaksa kolom dalam matriks untuk memiliki warna kolom bergantian yang berguna sekali dalam bulan biru.
Pengguna Terdaftar
16
Saya selalu memastikan untuk mengungguli seseorang yang menjawab pertanyaan mereka sendiri. Terlalu sering, penanya menemukan jawaban sendiri dan kemudian tidak pernah kembali untuk mempostingnya, meninggalkan kita semua yang mungkin memiliki pertanyaan yang sama dalam kegelapan. Benjolan untuk Anda, tuan.
Matt DiTrolio
4
Ketika saya menggunakan kode di atas, saya mendapatkan pesan peringatan seperti [rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor. itu sepertinya ekspresi yang benar =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing). Terima kasih atas tipnya.
Russell B
2
Ini memberikan masalah jika terjadi pengelompokan dan tampilan detail
3
beberapa browser tidak dapat menangani "Transparan" atau "Tidak Ada". Taruhan terbaik adalah dengan menggunakan "Putih"
Nate S.
89

Menggunakan IIF (RowNumber ...) dapat menyebabkan beberapa masalah ketika baris dikelompokkan dan alternatif lain adalah dengan menggunakan fungsi VBScript sederhana untuk menentukan warna.

Ini sedikit usaha tetapi ketika solusi dasar tidak cukup, itu adalah alternatif yang bagus.

Pada dasarnya, Anda menambahkan kode ke Laporan sebagai berikut ...

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

Kemudian pada setiap sel, atur BackgroundColor sebagai berikut:

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

Rincian lengkap ada di artikel Wrox ini

Tangkapan22
sumber
Kode di atas ditambahkan ke bagian Kode dari laporan atau ke halaman kode di belakang dalam proyek VB.NET, dikompilasi, dan digunakan sebagai DLL yang referensi sebagai majelis. Saya sarankan melakukan upaya ekstra untuk menggunakan ini sebagai dll karena Anda umumnya merujuk ini dalam banyak laporan.
Pengguna Terdaftar
Ini adalah cara yang saya sukai untuk menangani masalah pengelompokan, setelah mencoba beberapa peretasan lainnya. Itu tidak rusak ketika pengurutan interaktif diterapkan ke kolom. +1 dan terima kasih banyak.
Rex Miller
Warnanya diimbangi saat Anda memiliki jumlah baris ganjil.
K Richard
20
Jangan lupa untuk mengubah "Benar" menjadi "Salah" untuk semua kolom di baris setelah yang pertama, jika tidak, Anda akan melihat efek kotak-kotak! Terima kasih atas solusinya - ini bekerja dengan baik!
Peter Mularien
Peter Mularien: Saya mengalami masalah ini, dapatkah Anda menjelaskan bagaimana cara memperbaikinya?
Insinyur Perangkat Lunak Bill
65

Saya mendapatkan efek catur ketika saya menggunakan solusi Catch22, saya pikir karena matriks saya memiliki lebih dari satu kolom dalam desain. ungkapan itu bekerja dengan baik untuk saya:

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
ahmad
sumber
13
Jawaban ini patut mendapat perhatian lebih banyak - ini adalah solusi bersih yang berfungsi sempurna dalam matriks dengan grup baris dan grup kolom dan tidak memerlukan kode khusus untuk berfungsi. Cantik!
Stefan Mohr
9
Sebenarnya, ini berfungsi dengan baik bahkan untuk beberapa kolom - tetapi tidak jika Anda memiliki data yang "hilang" dalam pengelompokan. Jadi jika Anda memiliki data yang memiliki 12 bulan data data pada 2007 tetapi tidak ada data Januari 2006, dan mengelompokkan berdasarkan bulan pada baris dan tahun pada kolom, pewarnaan 2006 akan dimatikan satu per satu karena RunningValue mendapat offsync karena meskipun ada masih kotak dalam matriks untuk "Januari 2006" tidak ada data dalam dataset dan RunningValue tetap sama, tidak ada perubahan warna, dll.
Kyle Hale
2
@ ahmad ini sangat dekat. Saya mengalami masalah di mana kotak kosong menggunakan warna yang berlawanan. bagaimana cara memastikan bahwa kotak kosong diberi warna dengan benar?
FistOfFury
@ KyleHale apakah Anda memiliki perbaikan untuk pewarnaan kotak yang hilang?
FistOfFury
2
@FistOfFury Satu-satunya solusi yang saya tahu adalah memastikan nilai diatur (biasanya 0) untuk data yang hilang.
Kyle Hale
20

Saya telah mengubah solusi @ Catch22 Sedikit karena saya tidak suka gagasan harus pergi ke setiap bidang jika saya memutuskan saya ingin mengubah salah satu warna. Ini sangat penting dalam laporan di mana terdapat banyak bidang yang perlu diubah variabel warnanya.

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

Melihat bahwa saya telah mengubah fungsi dari yang menerima warna menjadi yang berisi warna yang akan digunakan.

Kemudian di setiap bidang tambahkan:

=Code.AlternateColor(rownumber(nothing))

Ini jauh lebih kuat daripada secara manual mengubah warna pada warna latar belakang masing-masing bidang.

Michael Eakins
sumber
1
Tambahan yang bagus untuk utas ini! Saya suka tidak harus mengatur "Benar" atau "Salah" di setiap kolom. Saya juga suka opsi "mod 3" jadi saya hanya bisa menaungi setiap baris ke-3.
Baodad
Saya juga suka solusi ini. Namun, itu tidak berfungsi untuk saya ketika saya menggunakan pengelompokan baris. @ ahmad solusi di atas bekerja untuk saya.
Baodad
Ini adalah solusi hebat untuk tablix jika Anda tidak ingin menambahkan bidang tambahan ke DataSet Anda!
clamchoda
16

Satu hal yang saya perhatikan adalah bahwa tidak satu pun dari dua metode teratas memiliki gagasan tentang apa warna baris pertama harus dalam kelompok; grup hanya akan mulai dengan warna yang berlawanan dari baris terakhir dari grup sebelumnya. Saya ingin grup saya selalu mulai dengan warna yang sama ... baris pertama dari setiap grup harus selalu putih, dan baris berikutnya diwarnai.

Konsep dasarnya adalah mengatur ulang sakelar ketika setiap grup dimulai, jadi saya menambahkan sedikit kode:

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

Jadi saya memiliki tiga jenis latar belakang sel sekarang:

  1. Kolom pertama baris data memiliki = Code.AlternateColor ("AliceBlue", "White", True) (Ini sama dengan jawaban sebelumnya.)
  2. Kolom baris data yang tersisa memiliki = Code.AlternateColor ("AliceBlue", "White", False) (Ini, juga, sama dengan jawaban sebelumnya.)
  3. Kolom pertama dari baris pengelompokan memiliki = Code.RestartColor ("AliceBlue") (Ini baru.)
  4. Kolom baris pengelompokan yang tersisa memiliki = Code.AlternateColor ("AliceBlue", "White", False) (Ini digunakan sebelumnya, tetapi tidak disebutkan untuk pengelompokan baris.)

Ini bekerja untuk saya. Jika Anda ingin baris pengelompokan menjadi tidak berwarna, atau warna yang berbeda, harus cukup jelas dari ini cara mengubahnya.

Jangan ragu untuk menambahkan komentar tentang apa yang bisa dilakukan untuk meningkatkan kode ini: Saya baru untuk SSRS dan VB, jadi saya sangat curiga bahwa ada banyak ruang untuk perbaikan, tetapi ide dasarnya tampak bagus (dan itu berguna untuk saya) jadi saya ingin membuangnya di sini.

Beska
sumber
Anda juga dapat mengatur ulang penomoran baris untuk setiap grup seperti yang dijelaskan dalam jawaban ini .
StackOverthrow
10

untuk header / footer grup:

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

Anda juga dapat menggunakan ini untuk "mengatur ulang" jumlah warna baris dalam setiap grup. Saya ingin baris detail pertama di setiap sub grup dimulai dengan White dan solusi ini (bila digunakan pada baris detail) memungkinkan hal itu terjadi:

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

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

John Saunders
sumber
8

Solusi Michael Haren bekerja dengan baik untuk saya. Namun saya mendapat peringatan yang mengatakan bahwa "Transparan" bukan BackgroundColor yang valid saat Pratinjau. Menemukan perbaikan cepat dari Mengatur BackgroundColor elemen Laporan di SSRS . Gunakan Tidak Ada alih-alih "Transparan"

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
nonetaku
sumber
Putih akan lebih baik daripada Tidak ada.
Nate S.
6

Satu-satunya cara efektif untuk menyelesaikan masalah ini tanpa menggunakan VB adalah "menyimpan" nilai modulo pengelompokan baris dalam pengelompokan baris (dan di luar pengelompokan kolom) dan rujuk secara eksplisit dalam pengelompokan kolom Anda. Saya menemukan solusi ini di

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

Tetapi Ankeet bukan pekerjaan terbaik untuk menjelaskan apa yang terjadi, dan solusinya merekomendasikan langkah yang tidak perlu untuk membuat pengelompokan pada nilai konstan, jadi inilah proses langkah-demi-langkah saya untuk sebuah matriks dengan grup baris tunggal RowGroup1:

  1. Buat kolom baru di dalam RowGroup1. Ganti nama kotak teks untuk ini menjadi sesuatu seperti RowGroupColor.
  2. Setel nilai kotak teks RowGroupColor ke

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

  3. Setel properti BackgroundColor dari semua sel baris Anda

    "=ReportItems!RowGroupColor.Value"

  4. Atur lebar kolom RowGroupColor ke 0pt dan atur CanGrow ke false untuk menyembunyikannya dari klien.

Voila! Ini juga memecahkan banyak masalah yang disebutkan di utas ini:

  • Me-reset otomatis untuk subkelompok: Hanya menambahkan kolom baru untuk rowgroup itu, melakukan RunningValue pada nya nilai-nilai kelompok.
  • Tidak perlu khawatir tentang matikan Benar / Salah.
  • Warna hanya disimpan di satu tempat untuk modifikasi yang mudah.
  • Dapat digunakan secara bergantian pada grup baris atau kolom (cukup atur tinggi ke 0 dan bukan lebar)

Akan luar biasa jika SSRS akan mengekspos properti selain Nilai pada Kotak Teks. Anda bisa memasukkan perhitungan seperti ini di properti BackgroundColor dari kotak teks grup baris dan kemudian merujuknya sebagai ReportItems! RowGroup.BackgroundColor di semua sel lain.

Ahh well, kita bisa bermimpi ...

Kyle Hale
sumber
5

Masalah saya adalah bahwa saya ingin semua kolom dalam satu baris memiliki latar belakang yang sama. Saya mengelompokkan berdasarkan baris dan kolom, dan dengan dua solusi teratas di sini saya mendapatkan semua baris di kolom 1 dengan latar belakang berwarna, semua baris di kolom 2 dengan latar belakang putih, semua baris di kolom 3 dengan latar belakang berwarna , dan seterusnya. Seolah-olah RowNumberdanbOddRow (dari solusi Catch22) memperhatikan grup kolom saya alih-alih mengabaikan itu dan hanya bergantian dengan baris baru.

Yang saya inginkan adalah agar semua kolom di baris 1 memiliki latar belakang putih, lalu semua kolom di baris 2 memiliki latar belakang berwarna, lalu semua kolom di baris 3 memiliki latar belakang putih, dan sebagainya. Saya mendapatkan efek ini dengan menggunakan jawaban yang dipilih tetapi bukannya lewatNothing ke RowNumber, saya melewati nama grup kolom saya, misalnya

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

Kupikir ini mungkin berguna bagi orang lain.

Kapal Sarah
sumber
4

Saya pikir trik ini tidak dibahas di sini. Jadi begini,

Dalam semua jenis matriks kompleks, ketika Anda ingin warna sel alternatif, baik baris bijak atau kolom bijaksana, solusi yang bekerja adalah,

Jika Anda ingin warna sel kolom pengganti bijaksana,

  1. Di sudut kanan bawah tampilan desain laporan, di "Grup Kolom", buat grup induk palsu pada 1 (menggunakan ekspresi), bernama "FakeParentGroup".
  2. Kemudian, dalam desain laporan, untuk sel yang akan diwarnai sebagai alternatif, gunakan ekspresi warna latar belakang berikut

= IIF (RunningValue (Bidang! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "Putih", "LightGrey")

Itu saja.

Sama untuk baris warna alternatif, hanya Anda harus mengedit solusi yang sesuai.

CATATAN: Di sini, kadang-kadang Anda perlu mengatur batas sel yang sesuai, biasanya menghilang.

Juga jangan lupa untuk menghapus nilai 1 dalam laporan yang muncul ketika Anda membuat grup induk palsu.

Aditya
sumber
1
Jawaban ini jelas merupakan penemuan yang hebat bagi mereka yang harus membuat garis banding dalam tablix kompleks! Jika ada grup induk yang ada, gunakan itu. Kalau tidak, buat FakeParentGroup. Nilai yang hilang di tablix yang memiliki grup kolom dan baris biasanya membuang pemformatan. Lihat jawaban saya yang dibangun di atas @ Aditya untuk memperhitungkan nilai yang hilang di sel pertama.
rpyzh
2

Jika untuk seluruh laporan Anda memerlukan warna bergantian, Anda dapat menggunakan DataSet yang terikat dengan Tablix Anda untuk nomor laporan identitas seluruh laporan dan menggunakannya dalam fungsi RowNumber ...

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

@ Aditya jawabannya bagus, tetapi ada contoh di mana pemformatan akan dibuang jika sel pertama dari baris (untuk pemformatan latar belakang baris) memiliki nilai yang hilang (dalam tablix kompleks dengan grup kolom / baris dan nilai yang hilang).

Solusi @ Aditya secara pintar memanfaatkan countDistincthasil runningValuefungsi untuk mengidentifikasi nomor baris dalam grup tablix (baris). Jika Anda memiliki baris tablix dengan nilai yang hilang di sel pertama, runningValuetidak akan menambah countDistincthasil dan itu akan mengembalikan nomor baris sebelumnya (dan, karenanya, akan memengaruhi pemformatan sel itu). Untuk memperhitungkan itu, Anda harus menambahkan istilah tambahan untuk mengimbangi countDistinctnilai. Yang saya ambil adalah memeriksa nilai running pertama di grup baris itu sendiri (lihat baris 3 dari cuplikan di bawah):

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

Semoga ini membantu.

rpyzh
sumber
Terima kasih @ rpyzh, ini adalah solusi yang berfungsi untuk grup multi-baris saya dengan laporan grup baris induk biasa!
Niallty
1

Bisakah seseorang menjelaskan logika di balik membalikkan bidang ke false dalam kode di bawah ini (dari posting di atas)

Satu hal yang saya perhatikan adalah bahwa tidak satu pun dari dua metode teratas memiliki gagasan tentang apa warna baris pertama harus dalam kelompok; grup hanya akan mulai dengan warna yang berlawanan dari baris terakhir dari grup sebelumnya. Saya ingin grup saya selalu mulai dengan warna yang sama ... baris pertama dari setiap grup harus selalu putih, dan baris berikutnya diwarnai.

Konsep dasarnya adalah mengatur ulang sakelar ketika setiap grup dimulai, jadi saya menambahkan sedikit kode:

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

Jadi saya memiliki tiga jenis latar belakang sel sekarang:

  1. Kolom pertama baris data memiliki = Code.AlternateColor ("AliceBlue", "White", True) (Ini sama dengan jawaban sebelumnya.)
  2. Kolom baris data yang tersisa memiliki = Code.AlternateColor ("AliceBlue", "White", False) (Ini, juga, sama dengan jawaban sebelumnya.)
  3. Kolom pertama dari baris pengelompokan memiliki = Code.RestartColor ("AliceBlue") (Ini baru.)
  4. Kolom baris pengelompokan yang tersisa memiliki = Code.AlternateColor ("AliceBlue", "White", False) (Ini digunakan sebelumnya, tetapi tidak disebutkan untuk pengelompokan baris.)

Ini bekerja untuk saya. Jika Anda ingin baris pengelompokan menjadi tidak berwarna, atau warna yang berbeda, harus cukup jelas dari ini cara mengubahnya.

Jangan ragu untuk menambahkan komentar tentang apa yang bisa dilakukan untuk meningkatkan kode ini: Saya baru untuk SSRS dan VB, jadi saya sangat curiga bahwa ada banyak ruang untuk perbaikan, tetapi ide dasarnya tampak bagus (dan itu berguna untuk saya) jadi saya ingin membuangnya di sini.

misha
sumber
1

Saya mencoba semua solusi ini pada Tablix yang Dikelompokkan dengan spasi baris dan tidak ada yang berfungsi di seluruh laporan. Hasilnya adalah duplikat baris berwarna dan solusi lainnya menghasilkan kolom bergantian!

Berikut adalah fungsi yang saya tulis yang berfungsi untuk saya menggunakan Jumlah Kolom:

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

Untuk 7 Kolom Tablix, saya menggunakan ungkapan ini untuk Row (of Cells) Backcolour:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Jeremy Thompson
sumber
0

Data matriks saya memiliki nilai yang hilang di dalamnya, jadi saya tidak bisa mendapatkan solusi ahmad untuk bekerja, tetapi solusi ini berhasil untuk saya

Ide dasarnya adalah membuat grup anak dan bidang pada grup terdalam Anda yang mengandung warna. Kemudian atur warna untuk setiap sel di baris berdasarkan nilai bidang itu.

Tinjuan kemarahan
sumber
Lihat @ Aditya dan jawaban saya untuk menangani nilai yang hilang dalam matriks. Berguna jika Anda sudah memiliki (atau mau membuat grup induk) palsu. Anda tidak perlu membuat bidang terpisah dengan cara itu.
rpyzh
0

Sedikit modifikasi jawaban lain dari sini yang bekerja untuk saya. Grup saya memiliki dua nilai untuk dikelompokkan, jadi saya dapat menempatkan keduanya di argumen pertama dengan tanda + untuk membuatnya berganti dengan benar

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

Saat menggunakan grup baris dan kolom keduanya, saya memiliki masalah di mana warna akan bergantian di antara kolom meskipun itu adalah baris yang sama. Saya menyelesaikan ini dengan menggunakan variabel global yang hanya berganti ketika baris berubah:

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

Sekarang, di kolom pertama dari baris yang ingin Anda ganti, atur ekspresi warna ke:

= Code.AlternateColor ()

-

Di kolom yang tersisa, atur semuanya ke:

= Code.BGColor

Ini akan membuat warna berganti hanya setelah kolom pertama digambar.

Ini dapat (secara tidak dapat diverifikasi) meningkatkan kinerja juga, karena tidak perlu melakukan perhitungan matematika untuk setiap kolom.

Eneerge
sumber