เพิ่มสีแถวสลับไปยังรายงานบริการรายงานของ SQL Server


142

คุณแรเงาแถวสลับในรายงานบริการรายงานของ SQL Server ได้อย่างไร


แก้ไข:มีพวงของคำตอบที่ดีที่ระบุด้านล่างเป็น - จากการที่รวดเร็วและง่ายที่จะซับซ้อนและครอบคลุม อนิจจาฉันสามารถเลือกเพียงหนึ่ง ...


2
= IIf (RowNumber (ไม่มีอะไร) Mod 2 = 0, "No Color", "# DDEBF7")
Stefan Steiger

หากคุณเลือกหลายเซลล์คุณไม่สามารถแก้ไขคุณสมบัติกล่องข้อความได้ แต่คุณสามารถเข้าถึงสีเติมในแผงคุณสมบัติและตั้งค่านิพจน์ที่นั่น!
kitsu.eb

คำตอบ:


213

ไปที่คุณสมบัติ BackgroundColor ของแถวของตารางแล้วเลือก "Expression ... "

ใช้นิพจน์นี้:

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

เคล็ดลับนี้สามารถนำไปใช้กับหลายพื้นที่ของรายงาน

และใน. NET 3.5+ คุณสามารถใช้:

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

ไม่ได้มองหาตัวแทน - ฉันเพิ่งค้นคว้าคำถามนี้ด้วยตัวเองและคิดว่าฉันจะแบ่งปัน


10
สิ่งนี้ล้มเหลวในบางสถานการณ์โดยเฉพาะในตารางและวัตถุเมทริกซ์ที่มีผลรวมย่อยจำนวนมาก การตอบสนองของ Catch22 ไม่มีข้อ จำกัด เหมือนกัน นอกจากนี้ยังสามารถใช้วิธีของ Catch22 เพื่อบังคับให้คอลัมน์ในเมทริกซ์มีสีสลับคอลัมน์ซึ่งมีประโยชน์เพียงครั้งเดียวในดวงจันทร์สีน้ำเงิน
ผู้ใช้ที่ลงทะเบียน

16
ฉันมักจะทำให้แน่ใจว่า upvote คนที่ตอบคำถามของตนเอง บ่อยครั้งที่ผู้ถามพบคำตอบด้วยตนเองแล้วไม่กลับมาโพสต์ทิ้งพวกเราที่เหลือซึ่งอาจมีคำถามเดียวกันในที่มืด เสียงโหยหาคุณ
Matt DiTrolio

4
เมื่อฉันใช้โค้ดข้างต้นที่ฉันได้รับข้อความแจ้งเตือนเช่นดูเหมือนว่าการแสดงออกที่ถูกต้องจะเป็น[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)ขอบคุณสำหรับเคล็ดลับแม้ว่า
รัสเซล B

2
สิ่งนี้จะทำให้เกิดปัญหาในกรณีของการจัดกลุ่มและมุมมองรายละเอียด

3
เบราว์เซอร์บางตัวไม่สามารถจัดการ "โปร่งใส" หรือ "ไม่มีอะไร" ทางออกที่ดีที่สุดคือใช้ "สีขาว"
Nate S.

89

การใช้ 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 นี้


รหัสข้างต้นจะถูกเพิ่มลงในส่วนรหัสของรายงานหรือไปยังหน้า behind รหัสในโครงการ VB.NET รวบรวมและปรับใช้เป็น DLL ที่มีการอ้างอิงเป็นแอสเซมบลี ฉันขอแนะนำให้ใช้ความพยายามพิเศษในการปรับใช้เป็น dll เนื่องจากคุณมักจะอ้างถึงสิ่งนี้ในรายงานจำนวนมาก
ผู้ใช้ที่ลงทะเบียน

นี่เป็นวิธีที่ฉันชอบสำหรับจัดการปัญหาการจัดกลุ่มหลังจากลองแฮ็กอื่น ๆ สองสามครั้ง มันไม่พังทลายลงเมื่อมีการใช้การเรียงลำดับเชิงโต้ตอบกับคอลัมน์ +1 และขอบคุณมาก
Rex Miller

