คุณแรเงาแถวสลับในรายงานบริการรายงานของ SQL Server ได้อย่างไร
แก้ไข:มีพวงของคำตอบที่ดีที่ระบุด้านล่างเป็น - จากการที่รวดเร็วและง่ายที่จะซับซ้อนและครอบคลุม อนิจจาฉันสามารถเลือกเพียงหนึ่ง ...
คุณแรเงาแถวสลับในรายงานบริการรายงานของ SQL Server ได้อย่างไร
แก้ไข:มีพวงของคำตอบที่ดีที่ระบุด้านล่างเป็น - จากการที่รวดเร็วและง่ายที่จะซับซ้อนและครอบคลุม อนิจจาฉันสามารถเลือกเพียงหนึ่ง ...
คำตอบ:
ไปที่คุณสมบัติ BackgroundColor ของแถวของตารางแล้วเลือก "Expression ... "
ใช้นิพจน์นี้:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
เคล็ดลับนี้สามารถนำไปใช้กับหลายพื้นที่ของรายงาน
และใน. NET 3.5+ คุณสามารถใช้:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
ไม่ได้มองหาตัวแทน - ฉันเพิ่งค้นคว้าคำถามนี้ด้วยตัวเองและคิดว่าฉันจะแบ่งปัน
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
=IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
ขอบคุณสำหรับเคล็ดลับแม้ว่า
การใช้ IIF (RowNumber ... ) สามารถนำไปสู่ปัญหาบางอย่างเมื่อแถวถูกจัดกลุ่มและอีกทางเลือกหนึ่งคือการใช้ฟังก์ชัน VBScript อย่างง่ายเพื่อกำหนดสี
มันเป็นความพยายามอีกเล็กน้อย แต่เมื่อการแก้ปัญหาพื้นฐานไม่พอเพียงมันเป็นทางเลือกที่ดี
โดยทั่วไปคุณเพิ่มรหัสในรายงานดังนี้ ...
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
จากนั้นในแต่ละเซลล์ให้ตั้งค่า BackgroundColor ดังนี้:
=Code.AlternateColor("AliceBlue", "White", True)
รายละเอียดแบบเต็มอยู่ในบทความ Wrox นี้
ฉันได้รับเอฟเฟกต์หมากรุกเมื่อใช้โซลูชันของ Catch22 ฉันคิดว่าเพราะเมทริกซ์ของฉันมีมากกว่าหนึ่งคอลัมน์ในการออกแบบ การแสดงออกนั้นทำงานได้ดีสำหรับฉัน:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
ฉันเปลี่ยนวิธีแก้ปัญหาของ @ Catch22 เล็กน้อยเพราะฉันไม่ชอบความคิดที่จะเข้าไปในแต่ละฟิลด์ถ้าฉันตัดสินใจว่าฉันต้องการเปลี่ยนสีใดสีหนึ่ง นี่เป็นสิ่งสำคัญอย่างยิ่งในรายงานที่มีฟิลด์จำนวนมากที่ต้องเปลี่ยนตัวแปรสี
'*************************************************************************
' -- 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
สังเกตเห็นว่าฉันได้เปลี่ยนฟังก์ชั่นจากหนึ่งที่ยอมรับสีเป็นหนึ่งที่มีสีที่จะใช้
จากนั้นในแต่ละฟิลด์เพิ่ม:
=Code.AlternateColor(rownumber(nothing))
สิ่งนี้แข็งแกร่งกว่าการเปลี่ยนสีด้วยตนเองในสีพื้นหลังของแต่ละฟิลด์
สิ่งหนึ่งที่ฉันสังเกตเห็นได้ก็คือว่าไม่มีวิธีการสองอันดับแรกที่มีแนวคิดว่าสีแถวแรกควรอยู่ในกลุ่มแบบใด กลุ่มจะเริ่มต้นด้วยสีตรงข้ามจากบรรทัดสุดท้ายของกลุ่มก่อนหน้า ฉันต้องการให้กลุ่มของฉันเริ่มต้นด้วยสีเดียวกันเสมอ ... แถวแรกของแต่ละกลุ่มควรเป็นสีขาวเสมอและสีแถวถัดไป
แนวคิดพื้นฐานคือการรีเซ็ตสลับเมื่อแต่ละกลุ่มเริ่มต้นดังนั้นฉันจึงเพิ่มรหัสเล็กน้อย:
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
ดังนั้นตอนนี้ฉันมีภูมิหลังของเซลล์สามชนิดที่แตกต่างกัน:
มันใช้งานได้สำหรับฉัน หากคุณต้องการให้แถวการจัดกลุ่มเป็นแบบที่ไม่มีสีหรือสีที่แตกต่างกันก็ควรจะเห็นได้ชัดจากวิธีการเปลี่ยนแถวนี้
โปรดเพิ่มความคิดเห็นเกี่ยวกับสิ่งที่สามารถทำได้เพื่อปรับปรุงรหัสนี้: ฉันเป็นแบรนด์ใหม่ทั้ง SSRS และ VB ดังนั้นฉันสงสัยอย่างยิ่งว่ามีพื้นที่มากมายสำหรับการปรับปรุง แต่แนวคิดพื้นฐานดูเหมือนจะเป็นประโยชน์ (และเป็นประโยชน์ สำหรับฉัน) ดังนั้นฉันต้องการที่จะทิ้งมันไว้ที่นี่
สำหรับกลุ่มหัวกระดาษ / ท้ายกระดาษ:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
คุณยังสามารถใช้สิ่งนี้เพื่อ“ รีเซ็ต” จำนวนแถวสีในแต่ละกลุ่ม ฉันต้องการให้แถวรายละเอียดแรกในแต่ละกลุ่มย่อยเริ่มต้นด้วย White และโซลูชันนี้ (เมื่อใช้กับแถวรายละเอียด) อนุญาตให้เกิดขึ้นได้:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
ดู: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
วิธีแก้ปัญหาของ Michael Haren ใช้ได้ผลดีสำหรับฉัน อย่างไรก็ตามฉันได้รับคำเตือนว่า "โปร่งใส" ไม่ใช่ BackgroundColor ที่ถูกต้องเมื่อดูตัวอย่าง พบว่ามีการแก้ไขอย่างรวดเร็วจาก การตั้งค่า BackgroundColor ขององค์ประกอบรายงานใน SSRS ไม่มีอะไรใช้แทน "โปร่งใส"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
วิธีที่มีประสิทธิภาพเพียงวิธีเดียวในการแก้ปัญหานี้โดยไม่ใช้ VB คือ "จัดเก็บ" ค่าการจัดกลุ่มแถวภายในโมดูโลการจัดกลุ่มแถว (และนอกการจัดกลุ่มคอลัมน์) และอ้างอิงอย่างชัดเจนภายในการจัดกลุ่มคอลัมน์ของคุณ ฉันพบโซลูชันนี้ที่
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
แต่ Ankeet ไม่ได้เป็นงานที่ดีที่สุดในการอธิบายสิ่งที่เกิดขึ้นและวิธีแก้ปัญหาของเขาแนะนำขั้นตอนที่ไม่จำเป็นในการสร้างการจัดกลุ่มตามค่าคงที่ดังนั้นนี่คือกระบวนการทีละขั้นตอนสำหรับเมทริกซ์ที่มีแถวกลุ่มแถว RowGroup1:
ตั้งค่ากล่องข้อความของค่าของ RowGroupColor เป็น
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
ตั้งค่าคุณสมบัติ BackgroundColor ของเซลล์แถวทั้งหมดของคุณเป็น
"=ReportItems!RowGroupColor.Value"
Voila! นอกจากนี้ยังแก้ปัญหาจำนวนมากที่กล่าวถึงในหัวข้อนี้:
มันจะยอดเยี่ยมถ้า SSRS จะเปิดเผยคุณสมบัตินอกเหนือจากค่าในกล่องข้อความ คุณสามารถทำการคำนวณแบบนี้ได้ในคุณสมบัติ BackgroundColor ของกล่องข้อความกลุ่มแถวจากนั้นอ้างอิงเป็น ReportItems! RowGroup.BackgroundColor ในเซลล์อื่นทั้งหมด
อ่าเราสามารถฝันได้ ...
ปัญหาของฉันคือฉันต้องการให้คอลัมน์ทั้งหมดในแถวมีพื้นหลังเหมือนกัน ฉันจัดกลุ่มทั้งแถวและคอลัมน์และด้วยวิธีแก้ปัญหาสองอันดับแรกที่นี่ฉันได้แถวทั้งหมดในคอลัมน์ 1 ที่มีพื้นหลังเป็นสีแถวทั้งหมดในคอลัมน์ 2 มีพื้นหลังสีขาวแถวทั้งหมดในคอลัมน์ 3 ที่มีพื้นหลังเป็นสี และอื่น ๆ มันเหมือนกับว่า( RowNumber
และbOddRow
วิธีแก้ปัญหาของ Catch22) ให้ความสนใจกับกลุ่มคอลัมน์ของฉันแทนที่จะเพิกเฉยและเปลี่ยนเฉพาะแถวใหม่เท่านั้น
สิ่งที่ฉันต้องการคือให้คอลัมน์ทั้งหมดในแถวที่ 1 มีพื้นหลังสีขาวจากนั้นคอลัมน์ทั้งหมดในแถวที่ 2 จะมีพื้นหลังเป็นสีจากนั้นคอลัมน์ทั้งหมดในแถวที่ 3 จะมีพื้นหลังสีขาวและอื่น ๆ ฉันได้รับเอฟเฟกต์นี้โดยใช้คำตอบที่เลือก แต่แทนที่จะผ่านNothing
ไปRowNumber
ฉันก็ส่งชื่อกลุ่มคอลัมน์ของฉันเช่น
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
คิดว่านี่อาจเป็นประโยชน์กับคนอื่น
ในเมทริกซ์เชิงซ้อนประเภทใด ๆ เมื่อคุณต้องการสีของเซลล์อื่นไม่ว่าจะเป็นแถวที่ฉลาดหรือฉลาดก็คือวิธีการทำงาน
หากคุณต้องการสีสลับกันของเซลล์ coloumn ฉลาดแล้ว
= IIF (RunningValue (ฟิลด์! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
นั่นคือทั้งหมด
เช่นเดียวกันสำหรับแถวสีอื่น ๆ ที่ชาญฉลาดเพียงแค่คุณต้องแก้ไขโซลูชันตามนั้น
หมายเหตุ: ที่นี่บางครั้งคุณจำเป็นต้องตั้งค่าเส้นขอบของเซลล์ตามปกติมันจะหายไป
อย่าลืมลบค่า 1 ในรายงานที่เข้ามาในรูปเมื่อคุณสร้างกลุ่มผู้ปกครองปลอม
หากสำหรับรายงานทั้งหมดที่คุณต้องการสีสลับคุณสามารถใช้ชุดข้อมูล Tablix ของคุณถูกผูกไว้กับ rownumber ข้อมูลประจำตัวทั้งรายงานในรายงานและใช้ในฟังก์ชัน RowNumber ...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
@ คำตอบของ Aditya นั้นยอดเยี่ยม แต่มีหลายกรณีที่การจัดรูปแบบจะถูกโยนทิ้งหากเซลล์แรกของแถว (สำหรับการจัดรูปแบบพื้นหลังแถว) มีค่าที่ขาดหายไป (ในแท็บที่ซับซ้อนที่มีกลุ่มคอลัมน์ / แถวและค่าที่ขาดหายไป)
วิธีการแก้ปัญหา @ Aditya ใช้ประโยชน์จากcountDistinct
ผลลัพธ์อย่างชาญฉลาดrunningValue
เพื่อระบุหมายเลขแถวภายในกลุ่มแท็บเล็ต (แถว) หากคุณมีแถว tablix ที่มีค่าขาดหายไปในเซลล์แรกrunningValue
จะไม่เพิ่มcountDistinct
ผลลัพธ์และจะส่งคืนหมายเลขแถวก่อนหน้า (และดังนั้นจะส่งผลต่อการจัดรูปแบบของเซลล์นั้น) ในการบัญชีสำหรับสิ่งนั้นคุณจะต้องเพิ่มคำเพิ่มเติมเพื่อชดเชยcountDistinct
ค่า ฉันใช้เพื่อตรวจสอบค่าการทำงานครั้งแรกในกลุ่มแถวเอง (ดูบรรทัดที่ 3 ของตัวอย่างด้านล่าง):
=iif(
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")
หวังว่านี่จะช่วยได้
มีคนอธิบายตรรกะที่อยู่เบื้องหลังการเปลี่ยนส่วนที่เหลือของฟิลด์เป็นเท็จในโค้ดด้านล่าง (จากโพสต์ด้านบน)
สิ่งหนึ่งที่ฉันสังเกตเห็นได้ก็คือว่าไม่มีวิธีการสองอันดับแรกที่มีแนวคิดว่าสีแถวแรกควรอยู่ในกลุ่มแบบใด กลุ่มจะเริ่มต้นด้วยสีตรงข้ามจากบรรทัดสุดท้ายของกลุ่มก่อนหน้า ฉันต้องการให้กลุ่มของฉันเริ่มต้นด้วยสีเดียวกันเสมอ ... แถวแรกของแต่ละกลุ่มควรเป็นสีขาวเสมอและสีแถวถัดไป
แนวคิดพื้นฐานคือการรีเซ็ตสลับเมื่อแต่ละกลุ่มเริ่มต้นดังนั้นฉันจึงเพิ่มรหัสเล็กน้อย:
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
ดังนั้นตอนนี้ฉันมีภูมิหลังของเซลล์สามชนิดที่แตกต่างกัน:
มันใช้งานได้สำหรับฉัน หากคุณต้องการให้แถวการจัดกลุ่มเป็นแบบที่ไม่มีสีหรือสีที่แตกต่างกันก็ควรจะเห็นได้ชัดจากวิธีการเปลี่ยนแถวนี้
โปรดเพิ่มความคิดเห็นเกี่ยวกับสิ่งที่สามารถทำได้เพื่อปรับปรุงรหัสนี้: ฉันเป็นแบรนด์ใหม่ทั้ง SSRS และ VB ดังนั้นฉันสงสัยอย่างยิ่งว่ามีพื้นที่มากมายสำหรับการปรับปรุง แต่แนวคิดพื้นฐานดูเหมือนจะเป็นประโยชน์ (และเป็นประโยชน์ สำหรับฉัน) ดังนั้นฉันต้องการที่จะทิ้งมันไว้ที่นี่
ฉันลองวิธีแก้ปัญหาทั้งหมดเหล่านี้ใน Tablix แบบกลุ่มที่มีการเว้นวรรคแถวและไม่มีการทำงานข้ามรายงานทั้งหมด ผลลัพธ์ที่ได้คือแถวสีที่ซ้ำกันและวิธีแก้ปัญหาอื่น ๆ ทำให้เกิดการสลับคอลัมน์!
นี่คือฟังก์ชั่นที่ฉันเขียนซึ่งทำงานให้ฉันโดยใช้การนับคอลัมน์:
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
สำหรับ Tablix 7 คอลัมน์ฉันใช้นิพจน์นี้สำหรับ Row (of Cells) Backcolour:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
เพียงเพราะไม่มีคำตอบข้างต้นดูเหมือนจะทำงานในเมทริกซ์ของฉันฉันโพสต์ที่นี่:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
ข้อมูลเมทริกซ์ของฉันมีค่าที่หายไปดังนั้นฉันจึงไม่สามารถใช้วิธีแก้ปัญหาของ ahmad ได้ แต่วิธีนี้ใช้ได้ผลสำหรับฉัน
แนวคิดพื้นฐานคือการสร้างกลุ่มลูกและเขตข้อมูลในกลุ่มด้านในสุดของคุณที่มีสี จากนั้นตั้งค่าสีสำหรับแต่ละเซลล์ในแถวตามค่าของฟิลด์นั้น
การดัดแปลงคำตอบอื่น ๆ เล็กน้อยจากที่นี่ซึ่งเหมาะกับฉัน กลุ่มของฉันมีค่าสองค่าที่จะจัดกลุ่มดังนั้นฉันจึงสามารถใส่พวกเขาทั้งคู่ในอาร์กิวเมนต์แรกที่มีเครื่องหมาย + เพื่อให้สลับอย่างถูกต้อง
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
เมื่อใช้ทั้งกลุ่มแถวและคอลัมน์ฉันมีปัญหาที่สีจะสลับระหว่างคอลัมน์แม้ว่าจะเป็นแถวเดียวกัน ฉันแก้ไขปัญหานี้โดยใช้ตัวแปรโกลบอลที่สลับเฉพาะเมื่อแถวเปลี่ยน:
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
ตอนนี้ในคอลัมน์แรกของแถวที่คุณต้องการสำรองตั้งค่านิพจน์สีเป็น:
= Code.AlternateColor ()
-
ในคอลัมน์ที่เหลือให้ตั้งค่าทั้งหมดเป็น:
= Code.BGColor
สิ่งนี้จะทำให้สีสลับหลังจากวาดคอลัมน์แรกแล้วเท่านั้น
สิ่งนี้อาจ (ไม่สามารถตรวจสอบได้) ปรับปรุงประสิทธิภาพเช่นกันเนื่องจากไม่จำเป็นต้องทำการคำนวณทางคณิตศาสตร์สำหรับแต่ละคอลัมน์