أضف لون الصف البديل إلى تقرير خدمات تقارير SQL Server

StackOverflow https://stackoverflow.com/questions/44376

سؤال

كيف يمكنك تظليل الصفوف البديلة في تقرير خدمات تقارير SQL Server؟


يحرر: هناك مجموعة من الإجابات الجيدة المدرجة أدناه - من سريع و بسيط ل معقدة وشاملة.للأسف لا أستطيع إلا أن أختار واحدا..

هل كانت مفيدة؟

المحلول

انتقل إلى خاصية لون الخلفية لصف الجدول واختر "التعبير..."

استخدم هذا التعبير:

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

يمكن تطبيق هذه الخدعة على العديد من مناطق التقرير.

وفي .NET 3.5+ يمكنك استخدام:

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

لا أبحث عن ممثل - لقد بحثت للتو في هذا السؤال بنفسي واعتقدت أنني سأشاركه.

نصائح أخرى

يمكن أن يؤدي استخدام 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

ثم في كل خلية، قم بتعيين لون الخلفية كما يلي:

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

التفاصيل الكاملة حول هذا مقالة روكس

حصلت على تأثير الشطرنج عندما استخدمت حل 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

لدي الآن ثلاثة أنواع مختلفة من خلفيات الخلايا:

  1. يحتوي العمود الأول من صف البيانات على =Code.AlternateColor("AliceBlue"، "White"، True) (وهذا هو نفس الإجابة السابقة.)
  2. الأعمدة المتبقية من صف البيانات تحتوي على =Code.AlternateColor("AliceBlue"، "White"، False) (وهذا أيضًا هو نفس الإجابة السابقة.)
  3. يحتوي العمود الأول من صف التجميع على =Code.RestartColor("AliceBlue") (هذا جديد.)
  4. الأعمدة المتبقية من صف التجميع لها =Code.AlternateColor("AliceBlue"، "White"، False) (تم استخدام هذا من قبل، ولكن لم يتم ذكره لتجميع الصف.)

هذا يعمل بالنسبة لي.إذا كنت تريد أن يكون صف التجميع غير ملون، أو بلون مختلف، فيجب أن يكون واضحًا إلى حد ما من هذا كيفية تغييره.

لا تتردد في إضافة تعليقات حول ما يمكن القيام به لتحسين هذا الكود:أنا جديد تمامًا على كل من SSRS وVB، لذا أعتقد بشدة أن هناك مجالًا كبيرًا للتحسين، لكن الفكرة الأساسية تبدو سليمة (وكانت مفيدة بالنسبة لي) لذا أردت طرحها هنا.

لرؤوس/تذييلات المجموعة:

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

يمكنك أيضًا استخدام هذا "لإعادة تعيين" عدد ألوان الصف داخل كل مجموعة.أردت أن يبدأ صف التفاصيل الأول في كل مجموعة فرعية باللون الأبيض وهذا الحل (عند استخدامه في صف التفاصيل) سمح بحدوث ذلك:

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

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

حل مايكل هارين يعمل بشكل جيد بالنسبة لي.ومع ذلك، تلقيت تحذيرًا يفيد بأن "اللون الشفاف" ليس لون خلفية صالحًا عند المعاينة.تم العثور على حل سريع منضبط لون الخلفية لعناصر التقرير في SSRS.لا تستخدم شيئًا بدلاً من "شفاف"

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

الطريقة الفعالة الوحيدة لحل هذه المشكلة دون استخدام VB هي "تخزين" قيمة وحدة تجميع الصفوف داخل تجميع الصفوف (وخارج تجميع الأعمدة) والإشارة إليها بشكل صريح داخل تجميع الأعمدة الخاصة بك.لقد وجدت هذا الحل في

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