สีจะถูกชดเชยเมื่อคุณมีจำนวนแถวคี่
K Richard

20
อย่าลืมเปลี่ยน "จริง" เป็น "เท็จ" สำหรับคอลัมน์ทั้งหมดในแถวหลังจากแรกมิฉะนั้นคุณจะเห็นผลกระดานหมากรุก! ขอบคุณสำหรับการแก้ปัญหา - มันใช้งานได้ดี!
Peter Mularien

Peter Mularien: ฉันมีปัญหานี้คุณช่วยอธิบายวิธีแก้ไขได้ไหม?
วิศวกรซอฟท์แวร์ Bill

65

ฉันได้รับเอฟเฟกต์หมากรุกเมื่อใช้โซลูชันของ Catch22 ฉันคิดว่าเพราะเมทริกซ์ของฉันมีมากกว่าหนึ่งคอลัมน์ในการออกแบบ การแสดงออกนั้นทำงานได้ดีสำหรับฉัน:

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")

13
คำตอบนี้สมควรได้รับความสนใจมากขึ้น - เป็นโซลูชันที่สะอาดซึ่งทำงานได้อย่างสมบูรณ์ในเมทริกซ์ที่มีกลุ่มแถวและกลุ่มคอลัมน์และไม่จำเป็นต้องใช้รหัสที่กำหนดเองในการทำงาน สวย!
Stefan Mohr

9
อันที่จริงมันใช้งานได้ดีแม้จะมีหลายคอลัมน์ แต่ไม่ใช่ถ้าคุณมีข้อมูล "หายไป" ในการจัดกลุ่ม ดังนั้นหากคุณมีข้อมูลที่มีข้อมูล 12 เดือนในปี 2550 แต่ไม่มีข้อมูลเดือนมกราคมในปี 2549 และจัดกลุ่มตามเดือนในแถวและปีในคอลัมน์การระบายสีปี 2549 จะถูกปิดลงหนึ่งครั้งเนื่องจาก RunningValue ได้รับ offsync เพราะแม้ว่าจะมี ยังคงอยู่ในกล่องเมทริกซ์สำหรับ "มกราคม 2006 ว่า" ไม่มีข้อมูลในชุดและ RunningValue ยังคงเหมือนเดิมไม่มีการเปลี่ยนแปลงสี ฯลฯ
ไคล์เฮล

2
@ahmad นี่ใกล้มาก ฉันมีปัญหาที่กล่องเปล่าใช้สีตรงข้าม ฉันจะแน่ใจได้อย่างไรว่ากล่องว่างเปล่ามีสีถูกต้อง?
FistOfFury

@ KyleHale คุณมีการแก้ไขสำหรับกล่องสีหายไปหรือไม่?
FistOfFury

2
@FistOfFury ทางออกเดียวที่ฉันรู้คือการตั้งค่า (โดยปกติคือ 0) สำหรับข้อมูลที่หายไป
Kyle Hale

20

ฉันเปลี่ยนวิธีแก้ปัญหาของ @ 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))

สิ่งนี้แข็งแกร่งกว่าการเปลี่ยนสีด้วยตนเองในสีพื้นหลังของแต่ละฟิลด์


1
นอกจากนี้มีความสุขในหัวข้อนี้! ฉันไม่ต้องการตั้งค่า "จริง" หรือ "เท็จ" ในแต่ละคอลัมน์ ฉันยังชอบตัวเลือกของ "mod 3" เพื่อให้ฉันสามารถแรเงาเฉพาะทุกแถวที่ 3
Baodad

ฉันก็ชอบวิธีนี้ อย่างไรก็ตามมันไม่ทำงานสำหรับฉันเมื่อฉันใช้การจัดกลุ่มแถว วิธีการแก้ปัญหาของ @ ahmad ด้านบนทำงานสำหรับฉันแม้ว่า
Baodad

นี่เป็นทางออกที่ดีสำหรับแท็บเล็ตหากคุณไม่ต้องการเพิ่มฟิลด์เพิ่มเติมในชุดข้อมูลของคุณ!
clamchoda

16

