カテゴリー
* Diary *

SSRS のレポートでグループごとにページをリセットする

たまにはSEらしい投稿を。

ある案件で、Microsoft SQL Server 2008 Reporting Services (SSRS)をつかったレポート(帳票)でレコードを工場ごとにグループ化し、そのグループごとに改ページをしてページ数をリセットしたいという要求が発生。
つまり、A工場の帳票が1ページ、2ページとなったら、つづくB工場の帳票は3ページからではなくて1ページからはじまるようにしたい。

ちょちょいとググってみたところ、Report Builder に「Page Break」→「ResetPageNumber」で true / false が設定できるらしい。
…あれ? そんな設定項目あったっけ? とよくよく調べたら、最近リリースされたReport Builder 3.0 の機能らしい。
Report Builder 3.0 をダウンロード・インストールする。
おお、あったあった!!
で、修正したレポートをReporting Server に配置しようとしたところ、SQL Server 2008 の R2 でないとダメよ、みたいな。 orz
チェッ! …と Visual Studio 経由で配置できないかと何気に Reporting Services デザイナーでレポートを開こうとしたところ、開けない。
R2 用に変換しちゃったのね…。
もうこれは R2 にするしかないだろ、と、ローカルの SQL Server を R2 に更新。
時間かかりそうなんで、ほっといたまま帰宅。
…ここまで昨日。

無事、R2 の更新が完了。
いよいよレポートを配置する

…PageBreak プロパティが削除されました。SQL Server 2008 Reporting Services では、PageBreak プロパティ ResetPageNumber はサポートされていません。

…………orz

やむを得ず、別の手を探る――というか英語で検索。
Chris Hays’s Reporting Services Sleazy Hacks Weblog の「Reset Page Number On Group」という記事を発見。
ふむふむ。
やってみる。
最初、どこにどうコードを書いたらいいのかわからず四苦八苦するも、サンプルファイルを開いてどうにかすすむ。

お!! ページがリセットされた!!
が、B工場のページ番号が、「1・1・2・3…」惜しい!!

Chris のコードは(…なんかカッコいい!!)、グループ化するデータの内容が変わったら――つまり今回の場合は工場名が「A工場」から「B工場」に変わったところで、そのページのページ数(今回の例では3ページ目)から 1 引いたのを offset 変数に記録しておいて、その後は総ページ数から offset を引いた値を返すというもの。

しかし、offset が記録できるなら、groupPage変数にグループごとのページを直接記録して返すようにすればいいんでないの? と単純化したら大成功!!

「レポートのプロパティ」を開いて「コード」を選択して表示される枠に以下のコードを貼り付ける

 Shared groupPage as Integer
Shared currentgroup as Object

 Public Function GetGroupPageNumber(group as Object) as Object
If Not (group = currentgroup)
groupPage = 1
Else
groupPage = groupPage + 1
End If
Return groupPage
End Function

で、ページ数を表示するテキストボックスを右クリックして「式…」を選択。
枠に以下のコードをアレンジして(FactoryAbbr の部分をグループ化するフィールド名に変更)貼り付ける

=Code.GetGroupPageNumber(ReportItems!FactoryAbbr.Value)

今回の場合これでうまくいったけど、2008 R2 ではない Reporting Servises でうまくいくかまでは検証してないのでそのつもりで。

p.s.
うーむ、やはり「SQL Server 2008 Reporting Services では、PageBreak プロパティ ResetPageNumber はサポートされていません。」が気持ち悪い。
何かの間違い?