SQL Server Reporting Servicesレポートの交互の行をどのようにシェーディングしますか?
編集:以下にリストされている良い答えがたくさんあります-迅速で単純なものから複雑で包括的なものまで。残念ながら、私は1つしか選択できません...
テーブル行のBackgroundColorプロパティに移動し、[式...]を選択します。
次の式を使用します。
= 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
次に、各セルで BackgroundColor を次のように設定します。
=Code.AlternateColor("AliceBlue", "White", True)
詳細については、このWrox の記事を参照してください。
Catch22 のソリューションを使用すると、チェス効果が得られました。これは、マトリックスに複数の列が設計されているためだと思います。その式は私にとってはうまくいきました:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
色の1つを変更したい場合、各フィールドに移動する必要があるという考えが気に入らないので、@ 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 つは、上の 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 種類のセルの背景があります。
これは私にとってはうまくいきます。グループ行を無色にしたい、または別の色にしたい場合、これをどのように変更するかは明らかです。
このコードを改善するために何ができるかについて、自由にコメントを追加してください。私にとっては)だからここに捨てたかったのです。
グループ ヘッダー/フッターの場合:
=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 で Report 要素の BackgroundColor を設定することによる簡単な修正が見つかりました 。「透明」の代わりに何も使用しない
= 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"
出来上がり!これにより、このスレッドで言及されている多くの問題も解決されます。
SSRS が Textbox の Value 以外のプロパティを公開するのはすばらしいことです。この種の計算を行グループ テキスト ボックスの BackgroundColor プロパティに詰め込み、それを他のすべてのセルで ReportItems!RowGroup.BackgroundColor として参照することができます。
ああ、私たちは夢を見ることができます...
私の問題は、行のすべての列に同じ背景を持たせたいということでした。行と列の両方でグループ化しました。上位 2 つのソリューションを使用して、列 1 のすべての行を色付きの背景で、列 2 のすべての行を白い背景で、列 3 のすべての行を色付きの背景でグループ化しました。 、 等々。あたかも(Catch22のソリューションの)RowNumber
それbOddRow
を無視して新しい行と交互にするだけでなく、私の列グループに注意を払うかのようです.
私が望んでいたのは、行 1 のすべての列の背景を白に、次に行 2 のすべての列の背景に色を付け、次に行 3 のすべての列の背景を白にする、ということです。選択した回答を使用してこの効果を得ましたが、に渡す代わりにNothing
、RowNumber
列グループの名前を渡しました。
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
これは他の誰かに役立つかもしれないと考えました。
任意のタイプの複雑なマトリックスで、行ごとまたは列ごとにセルの色を交互に変更したい場合、実際の解決策は次のとおりです。
セルの列ごとに別の色が必要な場合は、
=IIF(RunningValue( Fields![ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "White", "LightGrey")
それで全部です。
別の色の行についても同じですが、それに応じてソリューションを編集する必要があります。
注: ここでは、それに応じてセルの境界線を設定する必要がある場合がありますが、通常は消えます。
また、偽の親グループを作成したときに pic に入ったレポートの値 1 を削除することを忘れないでください。
レポート全体で交互の色が必要な場合は、レポートのレポート全体の ID 行番号に Tablix がバインドされている DataSet を使用し、それを RowNumber 関数で使用できます...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
以下のコードで残りのフィールドを 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 種類のセルの背景があります。
これは私にとってはうまくいきます。グループ化行を無色にしたい、または別の色にしたい場合、これをどのように変更するかは明らかです。
このコードを改善するために何ができるかについて、自由にコメントを追加してください。私にとっては)だからここに捨てたかったのです。
私のために働いたここからの他の答えのわずかな修正。私のグループにはグループ化する 2 つの値があるため、両方を最初の引数に + を付けて配置し、正しく交互にすることができました。
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
私の行列データには欠損値が含まれていたため、ahmad のソリューションを機能させることができませんでしたが、このソリューションは私にとってはうまくいきました
基本的な考え方は、色を含む最も内側のグループに子グループとフィールドを作成することです。次に、そのフィールドの値に基づいて、行の各セルの色を設定します。
上記の答えがどれも私のマトリックスではうまくいかないようだったので、ここに投稿します:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html