สิ่งหนึ่งที่ฉันสังเกตเห็นได้ก็คือว่าไม่มีวิธีการสองอันดับแรกที่มีแนวคิดว่าสีแถวแรกควรอยู่ในกลุ่มแบบใด กลุ่มจะเริ่มต้นด้วยสีตรงข้ามจากบรรทัดสุดท้ายของกลุ่มก่อนหน้า ฉันต้องการให้กลุ่มของฉันเริ่มต้นด้วยสีเดียวกันเสมอ ... แถวแรกของแต่ละกลุ่มควรเป็นสีขาวเสมอและสีแถวถัดไป

แนวคิดพื้นฐานคือการรีเซ็ตสลับเมื่อแต่ละกลุ่มเริ่มต้นดังนั้นฉันจึงเพิ่มรหัสเล็กน้อย:

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

ดังนั้นตอนนี้ฉันมีภูมิหลังของเซลล์สามชนิดที่แตกต่างกัน:

  1. คอลัมน์แรกของแถวข้อมูลมี = Code.AlternateColor ("AliceBlue", "White", True) (นี่เป็นคำตอบเดียวกับคำตอบก่อนหน้านี้)
  2. คอลัมน์ที่เหลืออยู่ของแถวข้อมูลมี = Code.AlternateColor ("AliceBlue", "White", False) (นี่คือเหมือนกันกับคำตอบก่อนหน้านี้)
  3. คอลัมน์แรกของแถวการจัดกลุ่มมี = Code.RestartColor ("AliceBlue") (นี่คือใหม่)
  4. คอลัมน์ที่เหลือของแถวการจัดกลุ่มมี = Code.AlternateColor ("AliceBlue", "White", False) (ใช้ก่อนหน้านี้ แต่ไม่ได้กล่าวถึงเรื่องนี้สำหรับการจัดกลุ่มแถว)

มันใช้งานได้สำหรับฉัน หากคุณต้องการให้แถวการจัดกลุ่มเป็นแบบที่ไม่มีสีหรือสีที่แตกต่างกันก็ควรจะเห็นได้ชัดจากวิธีการเปลี่ยนแถวนี้

โปรดเพิ่มความคิดเห็นเกี่ยวกับสิ่งที่สามารถทำได้เพื่อปรับปรุงรหัสนี้: ฉันเป็นแบรนด์ใหม่ทั้ง SSRS และ VB ดังนั้นฉันสงสัยอย่างยิ่งว่ามีพื้นที่มากมายสำหรับการปรับปรุง แต่แนวคิดพื้นฐานดูเหมือนจะเป็นประโยชน์ (และเป็นประโยชน์ สำหรับฉัน) ดังนั้นฉันต้องการที่จะทิ้งมันไว้ที่นี่


คุณยังสามารถรีเซ็ตหมายเลขแถวสำหรับแต่ละกลุ่มดังที่อธิบายไว้ในคำตอบนี้
StackOverthrow

10

สำหรับกลุ่มหัวกระดาษ / ท้ายกระดาษ:

=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


8

วิธีแก้ปัญหาของ Michael Haren ใช้ได้ผลดีสำหรับฉัน อย่างไรก็ตามฉันได้รับคำเตือนว่า "โปร่งใส" ไม่ใช่ BackgroundColor ที่ถูกต้องเมื่อดูตัวอย่าง พบว่ามีการแก้ไขอย่างรวดเร็วจาก การตั้งค่า BackgroundColor ขององค์ประกอบรายงานใน SSRS ไม่มีอะไรใช้แทน "โปร่งใส"

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

สีขาวจะดีขึ้นแล้วไม่มีอะไร
Nate S.

6

วิธีที่มีประสิทธิภาพเพียงวิธีเดียวในการแก้ปัญหานี้โดยไม่ใช้ VB คือ "จัดเก็บ" ค่าการจัดกลุ่มแถวภายในโมดูโลการจัดกลุ่มแถว (และนอกการจัดกลุ่มคอลัมน์) และอ้างอิงอย่างชัดเจนภายในการจัดกลุ่มคอลัมน์ของคุณ ฉันพบโซลูชันนี้ที่

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