لكن Ankeet ليس أفضل من يشرح ما يحدث، ويوصي حله بالخطوة غير الضرورية المتمثلة في إنشاء تجميع على قيمة ثابتة، لذا فإليك عمليتي خطوة بخطوة لمصفوفة تحتوي على مجموعة صف واحد RowGroup1:

  1. قم بإنشاء عمود جديد داخل RowGroup1.أعد تسمية مربع النص لهذا إلى شيء مثل RowGroupColor.
  2. قم بتعيين قيمة مربع النص الخاص بـ RowGroupColor على

    =iif(RunningValue(Fields![حقل مجموعة الصفوف].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  3. قم بتعيين خاصية لون الخلفية لجميع خلايا الصف الخاصة بك على

    "=ReportItems!RowGroupColor.Value"

  4. اضبط عرض عمود RowGroupColor على 0pt وقم بتعيين congrow على خطأ لإخفائه من العملاء.

هاهو!وهذا أيضًا يحل الكثير من المشاكل المذكورة في هذا الموضوع:

  • إعادة التعيين التلقائي للمجموعات الفرعية:فقط أضف عمودًا جديدًا لمجموعة الصفوف هذه ، وأداء أ قيمة التشغيل على إنه قيم المجموعة.
  • لا داعي للقلق بشأن تبديل الصواب/الخطأ.
  • يتم الاحتفاظ بالألوان في مكان واحد فقط لسهولة التعديل.
  • يمكن استخدامه بالتبادل في مجموعات الصفوف أو الأعمدة (فقط اضبط الارتفاع على 0 بدلاً من العرض)

سيكون أمرًا رائعًا أن يعرض SSRS الخصائص إلى جانب القيمة في مربعات النص.يمكنك فقط إدخال هذا النوع من العمليات الحسابية في خاصية لون الخلفية لمربعات نص مجموعة الصفوف ثم الرجوع إليها كـ ReportItems!RowGroup.BackgroundColor في كافة الخلايا الأخرى.

اه حسنًا ، يمكننا أن نحلم ...

كانت مشكلتي أنني أردت أن يكون لجميع الأعمدة المتتالية نفس الخلفية.لقد قمت بتجميع كل من الصف والعمود، وحصلت على أفضل حلين هنا الجميع الصفوف في العمود 1 بخلفية ملونة، وجميع الصفوف في العمود 2 بخلفية بيضاء، وجميع الصفوف في العمود 3 بخلفية ملونة، وهكذا.كما لو RowNumber و bOddRow (من حل Catch22) انتبه إلى مجموعة الأعمدة الخاصة بي بدلاً من تجاهل ذلك والتناوب فقط مع صف جديد.

ما أردته هو للجميع أعمدة في الصف 1 لتكون لها خلفية بيضاء، ثم جميع الأعمدة في الصف 2 لتكون لها خلفية ملونة، ثم جميع الأعمدة في الصف 3 لتكون لها خلفية بيضاء، وهكذا.لقد حصلت على هذا التأثير باستخدام الإجابة المحددة ولكن بدلاً من التمرير Nothing ل RowNumber, ، قمت بتمرير اسم مجموعة الأعمدة الخاصة بي، على سبيل المثال:

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

اعتقدت أن هذا قد يكون مفيدا لشخص آخر.

أعتقد أن هذه الخدعة لم تتم مناقشتها هنا.حتى هنا هو عليه،

في أي نوع من المصفوفة المعقدة ، عندما تريد ألوان خلايا بديلة ، إما صف من الحكمة أو العمود ، فإن الحل العمل هو ،

إذا كنت تريد لونًا بديلاً لعمود الخلايا،

  1. في الركن الأيمن السفلي من طريقة عرض تصميم التقرير ، في "مجموعات الأعمدة" ، قم بإنشاء مجموعة أولية مزيفة على 1 (باستخدام التعبير) ، المسماة "FakeParentGroup".
  2. ثم ، في تصميم التقرير ، للخلايا التي يجب تلوينها بدلاً من ذلك ، استخدم تعبير ألوان الخلفية التالي

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

هذا كل شئ.

نفس الشيء بالنسبة لصف الألوان البديل، فقط عليك تعديل الحل وفقًا لذلك.

ملحوظة:هنا، في بعض الأحيان تحتاج إلى تعيين حدود الخلايا وفقًا لذلك، وعادةً ما تختفي.

لا تنس أيضًا حذف القيمة 1 في التقرير الذي ظهر في الصورة عند إنشاء مجموعة أصلية مزيفة.

إذا كنت بحاجة إلى لون بديل للتقرير بأكمله، فيمكنك استخدام DataSet الذي يرتبط به Tablix الخاص بك للحصول على رقم صف الهوية على مستوى التقرير في التقرير واستخدام ذلك في وظيفة 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

لدي الآن ثلاثة أنواع مختلفة من خلفيات الخلايا:

  1. يحتوي العمود الأول من صف البيانات على =Code.AlternateColor("AliceBlue"، "White"، True) (وهذا هو نفس الإجابة السابقة.)
  2. الأعمدة المتبقية من صف البيانات تحتوي على =Code.AlternateColor("AliceBlue"، "White"، False) (وهذا أيضًا هو نفس الإجابة السابقة.)
  3. يحتوي العمود الأول من صف التجميع على =Code.RestartColor("AliceBlue") (هذا جديد.)
  4. الأعمدة المتبقية من صف التجميع لها =Code.AlternateColor("AliceBlue"، "White"، False) (تم استخدام هذا من قبل، ولكن لم يتم ذكره لتجميع الصف.)

هذا يعمل بالنسبة لي.إذا كنت تريد أن يكون صف التجميع غير ملون، أو بلون مختلف، فيجب أن يكون واضحًا إلى حد ما من هذا كيفية تغييره.

لا تتردد في إضافة تعليقات حول ما يمكن القيام به لتحسين هذا الكود:أنا جديد تمامًا على كل من 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 أعمدة، أستخدم هذا التعبير للون الخلفي للصف (الخلايا):

=Code.AlternateColorByColumnCount("LightGrey","White", 7)

فقط لأنه لا يبدو أن أيًا من الإجابات المذكورة أعلاه تعمل في المصفوفة الخاصة بي، فأنا أنشر هذا هنا:

http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html

كانت بيانات المصفوفة الخاصة بي تحتوي على قيم مفقودة، لذا لم أتمكن من تشغيل حل أحمد، ولكن عملت هذا الحل بالنسبة لي

الفكرة الأساسية هي إنشاء مجموعة فرعية وحقل في مجموعتك الأعمق يحتوي على اللون.ثم قم بتعيين اللون لكل خلية في الصف بناءً على قيمة هذا الحقل.

تعديل طفيف للإجابات الأخرى من هنا التي عملت بالنسبة لي.تحتوي مجموعتي على قيمتين للتجميع عليهما، لذلك تمكنت من وضعهما في الوسيطة الأولى باستخدام + لجعلها تتناوب بشكل صحيح

= 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

من المفترض أن يؤدي ذلك إلى جعل الألوان تتناوب فقط بعد رسم العمود الأول.

قد يؤدي هذا (بشكل لا يمكن التحقق منه) إلى تحسين الأداء أيضًا، لأنه لا يحتاج إلى إجراء حساب رياضي لكل عمود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top