SQL Server Reporting Servicesレポートで交互の行をどのようにシェーディングしますか?
編集:以下にリストされているたくさんの良い答えがあります- 迅速でシンプルなものから複雑で包括的なものまで。ああ、私は1つしか選択できません...
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")
担当者を探していません。この質問を自分で調査し、共有したいと思いました。
[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)
。先端をありがとう。
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")
@ 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つは、上位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つの異なる種類のセルの背景を持っています:
これは私にとってはうまくいきます。グループ化行を色付けしない、または別の色にしたい場合は、これをどのように変更するかがこのことからかなり明白になるはずです。
このコードを改善するために何ができるかについて自由にコメントを追加してください:私は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のReport要素のBackgroundColorの設定からクイックフィックスが見つかりました 。「透明」の代わりに何も使用しない
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
VBを使用せずにこれを解決する唯一の効果的な方法は、行グループ内(および列グループ外)の行グループモジュロ値を「格納」し、列グループ内で明示的に参照することです。私はこの解決策を見つけました
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
しかし、Ankeetは何が起こっているのかを説明するのに最適ではありません。彼の解決策は、定数値にグループ化を作成する不要な手順を推奨しているため、ここでは、行グループが1つの行グループ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のすべての行に色付きの背景を取得しました、 等々。かのようだRowNumber
とbOddRow
し、唯一の新しい行を交互にすることを注意を払う(Catch22のソリューションの)私の列グループの代わりに、無視します。
私が欲しかったのは、行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を削除することを忘れないでください。
@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つの異なる種類のセルの背景を持っています:
これは私にとってはうまくいきます。グループ化行を色付けしない、または別の色にしたい場合は、これをどのように変更するかがこのことからかなり明白になるはずです。
このコードを改善するために何ができるかについて自由にコメントを追加してください:私は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
行グループと列グループの両方を使用すると、同じ行であっても列間で色が交互になるという問題がありました。行が変更されたときにのみ変更されるグローバル変数を使用して、これを解決しました。
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
これにより、最初の列が描画された後にのみ、色が交互になります。
各列に対して数学計算を行う必要がないため、これにより(検証不可能に)パフォーマンスも向上する可能性があります。