Làm cách nào để tô bóng các hàng xen kẽ trong báo cáo Dịch vụ báo cáo SQL Server?
Chỉnh sửa: Có một loạt các câu trả lời hay được liệt kê dưới đây - từ nhanh chóng và đơn giản đến phức tạp và toàn diện . Than ôi, tôi chỉ có thể chọn một ...
Làm cách nào để tô bóng các hàng xen kẽ trong báo cáo Dịch vụ báo cáo SQL Server?
Chỉnh sửa: Có một loạt các câu trả lời hay được liệt kê dưới đây - từ nhanh chóng và đơn giản đến phức tạp và toàn diện . Than ôi, tôi chỉ có thể chọn một ...
Câu trả lời:
Chuyển đến thuộc tính BackgroundColor của hàng của bảng và chọn "Biểu thức ..."
Sử dụng biểu thức này:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Thủ thuật này có thể được áp dụng cho nhiều lĩnh vực của báo cáo.
Và trong .NET 3.5+ Bạn có thể sử dụng:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Không tìm kiếm đại diện - Tôi chỉ tự nghiên cứu câu hỏi này và nghĩ rằng tôi muốn chia sẻ.
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
như biểu thức chính xác =IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Cảm ơn các mẹo mặc dù.
Sử dụng IIF (RowNumber ...) có thể dẫn đến một số vấn đề khi các hàng đang được nhóm và một cách khác là sử dụng hàm VBScript đơn giản để xác định màu.
Đó là một nỗ lực hơn một chút nhưng khi giải pháp cơ bản không đủ, đó là một giải pháp thay thế tốt đẹp.
Về cơ bản, bạn thêm mã vào Báo cáo như sau ...
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
Sau đó, trên mỗi ô, đặt BackgroundColor như sau:
=Code.AlternateColor("AliceBlue", "White", True)
Chi tiết đầy đủ có trên bài viết này
Tôi đã có được hiệu ứng cờ vua khi tôi sử dụng giải pháp của Catch22, tôi nghĩ bởi vì ma trận của tôi có nhiều hơn một cột trong thiết kế. biểu hiện đó đã làm việc tốt với tôi:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Tôi đã thay đổi giải pháp của @ Catch22 Một chút vì tôi không thích ý tưởng phải đi vào từng lĩnh vực nếu tôi quyết định tôi muốn thay đổi một trong các màu. Điều này đặc biệt quan trọng trong các báo cáo có nhiều trường cần thay đổi biến màu.
'*************************************************************************
' -- 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
Lưu ý rằng tôi đã thay đổi chức năng từ một trong đó chấp nhận màu sắc sang một màu có chứa các màu được sử dụng.
Sau đó, trong mỗi lĩnh vực thêm:
=Code.AlternateColor(rownumber(nothing))
Điều này mạnh mẽ hơn nhiều so với việc thay đổi màu thủ công trong màu nền của từng trường.
Một điều tôi nhận thấy là cả hai phương pháp hàng đầu đều không có bất kỳ khái niệm nào về hàng màu đầu tiên nên có trong một nhóm; nhóm sẽ chỉ bắt đầu với màu đối diện từ dòng cuối cùng của nhóm trước. Tôi muốn các nhóm của mình luôn bắt đầu với cùng một màu ... hàng đầu tiên của mỗi nhóm phải luôn có màu trắng và hàng tiếp theo được tô màu.
Khái niệm cơ bản là đặt lại chuyển đổi khi mỗi nhóm bắt đầu, vì vậy tôi đã thêm một chút mã:
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
Vì vậy, bây giờ tôi có ba loại nền tế bào khác nhau:
Điều này làm việc cho tôi. Nếu bạn muốn hàng nhóm không có màu, hoặc một màu khác, thì điều này khá rõ ràng từ cách này để thay đổi nó xung quanh.
Xin vui lòng thêm ý kiến về những gì có thể được thực hiện để cải thiện mã này: Tôi hoàn toàn mới đối với cả SSRS và VB, vì vậy tôi nghi ngờ rằng có nhiều chỗ để cải thiện, nhưng ý tưởng cơ bản có vẻ hợp lý (và nó rất hữu ích cho tôi) vì vậy tôi muốn ném nó ra đây.
cho các tiêu đề / chân trang nhóm:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
Bạn cũng có thể sử dụng điều này để thiết lập lại cài đặt số đếm màu của hàng trong mỗi nhóm. Tôi muốn hàng chi tiết đầu tiên trong mỗi nhóm phụ bắt đầu với Trắng và giải pháp này (khi được sử dụng trên hàng chi tiết) cho phép điều đó xảy ra:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
Xem: http://msdn.microsoft.com/en-us/l Library / ms159136 (v = sql.100) .aspx
Giải pháp của Michael Haren hoạt động tốt với tôi. Tuy nhiên tôi nhận được một cảnh báo nói rằng "Trong suốt" không phải là một BackgroundColor hợp lệ khi Xem trước. Đã tìm thấy một bản sửa lỗi nhanh từ Cài đặt các phần tử BackgroundColor của Báo cáo trong SSRS . Không sử dụng gì thay vì "Trong suốt"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
Cách hiệu quả duy nhất để giải quyết vấn đề này mà không cần sử dụng VB là "lưu trữ" giá trị modulo nhóm hàng trong nhóm nhóm hàng (và bên ngoài nhóm cột) và tham chiếu rõ ràng trong nhóm nhóm của bạn. Tôi tìm thấy giải pháp này tại
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Nhưng Ankeet không phải là công việc tốt nhất để giải thích những gì đang xảy ra và giải pháp của anh ấy đề xuất bước không cần thiết là tạo một nhóm trên một giá trị không đổi, vì vậy đây là quy trình từng bước của tôi cho một ma trận với một nhóm hàng duy nhất Rowgroup1:
Đặt giá trị của hộp văn bản của RowgroupColor thành
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Đặt thuộc tính BackgroundColor của tất cả các ô hàng của bạn thành
"=ReportItems!RowGroupColor.Value"
Voila! Điều này cũng giải quyết rất nhiều vấn đề được đề cập trong chủ đề này:
Thật tuyệt vời nếu SSRS sẽ hiển thị các thuộc tính bên cạnh Giá trị trên Hộp văn bản. Bạn chỉ có thể nhét loại tính toán này vào thuộc tính BackgroundColor của các hộp văn bản nhóm hàng và sau đó tham chiếu nó dưới dạng ReportItems! Rowgroup.BackgroundColor trong tất cả các ô khác.
À, chúng ta có thể mơ ...
Vấn đề của tôi là tôi muốn tất cả các cột liên tiếp có cùng một nền tảng. Tôi đã nhóm cả hai theo hàng và theo cột và với hai giải pháp hàng đầu ở đây tôi đã nhận được tất cả các hàng trong cột 1 với nền màu, tất cả các hàng trong cột 2 có nền trắng, tất cả các hàng trong cột 3 có nền màu , và như thế. Như thể RowNumber
và bOddRow
(trong giải pháp của Catch22) chú ý đến nhóm cột của tôi thay vì bỏ qua điều đó và chỉ xen kẽ với một hàng mới.
Điều tôi muốn là tất cả các cột trong hàng 1 đều có nền trắng, sau đó tất cả các cột trong hàng 2 để có nền màu, sau đó tất cả các cột trong hàng 3 sẽ có nền trắng, v.v. Tôi đã có được hiệu ứng này bằng cách sử dụng câu trả lời đã chọn nhưng thay vì chuyển Nothing
đến RowNumber
, tôi đã chuyển tên của nhóm cột của mình, vd
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Nghĩ rằng điều này có thể hữu ích cho người khác.
Trong bất kỳ loại ma trận phức tạp nào, khi bạn muốn các màu ô thay thế, theo hàng thông minh hoặc cột khôn ngoan, giải pháp làm việc là,
Nếu bạn muốn một màu xen kẽ của các tế bào thì thông minh
= IIF (RunningValue (Các trường! [Cột GroupField] .Value, CountDistinc, "FakeParentgroup") MOD 2, "White", "LightGrey")
Đó là tất cả.
Tương tự cho hàng màu thay thế khôn ngoan, chỉ cần bạn phải chỉnh sửa giải pháp cho phù hợp.
LƯU Ý: Ở đây, đôi khi bạn cần đặt đường viền của các ô tương ứng, thường thì nó sẽ biến mất.
Cũng đừng quên xóa giá trị 1 trong báo cáo xuất hiện khi bạn tạo nhóm cha mẹ giả.
Câu trả lời của @ Aditya rất hay, nhưng có những trường hợp định dạng sẽ bị loại bỏ nếu ô đầu tiên của hàng (đối với định dạng nền hàng) có một giá trị bị thiếu (trong các tablixes phức tạp với các nhóm cột / hàng và thiếu giá trị).
Giải pháp của @ Aditya khéo léo tận dụng countDistinct
kết quả của runningValue
hàm để xác định số hàng trong nhóm tablix (hàng). Nếu bạn có các hàng tablix có giá trị bị thiếu trong ô đầu tiên, runningValue
sẽ không tăng countDistinct
kết quả và nó sẽ trả về số của hàng trước đó (và do đó, sẽ ảnh hưởng đến định dạng của ô đó). Để giải thích cho điều đó, bạn sẽ phải thêm một thuật ngữ bổ sung để bù countDistinct
giá trị. Việc của tôi là kiểm tra giá trị chạy đầu tiên trong chính nhóm hàng (xem dòng 3 của đoạn trích bên dưới):
=iif(
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")
Hi vọng điêu nay co ich.
Ai đó có thể giải thích logic đằng sau việc biến phần còn lại của các trường thành sai trong mã bên dưới (từ bài đăng trên)
Một điều tôi nhận thấy là cả hai phương pháp hàng đầu đều không có bất kỳ khái niệm nào về hàng màu đầu tiên nên có trong một nhóm; nhóm sẽ chỉ bắt đầu với màu đối diện từ dòng cuối cùng của nhóm trước. Tôi muốn các nhóm của mình luôn bắt đầu với cùng một màu ... hàng đầu tiên của mỗi nhóm phải luôn có màu trắng và hàng tiếp theo được tô màu.
Khái niệm cơ bản là đặt lại chuyển đổi khi mỗi nhóm bắt đầu, vì vậy tôi đã thêm một chút mã:
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
Vì vậy, bây giờ tôi có ba loại nền tế bào khác nhau:
Điều này làm việc cho tôi. Nếu bạn muốn hàng nhóm không có màu, hoặc một màu khác, thì điều này khá rõ ràng từ cách này để thay đổi nó xung quanh.
Xin vui lòng thêm ý kiến về những gì có thể được thực hiện để cải thiện mã này: Tôi hoàn toàn mới đối với cả SSRS và VB, vì vậy tôi nghi ngờ rằng có nhiều chỗ để cải thiện, nhưng ý tưởng cơ bản có vẻ hợp lý (và nó rất hữu ích cho tôi) vì vậy tôi muốn ném nó ra đây.
Tôi đã thử tất cả các giải pháp này trên Tablix được nhóm với các khoảng trắng hàng và không có giải pháp nào hoạt động trên toàn bộ báo cáo. Kết quả là các hàng màu trùng lặp và các giải pháp khác dẫn đến các cột xen kẽ!
Đây là chức năng tôi đã viết cho tôi khi sử dụng Đếm cột:
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
Đối với Tablix 7 cột, tôi sử dụng biểu thức này cho Back (của các ô) Backcolour:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Chỉ vì không có câu trả lời nào ở trên dường như hoạt động trong ma trận của tôi, tôi sẽ đăng bài này ở đây:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpOLL-table.html
Dữ liệu ma trận của tôi bị thiếu các giá trị trong đó, vì vậy tôi không thể làm cho giải pháp của ahmad hoạt động, nhưng giải pháp này hiệu quả với tôi
Ý tưởng cơ bản là tạo một nhóm con và trường trên nhóm trong cùng của bạn có chứa màu. Sau đó, đặt màu cho từng ô trong hàng dựa trên giá trị của trường đó.
Sửa đổi nhẹ các câu trả lời khác từ đây mà làm việc cho tôi. Nhóm của tôi có hai giá trị để nhóm, vì vậy tôi có thể đặt cả hai trong đối số đầu tiên với dấu + để làm cho nó thay thế chính xác
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
Khi sử dụng cả hai nhóm hàng và cột, tôi gặp vấn đề trong đó các màu sẽ xen kẽ giữa các cột mặc dù nó là cùng một hàng. Tôi đã giải quyết vấn đề này bằng cách sử dụng biến toàn cục chỉ thay thế khi hàng thay đổi:
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
Bây giờ, trong cột đầu tiên của hàng bạn muốn thay thế, hãy đặt biểu thức màu thành:
= Mã.AlternateColor ()
-
Trong các cột còn lại, đặt tất cả chúng thành:
= Mã.BGColor
Điều này sẽ làm cho các màu thay thế chỉ sau khi cột đầu tiên được vẽ.
Điều này cũng có thể (không đáng tin cậy) cải thiện hiệu suất, vì nó không cần phải tính toán cho mỗi cột.