SQL Server 2008 以降の Reporting Services で総ページ数表記が “?” になる


横井 羽衣子
SQL Developer Support Engineer 

今回は、SQL Server 2008 以降の Reporting Services において、総ページ数が "?" と表記される動作についてご案内します。

この現象は障害ではなく、SQL Server 2008 以降の Reporting Services の高速化動作の設計に基づいた動作です。

 

  1. なぜ総ページ数が "?" になるのか

  2. 総ページ数を疑問符で表示させないためには

  3. 総ページ数が表示されるレポートとされないレポートの違い

 


1. なぜ総ページ数が "?" になるのか

SQL Server 2008 より、多数のページに渡るレポートの表示において、初期ページ表示時のパフォーマンス改善を目的として設計された「オンデマンドのレポート処理 (On-Demand Report Processing)」機能が追加されました。「オンデマンドのレポート処理」は、既定では ON の設定となります。この機能の実装には、以下の二つの目的があります。

・レポート表示の高速化
・レポート サーバーでのメモリ使用量の削減

総ページ数を得るためには、最後までデータを読み込み、全体のレイアウトに基づいて全部で何ページになるか計算する必要がありますが、この機能は端的に言えば、最初にすべてのデータを読み取らず、表示を優先することにより高速化を実現する手法です。
これにより、レポートを従来バージョンの Reporting Services と比較して、高速に表示させることができますが、結果として、総ページ数表示は予測ページ数 (a page estimate with a question mark instead of the actual number of pages for a report) として表示されることになります。この際に、概算表示として Reporting Services は、"?" で総ページ数を表示します。

◆ MSDN ライブラリ上の記載

SQL Server Reporting Services における動作変更
SQL Server 2008
http://msdn.microsoft.com/ja-jp/library/ms143200(v=sql.100).aspx
SQL Server 2008 R2
http://msdn.microsoft.com/ja-jp/library/ms143200(v=SQL.105).aspx
SQL Server 2012
http://msdn.microsoft.com/ja-jp/library/ms143200(v=sql.110).aspx

原文抜粋(英語版および日本語版より)

レポート マネージャ

レポート マネージャは、レポート サーバーのコンテンツを表示および管理するために使用されます。このリリースでは、レポート モデルを管理する機能が導入されており、モデル アイテムのセキュリティを設定し、モデル内のエンティティにクリックスルー レポートを関連付けることができるようになりました。

要求時のレポート処理に導入された変更により、レポート マネージャでレポートを表示する際に、レポートの実際のページ数ではなく、予測ページ数が疑問符付きでツール バーに表示されるようになりました。[最終ページ] ボタンをクリックしてレポートの末尾に移動する操作は引き続き有効です。

Report Manager

Report Manager is used to view and manage report server content. This release introduces the ability to manage report models. You can now set model item security and associate clickthrough reports to entities in a model.

When viewing a report in Report Manager, because of the changes introduced by on-demand report processing, the toolbar displays a page estimate with a question mark instead of the actual number of pages for a report. You can still click the Last Page button and navigate to the end of the report.

2. 総ページ数を疑問符で表示させないためには

既定のパフォーマンス改善機能の一環で総ページ数が "?" = 予測ページ数として表記されることになります。
レポートの表示機能に何を利用しているかによって、実測値を表示させる設定に変更もできますが、SQL Server 2008 以前の Reporting Services と同様、Reporting Services のメモリ消費量とレポート表示までの時間が増加することに注意が必要です。

それでも総ページ数をきちんと表示する要件がある場合には、以下のいずれかの方法があります。

・レポート マネージャー (http:/localhost/reports_<インスタンス名>) から閲覧する
・ReportViewer コントロールを利用し、旧バージョンとの互換性機能を利用して総ページ数を表示させる


※ 注意             
レポート サーバーからの閲覧の場合 (http:/localhost/reportserver_<インスタンス名>) 残念ながら、総ページ数を表示する方法はありません。

      

◆ レポート マネージャーの場合

