SQL Server Reporting Servicesレポートに交互の行の色を追加する


142

SQL Server Reporting Servicesレポートで交互の行をどのようにシェーディングしますか?


編集:以下にリストされているたくさんの良い答えがあります- 迅速シンプルなものから複雑で包括的なものまで。ああ、私は1つしか選択できません...


2
= IIf(RowNumber(Nothing)Mod 2 = 0、 "No Color"、 "#DDEBF7")
Stefan Steiger

複数のセルを選択した場合、テキストボックスのプロパティは編集できませんが、プロパティパネルで塗りつぶしの色にアクセスして式を設定できます。
kitsu.eb 2017

回答:


213

テーブル行のBackgroundColorプロパティに移動し、[式...]を選択します

次の式を使用します。

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

このトリックは、レポートの多くの領域に適用できます。

そして.NET 3.5以降では、以下を使用できます。

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

担当者を探していません。この質問を自分で調査し、共有したいと思いました。


10
これは、特定の状況で失敗します。特に、テーブルや小計の多いマトリックスオブジェクトでは失敗します。Catch22の応答には同じ制限はありません。また、Catch22のメソッドを使用して、マトリックスの列に交互に列の色を持たせることができます。これは、ブルームーンで一度だけ役立ちます。
登録ユーザー

16
私はいつも自分の質問に答える人に賛成投票するようにしています。多くの場合、質問者は自分で答えを見つけた後、それを投稿するために戻ることはなく、同じ質問をする可能性のある残りの人は暗闇の中に残ります。あなたのためのバンプ、サー。
Matt DiTrolio、2011

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
一部のブラウザは、「透明」または「何も」を処理できません。最善の策は、「ホワイト」を使用することです
ネイト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の記事をご覧ください


上記のコードは、レポートの[コード]セクションまたはVB.NETプロジェクトのコードビハインドページに追加され、コンパイルされ、アセンブリとして参照されるDLLとして配置されます。多数のレポートでこれを一般的に参照するため、これをdllとして展開するために余分な労力をかけることをお勧めします。
登録ユーザー

これは、他のいくつかのハックを試した後、グループ化の問題を処理するための私の好ましい方法です。インタラクティブな並べ替えが列に適用されている場合は、機能しません。+1と感謝します。
レックスミラー

行の数が奇数の場合、色はオフセットされます。
Kリチャード

20
最初の行の後の行のすべての列の「True」を「False」に変更することを忘れないでください。そうしないと、チェッカーボード効果が表示されます!解決策をありがとう-それはうまくいきます!
Peter Mularien 2011年

Peter Mularien:私はこの問題を抱えています、それを修正する方法を説明できますか?
Bill Software Engineer

65

Catch22のソリューションを使用したときにチェス効果が得られたのは、私のマトリックスのデザインに複数の列があるためだと思います。その表現は私にとってうまくいきました:

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

13
この答えはもっと注目に値します-これは行グループと列グループを持つマトリックスで完全に機能するクリーンなソリューションであり、動作するためにカスタムコードを必要としません。綺麗な!
Stefan Mohr

9
実際、これは複数の列でも問題なく機能しますが、グループ化で「欠落」しているデータがある場合は機能しません。したがって、2007年には12か月のデータがあり、2006年には1月のデータがないデータがあり、行で月、列で年でグループ化した場合、RunningValueは非同期になるため、2006のカラーリングは1つずれます。 「2006年1月」など、そこにはデータがセットでいないとRunningValueは同じまま、色の変化のための行列で、まだボックス
カイル・ヘイル

2
@ahmadこれはとても近いです。空のボックスが反対の色を使用するという問題があります。空のボックスが適切に色付けされるようにするにはどうすればよいですか?
FistOfFury、2013

@KyleHale不足しているボックスのカラーリングの修正はありますか?
FistOfFury

2
@FistOfFury私が知っている唯一の解決策は、欠損データに対して値が設定されていること(通常は0)を確認することです。
カイルヘイル

20

@ Catch22のソリューションを変更しました。色の1つを変更したい場合に、各フィールドに移動する必要があるという考えが少し好きではないので。これは、色変数を変更する必要のあるフィールドが多数あるレポートでは特に重要です。

'*************************************************************************
' -- 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
このスレッドにいい追加!各列に「True」または「False」を設定する必要がないのが好きです。「mod 3」のオプションも好きなので、3行ごとにのみシェーディングできます。
Baodad 2013年

私もこの解決策が好きです。ただし、行のグループ化を使用すると、機能しません。上記の@ahmadの解決策は私にとってもうまくいきました。
Baodad 2016年

DataSetにフィールドを追加したくない場合、これはTablixの優れたソリューションです。
clamchoda

16

私が気づいたことの1つは、上位2つの方法のどちらにも、最初の行をグループのどの色にするかという概念がないことです。グループは、前のグループの最後の行とは反対の色で始まります。グループを常に同じ色で開始したかったのですが、各グループの最初の行は常に白で、次の行は色である必要があります。

基本的なコンセプトは、各グループの開始時にトグルをリセットすることでしたので、少しコードを追加しました:

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

だから私は今3つの異なる種類のセルの背景を持っています:

  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 2018

10

グループヘッダー/フッターの場合:

=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


8

