質問

SQL Server Reporting Services レポートで行を交互にシェーディングするにはどうすればよいですか?


編集: 以下にリストされている良い回答がたくさんあります。 素早い そして 単純複雑かつ包括的. 。ああ、一つしか選べないんだ…

役に立ちましたか?

解決

テーブル行の 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 種類のセルの背景ができました。

  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

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 を持つ行列に対する段階的なプロセスを次に示します。

  1. RowGroup1 内に新しい列を作成します。このテキストボックスの名前を RowGroupColor のような名前に変更します。
  2. RowGroupColor のテキストボックスの値を次のように設定します。

    =iif(RunningValue(Fields![行グループフィールド].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  3. すべての行セルの BackgroundColor プロパティを次のように設定します。

    "=ReportItems!RowGroupColor.Value"

  4. RowGroupColor列の幅を0ptに設定し、CanGrowをFalseに設定してクライアントから隠します。

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

  • サブグループの自動リセット:そのrowgroupの新しい列を追加して、 ランニングバリュー の上 その グループの価値観。
  • True/False の切り替えを心配する必要はありません。
  • カラーは 1 か所にのみ保持されるため、簡単に変更できます。
  • 行グループまたは列グループで交互に使用できます (幅の代わりに高さを 0 に設定するだけです)

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

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

私の問題は、行内のすべての列の背景を同じにしたいことでした。行と列の両方でグループ化しました。ここで上位 2 つのソリューションを使用すると、次のようになります。 全て 列 1 の行の背景は色付き、列 2 のすべての行の背景は白、列 3 のすべての行の背景は色などです。まるで RowNumber そして bOddRow (Catch22のソリューションの)それを無視して新しい行だけを交互に置くのではなく、私の列グループに注意を払ってください。

私が欲しかったのは、すべての人のためのものです 行 1 の背景が白になり、行 2 のすべての列が色付きの背景になり、行 3 のすべての列が背景が白になります。選択した回答を使用することでこの効果を得ましたが、渡す代わりに NothingRowNumber, 、列グループの名前を渡しました。

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

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

このトリックについてはここでは説明しないと思います。それで、ここにあります、

あらゆるタイプの複雑なマトリックスでは、列の賢さまたは列の賢さのいずれかの代替セルの色が必要な場合、作業ソリューションは、

列ごとにセルの色を変更したい場合は、次のようにします。

  1. レポートデザインビューの右下隅にある「列グループ」で、「fakeparentgroup」という名前の1(式を使用)に偽の親グループを作成します。
  2. 次に、レポート設計では、色を塗るセルの場合、次の背景色の式を使用します

=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 種類のセルの背景ができました。

  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

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

これにより、最初の列が描画された後にのみ色が交互になります。

これにより、列ごとに数学的計算を行う必要がなくなるため、(検証できませんが) パフォーマンスも向上する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top