แต่ Ankeet ไม่ได้เป็นงานที่ดีที่สุดในการอธิบายสิ่งที่เกิดขึ้นและวิธีแก้ปัญหาของเขาแนะนำขั้นตอนที่ไม่จำเป็นในการสร้างการจัดกลุ่มตามค่าคงที่ดังนั้นนี่คือกระบวนการทีละขั้นตอนสำหรับเมทริกซ์ที่มีแถวกลุ่มแถว RowGroup1:

  1. สร้างคอลัมน์ใหม่ภายใน RowGroup1 เปลี่ยนชื่อกล่องข้อความสำหรับสิ่งนี้เป็น RowGroupColor
  2. ตั้งค่ากล่องข้อความของค่าของ RowGroupColor เป็น

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

  3. ตั้งค่าคุณสมบัติ BackgroundColor ของเซลล์แถวทั้งหมดของคุณเป็น

    "=ReportItems!RowGroupColor.Value"

  4. ตั้งค่าความกว้างของคอลัมน์ RowGroupColor เป็น 0pt และตั้งค่า CanGrow เป็น false เพื่อซ่อนจากไคลเอนต์

Voila! นอกจากนี้ยังแก้ปัญหาจำนวนมากที่กล่าวถึงในหัวข้อนี้:

  • ตั้งค่าอัตโนมัติสำหรับกลุ่มย่อย: เพียงแค่เพิ่มคอลัมน์ใหม่สำหรับ rowgroup ว่าการดำเนินการ RunningValueบนของค่ากลุ่ม
  • ไม่จำเป็นต้องกังวลเกี่ยวกับการสลับจริง / เท็จ
  • สีจัดขึ้นเพียงแห่งเดียวเพื่อการปรับเปลี่ยนที่ง่ายดาย
  • สามารถใช้แทนกันได้ในกลุ่มแถวหรือคอลัมน์ (เพียงตั้งค่าความสูงเป็น 0 แทนความกว้าง)

มันจะยอดเยี่ยมถ้า SSRS จะเปิดเผยคุณสมบัตินอกเหนือจากค่าในกล่องข้อความ คุณสามารถทำการคำนวณแบบนี้ได้ในคุณสมบัติ BackgroundColor ของกล่องข้อความกลุ่มแถวจากนั้นอ้างอิงเป็น ReportItems! RowGroup.BackgroundColor ในเซลล์อื่นทั้งหมด

อ่าเราสามารถฝันได้ ...


5

ปัญหาของฉันคือฉันต้องการให้คอลัมน์ทั้งหมดในแถวมีพื้นหลังเหมือนกัน ฉันจัดกลุ่มทั้งแถวและคอลัมน์และด้วยวิธีแก้ปัญหาสองอันดับแรกที่นี่ฉันได้แถวทั้งหมดในคอลัมน์ 1 ที่มีพื้นหลังเป็นสีแถวทั้งหมดในคอลัมน์ 2 มีพื้นหลังสีขาวแถวทั้งหมดในคอลัมน์ 3 ที่มีพื้นหลังเป็นสี และอื่น ๆ มันเหมือนกับว่า( RowNumberและbOddRowวิธีแก้ปัญหาของ Catch22) ให้ความสนใจกับกลุ่มคอลัมน์ของฉันแทนที่จะเพิกเฉยและเปลี่ยนเฉพาะแถวใหม่เท่านั้น

สิ่งที่ฉันต้องการคือให้คอลัมน์ทั้งหมดในแถวที่ 1 มีพื้นหลังสีขาวจากนั้นคอลัมน์ทั้งหมดในแถวที่ 2 จะมีพื้นหลังเป็นสีจากนั้นคอลัมน์ทั้งหมดในแถวที่ 3 จะมีพื้นหลังสีขาวและอื่น ๆ ฉันได้รับเอฟเฟกต์นี้โดยใช้คำตอบที่เลือก แต่แทนที่จะผ่านNothingไปRowNumberฉันก็ส่งชื่อกลุ่มคอลัมน์ของฉันเช่น

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

