次の方法で共有


SQL Server Reporting Services

SSRS を拡張する: カスタムのグラフ作成コンポーネントと表示拡張機能の開発

Manpreet Singh

コード サンプルのダウンロード

SQL Server Reporting Services (SSRS) は、従来どおりのグラフと新しいグラフのどちらの形式でもデータおよび統計を視覚的に表示できるすばらしいグラフ作成機能を提供し、さまざまなレポート表示拡張機能により PDF、CSV、XML、Word、Excel などの複数の形式でレポートを保存できます。ただ、組み込みの機能では、ビジネスの要件を満たしたり、期待どおりのレポートを表示したりするには不十分な場合があります。さいわい、SSRS が提供するさまざまな拡張機能を使用し、カスタムのグラフ作成コンポーネントと表示拡張機能を作成できます。今回は、カスタムのグラフ作成コンポーネントを作成するプロセスと、そのコンポーネントを SSRS のレポートに組み込むさまざまな方法について概説します。また、最も必要としているレポートを表示するように、(ネイティブのレポート表示機能を拡張して) カスタムのレポート表示機能を開発する方法も説明します。実際に試してみるには、archive.msdn.microsoft.com/mag201201SSRS (英語) からすべてのコードをダウンロードし、出発点としてご利用ください。表示拡張機能とレポート アイテムを作成するプロセスは、SQL Server 2005 からあまり変化していません。そのため、コード サンプルは SQL Server 2008 R2 の環境で作成しましたが、今回紹介するアイデアは SQL Server 2005 や SQL Server 2008 にも十分に応用可能です。SQL Server 2008 R2 Reporting Services で開発する場合、Microsoft .NET Framework 4 を使用してカスタム コンポーネントを作成することもできます。ただし、SQL Server 2008 Reporting Services の場合は、.NET Framework 3.5 がサポート対象の最も新しいバージョンです。

Web サイト ユーザーのレポート

カスタムのグラフ作成コンポーネントと表示拡張機能を開発するプロセスを理解するため、Web サイトの利用者数を表す Web サイト利用状況のレポートを月単位に生成する必要があるというシナリオを検討します。たとえば、電子商取引 Web サイトの地域別利用状況を表すレポートを考えてみましょう。このレポートの中心となるのは、ユーザーの地域別分布をグラフで表すグラフです (図 1 参照)。

Web Site Users Chart
図 1 Web サイト ユーザーのグラフ

このグラフは棒グラフと非常によく似ていますが、ネイティブのグラフ作成コンポーネントにはグラフの棒を図 1 のような人間の形をしたカスタム画像に置き換えられるものはありません。