マイケルハーレンの解決策は私にとってはうまくいきます。ただし、プレビュー時に「透明」は有効な背景色ではないという警告が表示されました。SSRSのReport要素のBackgroundColorの設定からクイックフィックスが見つかりました 。「透明」の代わりに何も使用しない

= 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は何が起こっているのかを説明するのに最適ではありません。彼の解決策は、定数値にグループ化を作成する不要な手順を推奨しているため、ここでは、行グループが1つの行グループ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に設定して、クライアントから非表示にします。

出来上がり!これにより、このスレッドで言及されている多くの問題も解決されます。

  • サブグループの自動リセット:その行グループに新しい列を追加し、そのグループ値に対してRunningValueを実行し ます。
  • True / Falseの切り替えについて心配する必要はありません。
  • 簡単に変更できるように、色は1か所だけで保持されます。
  • 行または列グループで交換可能に使用できます(幅の代わりに高さを0に設定するだけ)

SSRSがTextboxのValue以外のプロパティを公開することは素晴らしいことです。この種の計算を行グループのテキストボックスのBackgroundColorプロパティに詰め込んで、他のすべてのセルでReportItems!RowGroup.BackgroundColorとして参照することができます。

ああ、私たちは夢見ることができます...


5

私の問題は、行内のすべての列に同じ背景を使用することでした。私は行と列の両方でグループ化しました。ここでの上位2つの解決策では、列1のすべての行に色付きの背景、列2のすべての行に白の背景、列3のすべての行に色付きの背景を取得しました、 等々。かのようだRowNumberbOddRowし、唯一の新しい行を交互にすることを注意を払う(Catch22のソリューションの)私の列グループの代わりに、無視します。

私が欲しかったのは、行1のすべての列の背景を白にし、行2のすべての列に背景の色を付け、行3のすべての列に背景を白にするなどです。私が選択した答えを使って、この効果を得たが、代わりに渡すのNothingRowNumber、私は私の列グループ、例えばの名前が渡さ

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

これは他の誰かに役立つかもしれないと思った。


4

このトリックについてはここでは説明しません。ここにあります

任意のタイプの複雑な行列で、行ごとまたは列ごとのセルの色を交互にしたい場合、解決策は次のとおりです。

コラムのセルの代替色が必要な場合は、

  1. レポートのデザインビューの右下隅にある[列グループ]で、1に(式を使用して) "FakeParentGroup"という名前の偽の親グループを作成します。
  2. 次に、レポートデザインで、別の方法で色を付けるセルについて、次の背景色の表現を使用します。

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

それで全部です。

代替色の行についても同じですが、それに応じてソリューションを編集する必要があります。

注:ここでは、セルの境界線を適宜設定する必要がある場合があり、通常は消えます。

また、偽の親グループを作成したときにpicに入ってきたレポートの値1を削除することを忘れないでください。


1
この答えは、複雑なTablixで行のバンディングを作成する必要がある人にとって間違いなく素晴らしい発見です!既存の親グループがある場合は、それを使用します。それ以外の場合は、FakeParentGroupを作成します。列グループと行グループの両方を持つtablixの欠損値は、通常、書式設定を無効にします。@Adityaに基づいて、最初のセルの欠損値を説明する私の答えを参照してください。
rpyzh 2014年

2

レポート全体で代替色が必要な場合は、Tablixがバインドされているデータセットを使用して、レポートのレポート全体のID行番号を取得し、RowNumber関数で使用できます。

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

2

@Adityaの答えは素晴らしいですが、行の最初のセル(行の背景の書式設定)に欠損値がある場合(列/行グループと欠損値のある複雑なTablixで)、書式が失われる場合があります。

@Aditya のソリューションcountDistinctは、runningValue関数の結果を巧みに活用して、Tablix(行)グループ内の行番号を識別します。最初のセルに欠損値のあるTablix行がある場合、runningValuecountDistinct結果をインクリメントせず、前の行の番号を返します(したがって、そのセルのフォーマットに影響します)。これを考慮するには、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、2018年

1

誰かが残りのフィールドをfalseに変換する背後のロジックを以下のコードで説明できますか(上記の投稿から)

私が気づいたことの1つは、上位2つの方法のどちらにも、最初の行をグループのどの色にするかという概念がないことです。グループは、前のグループの最後の行とは反対の色で始まります。グループを常に同じ色で開始したかったのですが、各グループの最初の行は常に白で、次の行は色である必要があります。

基本的なコンセプトは、各グループの開始時にトグルをリセットすることでしたので、少しコードを追加しました:

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

だから私は今3つの異なる種類のセルの背景を持っています:

  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

7列のTablixの場合、(セルの)行の背景色に次の式を使用します。

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


0

私のマトリックスデータには欠損値が含まれていたため、ahmadのソリューションを機能させることができませんでしたが、このソリューションはうまくいきました

基本的な考え方は、色を含む最も内側のグループに子グループとフィールドを作成することです。次に、そのフィールドの値に基づいて、行の各セルの色を設定します。


@Adityaと私の答えをチェックして、マトリックスの欠損値を処理してください。すでに親グループを持っている(または偽の作成を希望している)場合に役立ちます。この方法で別のフィールドを作成する必要はありません。
rpyzh

0

私のために働いたここからの他の答えのわずかな修正。私のグループにはグループ化する値が2つあるので、最初の引数に+を付けて両方を配置し、それを正しく交互に配置することができました

= 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.