RSReportServer.config ファイル中の PageCountMode プロパティを既定値 Estimate (※推定値) から、Actual に変更した場合は、レポート マネージャーで総ページ数が表示されます。

・変更前
<UI>
  <ReportServerUrl>
  </ReportServerUrl>
  <PageCountMode>Estimate</PageCountMode>
</UI>

・変更後
<UI>
  <ReportServerUrl>
  </ReportServerUrl>
  <PageCountMode>Actual</PageCountMode>
</UI>

参考文書

RSReportServer 構成ファイル
SQL Server 2008
http://msdn.microsoft.com/ja-jp/library/ms157273(v=sql.100).aspx#UI
SQL Server 2008 R2
http://msdn.microsoft.com/ja-jp/library/ms157273(v=sql.105).aspx#UI
SQL Server 2012
http://msdn.microsoft.com/ja-jp/library/ms157273(v=sql.110).aspx

PageCountMode レポート マネージャーでのみ使用されます。この設定は、レポート サーバーでページ数の値をレポートの表示前に計算するか、表示中に計算するかを指定します。 有効な値は、Estimate (既定値) および Actual です。 ユーザーがレポートを閲覧している間にページ数情報を計算する場合は、Estimate を使用します。 ページ数の初期値は 2 (現在のページの他にもう 1 ページ) で、ユーザーがレポートを読み進める間にページ数が調整されます。 ページ数をレポートが表示される前に計算する場合は、Actual を使用します。 Actual は旧バージョンとの互換性を維持するために用意されています。 PageCountMode を Actual に設定した場合、有効なページ数を取得する関係上、レポート全体を処理する必要があるため、レポートが表示されるまでの待ち時間が長くなる点に注意してください。

PageCountMode

For Report Manager only, this setting specifies whether the report server calculates a page count value before the report is rendered, or as the report is viewed. Valid values are Estimate (default) and Actual. Use Estimate to calculate page count information as the user views the report. Initially, the page count is set to 2 (for the current page plus one additional page), but adjusts upwards as the user pages through the report. Use Actual if you want to calculate page count in advance before the report is displayed. Actual is provided for backward compatibility. Note that if you set PageCountMode to Actual, the entire report must be processed to get a valid page count, increasing wait time before the report is displayed.

 

◆ Report Viewer コントロールの場合

(1) Report Viewer コントロール 9.0 (Visual Studio 2008 などに付属)
On-Demand Report Processing に対応していないため、レポート サーバーが SQL Server 2008 以降であっても、総ページ数は実測値を表示します。ただし、レポート表示までに要する時間およびレポート サーバー上のメモリ使用量は、バージョン 10.0 と比較して多くを必要とすることになります。

(2) Report Viewer コントロール 10.0 (Visual Studio 2010 付属)
バージョン 10.0 から On-Demand Report Processing に対応しています。On-Demand Report Processing の導入に伴い、ReportViewer コントロール 10.0 から PageCountMode というプロパティが実装されています。これは、総ページ数を表示するモードを制御するためのプロパティです。既定値は Estimate で、推定値表示です。推定値ではなく、実際のページ数を表示させたい場合には、Actual に変更します。

PageCountMode 列挙体
http://msdn.microsoft.com/ja-jp/library/microsoft.reporting.webforms.pagecountmode.aspx

 

◆ レポートへのリンクをクリックさせることによりレポートを表示させている場合

この場合、実際には、レポート サーバーからの表示 (http:/localhost/reportserver_<インスタンス名>) と同等の状態となりますため、総ページ数を表示させる方法はありません。

 

3. 総ページ数が表示されるレポートとされないレポートの違い

予測ページ数表示 "?" が表示される可能性を 0 にすることはできませんが、例えば、最終ページへの読み込みボタン (→|) を押す動作などにより、最後までデータが読み込まれることで、総ページの確定を行うことができます。これにより、? ではなく、結果として総ページ数が表示されます。

Comments (0)

Skip to main content