คิดว่านี่อาจเป็นประโยชน์กับคนอื่น


4

ฉันคิดว่าเคล็ดลับนี้ไม่ได้กล่าวถึงที่นี่ ดังนั้นนี่คือ

ในเมทริกซ์เชิงซ้อนประเภทใด ๆ เมื่อคุณต้องการสีของเซลล์อื่นไม่ว่าจะเป็นแถวที่ฉลาดหรือฉลาดก็คือวิธีการทำงาน

หากคุณต้องการสีสลับกันของเซลล์ coloumn ฉลาดแล้ว

  1. ที่มุมล่างขวาของมุมมองออกแบบรายงานใน "กลุ่มคอลัมน์" ให้สร้างกลุ่มหลักปลอมในวันที่ 1 (ใช้นิพจน์) ชื่อ "FakeParentGroup"
  2. จากนั้นในการออกแบบรายงานสำหรับเซลล์ที่จะระบายสีหรือให้ใช้นิพจน์สีพื้นหลังต่อไปนี้

= IIF (RunningValue (ฟิลด์! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")

นั่นคือทั้งหมด

เช่นเดียวกันสำหรับแถวสีอื่น ๆ ที่ชาญฉลาดเพียงแค่คุณต้องแก้ไขโซลูชันตามนั้น

หมายเหตุ: ที่นี่บางครั้งคุณจำเป็นต้องตั้งค่าเส้นขอบของเซลล์ตามปกติมันจะหายไป

อย่าลืมลบค่า 1 ในรายงานที่เข้ามาในรูปเมื่อคุณสร้างกลุ่มผู้ปกครองปลอม


1
คำตอบนี้เป็นการค้นพบที่ยอดเยี่ยมสำหรับผู้ที่ต้องสร้างแถบแถวในแถบที่ซับซ้อน! หากมีกลุ่มผู้ปกครองที่มีอยู่ใช้มัน มิฉะนั้นสร้าง FakeParentGroup ค่าที่หายไปใน tablixes ที่มีทั้งคอลัมน์และกลุ่มแถวมักจะสลัดการจัดรูปแบบ ดูคำตอบของฉันที่สร้างขึ้นใน @ Aditya เพื่อบัญชีสำหรับค่าที่ขาดหายไปในเซลล์แรก
rpyzh

2

หากสำหรับรายงานทั้งหมดที่คุณต้องการสีสลับคุณสามารถใช้ชุดข้อมูล Tablix ของคุณถูกผูกไว้กับ rownumber ข้อมูลประจำตัวทั้งรายงานในรายงานและใช้ในฟังก์ชัน RowNumber ...

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

2

@ คำตอบของ 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")

หวังว่านี่จะช่วยได้


ขอบคุณ @rpyzh นี่เป็นวิธีแก้ปัญหาที่ทำงานกับกลุ่มหลายแถวของฉันด้วยรายงานกลุ่มแถวหลักทั่วไป!
Niallty

1

มีคนอธิบายตรรกะที่อยู่เบื้องหลังการเปลี่ยนส่วนที่เหลือของฟิลด์เป็นเท็จในโค้ดด้านล่าง (จากโพสต์ด้านบน)

สิ่งหนึ่งที่ฉันสังเกตเห็นได้ก็คือว่าไม่มีวิธีการสองอันดับแรกที่มีแนวคิดว่าสีแถวแรกควรอยู่ในกลุ่มแบบใด กลุ่มจะเริ่มต้นด้วยสีตรงข้ามจากบรรทัดสุดท้ายของกลุ่มก่อนหน้า ฉันต้องการให้กลุ่มของฉันเริ่มต้นด้วยสีเดียวกันเสมอ ... แถวแรกของแต่ละกลุ่มควรเป็นสีขาวเสมอและสีแถวถัดไป

แนวคิดพื้นฐานคือการรีเซ็ตสลับเมื่อแต่ละกลุ่มเริ่มต้นดังนั้นฉันจึงเพิ่มรหัสเล็กน้อย:

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

ดังนั้นตอนนี้ฉันมีภูมิหลังของเซลล์สามชนิดที่แตกต่างกัน:

  1. คอลัมน์แรกของแถวข้อมูลมี = Code.AlternateColor ("AliceBlue", "White", True) (นี่เป็นคำตอบเดียวกับคำตอบก่อนหน้านี้)
  2. คอลัมน์ที่เหลืออยู่ของแถวข้อมูลมี = Code.AlternateColor ("AliceBlue", "White", False) (นี่คือเหมือนกันกับคำตอบก่อนหน้านี้)
  3. คอลัมน์แรกของแถวการจัดกลุ่มมี = Code.RestartColor ("AliceBlue") (นี่คือใหม่)
  4. คอลัมน์ที่เหลือของแถวการจัดกลุ่มมี = Code.AlternateColor ("AliceBlue", "White", False) (ใช้ก่อนหน้านี้ แต่ไม่ได้กล่าวถึงเรื่องนี้สำหรับการจัดกลุ่มแถว)

มันใช้งานได้สำหรับฉัน หากคุณต้องการให้แถวการจัดกลุ่มเป็นแบบที่ไม่มีสีหรือสีที่แตกต่างกันก็ควรจะเห็นได้ชัดจากวิธีการเปลี่ยนแถวนี้

โปรดเพิ่มความคิดเห็นเกี่ยวกับสิ่งที่สามารถทำได้เพื่อปรับปรุงรหัสนี้: ฉันเป็นแบรนด์ใหม่ทั้ง SSRS และ VB ดังนั้นฉันสงสัยอย่างยิ่งว่ามีพื้นที่มากมายสำหรับการปรับปรุง แต่แนวคิดพื้นฐานดูเหมือนจะเป็นประโยชน์ (และเป็นประโยชน์ สำหรับฉัน) ดังนั้นฉันต้องการที่จะทิ้งมันไว้ที่นี่


1

ฉันลองวิธีแก้ปัญหาทั้งหมดเหล่านี้ใน 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)


0

ข้อมูลเมทริกซ์ของฉันมีค่าที่หายไปดังนั้นฉันจึงไม่สามารถใช้วิธีแก้ปัญหาของ ahmad ได้ แต่วิธีนี้ใช้ได้ผลสำหรับฉัน

แนวคิดพื้นฐานคือการสร้างกลุ่มลูกและเขตข้อมูลในกลุ่มด้านในสุดของคุณที่มีสี จากนั้นตั้งค่าสีสำหรับแต่ละเซลล์ในแถวตามค่าของฟิลด์นั้น


ลองใช้ @ Aditya และคำตอบของฉันเพื่อจัดการกับค่าที่ขาดหายไปในเมทริกซ์ มีประโยชน์ถ้าคุณมี (หรือเต็มใจที่จะสร้างกลุ่มผู้ปกครองปลอม) อยู่แล้ว คุณไม่จำเป็นต้องสร้างเขตข้อมูลแยกด้วยวิธีนี้
rpyzh

0

การดัดแปลงคำตอบอื่น ๆ เล็กน้อยจากที่นี่ซึ่งเหมาะกับฉัน กลุ่มของฉันมีค่าสองค่าที่จะจัดกลุ่มดังนั้นฉันจึงสามารถใส่พวกเขาทั้งคู่ในอาร์กิวเมนต์แรกที่มีเครื่องหมาย + เพื่อให้สลับอย่างถูกต้อง

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

0

เมื่อใช้ทั้งกลุ่มแถวและคอลัมน์ฉันมีปัญหาที่สีจะสลับระหว่างคอลัมน์แม้ว่าจะเป็นแถวเดียวกัน ฉันแก้ไขปัญหานี้โดยใช้ตัวแปรโกลบอลที่สลับเฉพาะเมื่อแถวเปลี่ยน:

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

สิ่งนี้จะทำให้สีสลับหลังจากวาดคอลัมน์แรกแล้วเท่านั้น

สิ่งนี้อาจ (ไม่สามารถตรวจสอบได้) ปรับปรุงประสิทธิภาพเช่นกันเนื่องจากไม่จำเป็นต้องทำการคำนวณทางคณิตศาสตร์สำหรับแต่ละคอลัมน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.