SQL Server Reporting Services レポートに交互の行の色を追加する
-
09-06-2019 - |
解決
テーブル行の BackgroundColor プロパティに移動し、「Expression...」を選択します。
次の表現を使用します。
= 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)
詳細はこちらにあります ロックスの記事
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 種類のセルの背景ができました。
- データ行の最初の列には =Code.AlternateColor("AliceBlue", "White", True) があります (これは前の回答と同じです。)
- データ行の残りの列には =Code.AlternateColor("AliceBlue", "White", False) があります (これも前の回答と同じです。)
- グループ化行の最初の列には =Code.RestartColor("AliceBlue") があります (これは新しいものです)。
- グループ化行の残りの列には =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
Michael Haren のソリューションは私にとってはうまくいきました。ただし、プレビュー時に「透明」は有効な背景色ではないという警告が表示されました。からの簡単な修正が見つかりましたSSRS のレポート要素の BackgroundColor を設定する. 。「透明」の代わりに何も使用しない
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
VB を使用せずにこれを解決する唯一の効果的な方法は、行グループ化のモジュロ値を行グループ内 (および列グループ外) に「格納」し、それを列グループ内で明示的に参照することです。この解決策は次の場所で見つけました
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
しかし、Ankeet は何が起こっているかを説明するのに最適な仕事をしていません。そして、彼の解決策は、定数値に基づいてグループ化を作成するという不必要なステップを推奨しています。そこで、単一の行グループ RowGroup1 を持つ行列に対する段階的なプロセスを次に示します。
- RowGroup1 内に新しい列を作成します。このテキストボックスの名前を RowGroupColor のような名前に変更します。
RowGroupColor のテキストボックスの値を次のように設定します。
=iif(RunningValue(Fields![行グループフィールド].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
すべての行セルの BackgroundColor プロパティを次のように設定します。
"=ReportItems!RowGroupColor.Value"
- RowGroupColor列の幅を0ptに設定し、CanGrowをFalseに設定してクライアントから隠します。
出来上がり!これにより、このスレッドで言及されている多くの問題も解決されます。
- サブグループの自動リセット:そのrowgroupの新しい列を追加して、 ランニングバリュー の上 その グループの価値観。
- True/False の切り替えを心配する必要はありません。
- カラーは 1 か所にのみ保持されるため、簡単に変更できます。
- 行グループまたは列グループで交互に使用できます (幅の代わりに高さを 0 に設定するだけです)
SSRS がテキストボックスの値以外のプロパティを公開できれば素晴らしいでしょう。この種の計算を行グループのテキストボックスの BackgroundColor プロパティに詰め込み、それを他のすべてのセルで ReportItems!RowGroup.BackgroundColor として参照することができます。
ああ、私たちは夢を見ることができます...
私の問題は、行内のすべての列の背景を同じにしたいことでした。行と列の両方でグループ化しました。ここで上位 2 つのソリューションを使用すると、次のようになります。 全て 列 1 の行の背景は色付き、列 2 のすべての行の背景は白、列 3 のすべての行の背景は色などです。まるで RowNumber
そして bOddRow
(Catch22のソリューションの)それを無視して新しい行だけを交互に置くのではなく、私の列グループに注意を払ってください。
私が欲しかったのは、すべての人のためのものです 列 行 1 の背景が白になり、行 2 のすべての列が色付きの背景になり、行 3 のすべての列が背景が白になります。選択した回答を使用することでこの効果を得ましたが、渡す代わりに Nothing
に RowNumber
, 、列グループの名前を渡しました。
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
これは他の人にも役立つかもしれないと思いました。
このトリックについてはここでは説明しないと思います。それで、ここにあります、
あらゆるタイプの複雑なマトリックスでは、列の賢さまたは列の賢さのいずれかの代替セルの色が必要な場合、作業ソリューションは、
列ごとにセルの色を変更したい場合は、次のようにします。
- レポートデザインビューの右下隅にある「列グループ」で、「fakeparentgroup」という名前の1(式を使用)に偽の親グループを作成します。
- 次に、レポート設計では、色を塗るセルの場合、次の背景色の式を使用します
=IIF(RunningValue( Fields![ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "White", "LightGrey")
それだけです。
代替色の行についても同様ですが、それに応じてソリューションを編集する必要があります。
注記:ここで、場合によってはセルの境界線を適宜設定する必要がありますが、通常は境界線が消えます。
また、偽の親グループを作成したときに写真に表示されたレポートの値 1 を削除することを忘れないでください。
レポート全体で交互の色が必要な場合は、Tablix がバインドされている DataSet をレポート上のレポート全体の ID 行番号に使用し、それを RowNumber 関数で使用できます。
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
@Adityaの答えは素晴らしいですが、行の最初のセル(行の背景の書式設定用)に欠損値がある場合(列/行グループと欠損値のある複雑なTablixの場合)、書式設定が失敗する場合があります。
@Aditya のソリューションは、 countDistinct
の結果 runningValue
Tablix (行) グループ内の行番号を識別する関数。最初のセルに欠損値がある 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")
お役に立てれば。
以下のコードで残りのフィールドを 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 種類のセルの背景ができました。
- データ行の最初の列には =Code.AlternateColor("AliceBlue", "White", True) があります (これは前の回答と同じです。)
- データ行の残りの列には =Code.AlternateColor("AliceBlue", "White", False) があります (これも前の回答と同じです。)
- グループ化行の最初の列には =Code.RestartColor("AliceBlue") があります (これは新しいものです)。
- グループ化行の残りの列には =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
7 列の Tablix の場合、行 (セル) の背景色に次の式を使用します。
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
上記の答えが私のマトリックスでは機能しなかったため、ここに投稿します。
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
私の行列データには欠損値が含まれていたため、ahmad のソリューションを機能させることができませんでしたが、 この解決策は私にとってうまくいきました
基本的な考え方は、その色を含む最も内側のグループに子グループとフィールドを作成することです。次に、そのフィールドの値に基づいて、行内の各セルの色を設定します。
私にとってうまくいった他の回答をここから少し変更しました。私のグループにはグループ化する 2 つの値があるため、最初の引数に + を付けて両方を入力するだけで、正しく交互に配置できました。
= 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
さて、 初め 交互にしたい行の列で、色の式を次のように設定します。
=コード.代替カラー()
-
残りの列で、すべてを次のように設定します。
=コード.BGColor
これにより、最初の列が描画された後にのみ色が交互になります。
これにより、列ごとに数学的計算を行う必要がなくなるため、(検証できませんが) パフォーマンスも向上する可能性があります。