このようなシナリオでは、カスタムのグラフ作成コンポーネントを作成する必要が生じます。GDI+ 基本クラス ライブラリ (.NET Framework の一部) を使用すれば、少し計算するだけで、簡単に円や四角形などの基本図形を用いてグラフを描き、標準のビットマップ画像形式でグラフを生成できます。こうしたコンポーネントの出力は、.NET Framework のグラフィックス ライブラリを使用して画像を生成し、以下に示すさまざまな方法で SSRS のレポートに組み込めます。

  • カスタム レポート アイテムを使用する: SSRS では、組み込みのグラフ作成コンポーネントなど、レポートに統合できるカスタム レポート アイテムの作成がサポートされています。カスタム レポート アイテムは、画像として表示されます。カスタム レポート アイテムの作成方法については、「SQL Server Reporting Services でカスタム レポート アイテムを使用してデータを装飾する」(https://msdn.microsoft.com/ja-jp/magazine/ee728592.aspx) という記事を参照してください。
  • SQL の CLR 関数を使用する: SQL の CLR ユーザー定義関数を使用して、GDI+ ベースのグラフ作成コンポーネントを SSRS に組み込むこともできます。これには、system.drawing.dll を SQL Server に読み込む必要があります。このグラフ生成の中核となるアセンブリが SQL Server に読み込まれたら、それに基づくユーザー定義関数を作成できます。イメージ レポート アイテムを構成して、データベースのグラフ イメージを表示できるようになります。
  • ASP.NET ハンドラーを使用する: ASP.NET ハンドラーを使用して、グラフ作成コンポーネントを SSRS のレポートと Web アプリケーションに組み込めます。ASP.NET ハンドラーは、クエリ文字列で渡されるパラメーターを使用して、グラフ作成コンポーネントをダウンロード可能なビットマップ画像として返します。ハンドラーの出力を SSRS に組み込むのに必要なのは、ピクチャ ボックスの画像ソースを外部に設定し、ハンドラーの URL を式として提供することだけです。

今回の記事に付属のコード サンプルは、Web サイト ユーザーのグラフを作成し、SQL の CLR 関数を使用して Web サイト利用状況のレポートに組み込むプロセスを示しています。WebSiteUsersChartCore プロジェクトに含まれている WebSiteUsersChart クラスは、dbo.usp_GetUsageData ストアド プロシージャが返した月別の利用状況に関するデータに基づき、JPEG 画像形式でグラフを表示します。WebSiteUsersReportDB.bak ファイルには、WebSiteUsersReportDB データベースのバックアップが、必要なバックエンド テーブルおよびストアド プロシージャと共に格納されています。SQL の CLR 関数である GetUsersChart の役割は、必要なパラメーターをグラフ作成コンポーネントに提供し、画像出力を取得することです。RegionWiseReport の DataSetWebSiteUsageChart データセットは、次の SQL クエリを使用して必要なパラメーターを渡すことで SQL の CLR 関数から画像を取得します。

    SELECT dbo.usp_GetUsersChart(500, 300, N'Website Users', @RegionName,
      @DateID % 100, @DateID / 100) AS Chart

最後に、ImageChart 画像コントロールは、データベースの画像を表示します。

カスタム レポート アイテムを開発する代わりに SQL の CLR 関数か ASP.NET ハンドラーを使用する主な利点は、追加の開発作業やカスタマイズを一切必要とせず、同じ画像作成コンポーネントを SSRS の外部 (Web アプリケーションなど) で使用できることです。

カスタムの Word 表示拡張機能

ネイティブの Word 表示拡張機能でも Web サイト利用状況のレポートは問題なく表示できますが、目次機能や縦長のページと横長のページを混在させる機能などはサポートされていません。

カスタムの表示拡張機能をゼロから作成するのは容易ではありません。また、レポート要素をさまざまに組み合わせ、対応する書式設定および目的の書式でサポートされるデータ要素に変換できるようにする必要があるでしょう。さらに、ネイティブの SSRS 表示拡張機能を拡張することは、直接サポートされていません。さいわい、今回のレポートは、ネイティブの Word 表示拡張機能の出力でほぼ作成できます。本当に必要なのは、目次を追加する機能とページごとにページの向きを設定する機能だけです。

このため、ネイティブの Word 拡張機能で表示したレポート出力を取得し、Word オートメーションを使用してそのレポート出力を必要な形に変更して、最終出力をユーザーにストリーミングするカスタムの表示拡張機能を作成します。

ソース コードの CustomWordRenderingExtension プロジェクトの CustomWordRenderer クラスは、必要な効果を生むための重要な手順を示しています。ネイティブの Word 表示拡張機能の出力は、タイトル ページと目次を含む標準ヘッダー テンプレートと結合され、著作権情報や免責事項などの項目も含められます。ネイティブの拡張機能でテーブル エントリとして表示される見出しマップ ラベルには、目次に表示されるようにする適切な見出しの形式があります。最後に、目次は更新され、結合されたドキュメントがユーザーにストリーミングされます。

SSRS の拡張機能にはすべて、IRenderingExtension インターフェイスと IExtension インターフェイスが実装されている必要があります。これらのインターフェイスのために、次のメソッドとプロパティの実装を提供する必要があります。

IExtension インターフェイスのメンバー:

  • LocalizedName プロパティ
  • SetConfiguration 関数

IRenderingExtension インターフェイスのメンバー:

  • GetRenderingResource 関数
  • Render 関数
  • RenderStream 関数

これらすべてのメンバーの中で最も重要なのは Render メソッドで、カスタムの Word レンダラーの中核となる実装を含んでいます。ネイティブの Word 表示拡張機能の書式設定されたレポート出力を既に取得しているため、さまざまなレポート要素を解析する必要はなく、Render メソッドにはレポート データや書式設定の要素を直接操作するコードは一切含まれません。必要なのは、ネイティブの Word 表示拡張機能で作成したレポートを取得し、Microsoft Word で開き (Word オートメーションを使用し)、必要な変更を実行し、変更したドキュメントをユーザーにストリーミングすることだけです。

カスタムの表示拡張機能を開発するプロセスについての詳細は、「Reporting Services のカスタム レンダラによるデータ表示のカスタマイズ (https://msdn.microsoft.com/ja-jp/magazine/ee175716.aspx) を参照してください。

ここで紹介したアイデアの採用を決める前に、Microsoft は Microsoft Office のサーバーサイド オートメーションをサポートしていないということに十分注意してください。この記事で説明した方法でカスタムの表示拡張機能を開発することをお考えなら、まず「Office のサーバーサイド オートメーションについて」(support.microsoft.com/kb/257757) を確認してください。

Office オートメーションの使用を望まない場合は、ほかにも興味深い方法があります。それは、ネイティブの XML 表示拡張機能を使用してレポートを XML ファイルとして表示し、カスタムの XSLT スタイルシートを適用して WordML ドキュメントを生成する方法です。この方法の欠点は、レポートの書式設定を、結果的に XSLT スタイルシートとレポートの RDL ファイルの 2 か所に格納することになることです。

サンプル コードの使用

今回の記事のソース コードには、以下のものが含まれています。

  • WebSiteUsersChartCore プロジェクト
  • TestHarness プロジェクト
  • CustomWordRenderingExtension プロジェクト
  • WebSiteUsersReport RDL ファイル
  • RegionWiseReport RDL ファイル
  • WebSiteUsersReportDB データベース バックアップ ファイル
  • Report ヘッダー テンプレート ファイル

WebSiteUsersChartCore プロジェクトは、地域別利用状況の統計から WebSite Users Charting コンポーネントを作成するプロセスを示します。TestHarness プロジェクトは、Windows フォーム アプリケーションを使用して、グラフ作成コンポーネントによって生成された画像を表示することで、WebSiteUsersChartCore アセンブリの出力をテストおよび検証するのに使用します。CustomWordRenderingExtension プロジェクトには、Word オートメーションを使用する方法に基づき、カスタムの Word 表示拡張機能の実装が含まれています。WebSiteUsersReport は、すべての地域についての RegionWiseReport サブレポートを呼び出す主要レポートで、地域別にコンテンツを表示します。RegionWiseReport レポートも、WebSite Users Charting コンポーネントを呼び出して WebSite Users Chart を表示します。これは、該当するパラメーターを渡すことで、usp_GetUsersChart SQL CLR スカラー値関数を呼び出し、画像コントロールを使用して実行します。WebsiteUsersReportDB.bak ファイルには、WebSiteUsersReportDB データベース用のバックアップが格納されています。レポートとグラフ作成コンポーネントは、このデータベースのデータを使用します。ヘッダー テンプレート ファイルには、タイトル ページと目次が縦長の形式で格納されています。このファイルは、Word オートメーションを使用してネイティブの Word ドキュメント レポートの先頭に追加されます。

サンプル コードを配置するには、WebSiteUsersChartCore プロジェクトと CustomWordRenderingExtension プロジェクトを含む WebSiteUsersChart ソリューションを構築します。CustomWordRenderingExtension.dll アセンブリを、レポート サーバーの bin ディレクトリにコピーします。レポート サーバーの rssrvpolicy.config ファイルに次のエントリを作成し、カスタムの表示拡張機能に完全な信頼を付与します。

<CodeGroup
class="UnionCodeGroup" version="1"
PermissionSetName="FullTrust"
Name="CUSTOM WORD"
Description="This code group grants Custom Word Renderer code full trust.">
  <IMembershipCondition
    class="UrlMembershipCondition"
    version="1"
    Url="C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting
        Services\ReportServer\bin\CustomWordRenderingExtension.dll" />
</CodeGroup>

次に、rsreportserver.config ファイルに次のエントリを作成し、レポート サーバーにカスタムの表示拡張機能を登録します。

<Extension Name="Custom WORD" Type=
  "CustomWordRenderingExtension.CustomWordRenderer,
  CustomWordRenderingExtension">
  <Configuration>
    <DeviceInfo>
    <SourceHeaderFileName>C:\WorkingDirectory\
      Header.doc</SourceHeaderFileName>
    <SourceBodyFileName>C:\WorkingDirectory\Body.doc</SourceBodyFileName>
    <MergedFileName>C:\WorkingDirectory\MergedOutput.doc</MergedFileName>
    </DeviceInfo>
  </Configuration>
</Extension>

C: ドライブに、カスタムの表示拡張機能のための作業用ディレクトリを作成し、そこに Header.doc をコピーします。別のディレクトリを使用する場合は、rsreportserver.config ファイルにも対応する変更を加えることを忘れないでください。これらの構成エントリは、カスタムの Word レンダラーに使用されます。もちろん、カスタムの表示拡張機能が動作するには Microsoft Word がインストールされている必要があります。

次に、WebSiteUsersReport レポートと RegionWiseReport レポートをレポート サーバーに配置します。WebSiteUsersReport レポートを実行します。[エクスポート] メニューをクリックし、ドロップダウンのコンテンツを見ると、"CUSTOM WORD" 表示拡張機能が一覧に表示されているのを確認できます。エクスポートを実行します。取得したドキュメントが空だった場合は、イベント ログでエラーを確認します。

まとめ

ネイティブのグラフ作成コンポーネントで目的を果たせない場合は、カスタム コンポーネントの実装を検討します。GDI+ の開発スキルを活用して、複雑なグラフを開発できます。すべてをゼロから作成しなくても、ネイティブのレンダラーの出力を修正することでカスタムのレンダラーは作成可能だということを覚えておいてください。

レポート生成のための新しいアプリケーションを完全にカスタマイズして構築することも可能ですが、多くの場合、いくつかカスタム コードを適切な場所に配置することで SSRS を使用して同じ目的を簡単に達成できます。ですから、何も心配せずに、自分のグラフ作成コンポーネントとレポート レンダラーを構築してみてください。

Manpreet Singh は、Microsoft Services Global Delivery のコンサルタントで、ビジネス インテリジェンスおよびエンジニアリング統合のグループに属しています。主に、マイクロソフトのビジネス インテリジェンス スタックに基づいた .NET 中心のビジネス インテリジェンス ソリューションの設計と開発に取り組んでいます。

この記事のレビューに協力してくれた技術スタッフの Yaswant Vishwakarma に心より感謝いたします。