Quantcast
Viewing all articles
Browse latest Browse all 293

[Windows Azure SQL Reporting] Visual Studio でファイルエクスポートをするプログラムを書いてみよう

横井 羽衣子
SQL Developer Senior Support Engineer

 

みなさんごきげんよう。今日は、Windows Azure SQL Database の SQL レポートを、レポートマネージャ等の GUI を経由せず、レポートをエクスポートするプログラムを書いてみましょう。 Reporting Service が公開している Web サービスを利用すると簡単にエクスポートができちゃいます。なお題材は Azure ですが、実は、オンプレミスの Reporting Services も全く同じ手順で実現できてしまいます。
構成としては以下の通りとなります。


- クライアント端末は、IE など Web ブラウザを通じて、サーバーサイドの ASP.NET Web アプリケーションにアクセスします。
- ASP.NET Web アプリケーションは、Reporting Services の Web サービスにアクセスし、処理を行い、その結果をクライアントに返します。

Image may be NSFW.
Clik here to view.
clip_image001

エクスポートについては、ReportExecutionService クラスRender メソッドにより実施することが可能です。
では、早速やってみましょう。まずは、レポートを作ってみるところからですね。

目次

はじめに : Windows Azure SQL Database Reporting Services でレポートを作ってみよう

1. ASP.NET Web アプリケーションを作ってみよう

2. 参照設定をしてみよう

3. 処理を実装してみよう

4. 実行してみよう


はじめに : Windows Azure SQL Database Reporting Services でレポートを作ってみよう

まずは、以下のドキュメントをもとに、レポートを作ってみましょう。

[SQL Azure] SQL Azure Reporting Previewを使ってみよう
http://blogs.msdn.com/b/dsazurejp/archive/2011/11/08/sql-azure-reporting-preview.aspx

上記ドキュメントは旧ポータル + SQL レポートのプレビュー版をもとにしていますが、SQL reportを作った後は、同じ手順でレポートを作成できます。新ポータルでは、以下に SQL Database Reporting Services があります。左のピラーの一番下の [新規+] を押すと、作成が可能です。

新ポータル : https://manage.windowsazure.com

Image may be NSFW.
Clik here to view.
clip_image002
Image may be NSFW.
Clik here to view.
clip_image004

Image may be NSFW.
Clik here to view.
clip_image006

作成されると、”正常に作成されました” と表示されます。

Image may be NSFW.
Clik here to view.
clip_image008

Image may be NSFW.
Clik here to view.
clip_image010

ポータルの [SQL レポート] から、作成したサービスの “Web サービス URL” をクリックするとログイン画面になります。ログインするとサーバーの中がみられます。

Image may be NSFW.
Clik here to view.
clip_image012

まだ、レポートを作成していないと、空っぽです。上述のドキュメントに従って、レポートを作ってみてください。

Image may be NSFW.
Clik here to view.
clip_image014

完成すると、ブラウザでこんな風にみられます。これを、今回ファイル出力する!というのが目標です。以下は、作成したレポートをブラウザでみた図です。

Image may be NSFW.
Clik here to view.
clip_image015

ちなみに、Windows Phone 8 でもきれいに見えます。Image may be NSFW.
Clik here to view.
晴れ
(HTC Windows Phone 8x でテスト)

Image may be NSFW.
Clik here to view.
image

まだ、Windows Phone 8 は日本では出ていないので、エミュレータをご利用いただくことになると思います。Windows Phone エミュレータは以下をご参照ください。

Windows Phone エミュレーター
http://msdn.microsoft.com/ja-jp/library/windowsphone/develop/ff402563(v=vs.105).aspx

iphone シミュレータでもきれいにレポートを見ることができます。

Image may be NSFW.
Clik here to view.
clip_image017

※ iPhone シミュレータは Electric Mobile Studio からゲットしてみました。

Image may be NSFW.
Clik here to view.
clip_image019

それではアプリケーションを作ってみましょう!

1. ASP.NET Web アプリケーションを作ってみよう

1. Visual Studio を管理者権限で起動します。今回は、2012 でやってみます。
2. [ファイル(F)] – [新規作成(N)] – [プロジェクト(P)] を選択します。
3. [Web] を左ペインで選択し、"ASP.NET Web フォームアプリケーション" を選択し、任意の場所に作成します。
Image may be NSFW.
Clik here to view.
clip_image021

4. ツールボックスから、Button をクリックし、Form 上にドラッグ & ドロップします。
※ ツールボックスが見当たらない場合は、[表示(V)] – [ツールボックス] を選択してください。

Image may be NSFW.
Clik here to view.
clip_image023

5. WebForm 上のボタンをダブルクリックすると、Button1_Click イベントが追加され、コードのビューに移動します。今回は、ボタンが押されたタイミングで出力するようにしますので、Button1_Click イベント中にコードを追加していくことになります。

次のステップでは、Windows Azure SQL Database Reporting Services の Web サービスを参照して、プログラム中で使えるようにします。

2. 参照設定をしてみよう

Visual Studio のソリューション中で、サービス追加を行うことでレポート サーバーのサービスを利用することが出来ます。エクスポート処理は、レポート サーバーで公開している Web サービスのうち、"ReportExecutionService" を参照追加頂くことで利用可能です。

ReportExecutionService.Render メソッド
http://msdn.microsoft.com/ja-jp/library/reportexecution2005.reportexecutionservice.render.aspx

上記ページでは、mhtml 形式でのエクスポート (バイト配列への出力)、エクスポートされたデータのファイルへの書き込みといった一連の作業についてのサンプルコードが紹介されています。例えば、PDF ファイルへのエクスポートを行いたいときは、Render メソッドで指定される format に PDF を指定します。

上記例では、Windows Application (コンソール) でファイルへの書き出しを行っていますが、ASP.NET Web アプリケーションであれば、Response.BinaryWrite() メソッドを用いてファイルなどを保存することなどが可能です。

それでは、まずは参照を追加してみましょう。

1. Visual Studio のソリューション エクスプローラーの [参照設定] を右クリックし、[サービス参照の追加(S)...] を選択します。

Image may be NSFW.
Clik here to view.
clip_image025

2. [サービス参照の追加] ダイアログが開いたら、[詳細設定(V)...] をクリックし、[サービス参照設定] ダイアログを出します。

Image may be NSFW.
Clik here to view.
image
Image may be NSFW.
Clik here to view.
clip_image027

2. さらに、[Web 参照の追加(W)...] をクリックすると、[Web 参照の追加] ダイアログが開きます。

Image may be NSFW.
Clik here to view.
clip_image029

2-a. "URL(U)" には、下記のように、ご利用の Reporting Services Web サービスの URL を入力し、[->] ボタンを押します。 何度も [セキュリティの警告] ダイアログが表示されますが、ひたすら [いいえ(N)] を押しまくります。(実際の URL は適宜環境に合わせてください。)

例) レポートサーバーの Web サ���ビス URL が https://xxxxxxxxxx.reporting.windows.net/reportserverの場合
https://xxxxxxxxxx.reporting.windows.net/reportserver/ReportExecution2005.asmx?wsdl

Image may be NSFW.
Clik here to view.
clip_image031

2-b. 正常に Web サービスが参照されれば、"この URL で見つかった Web サービス(S):" に "1 個のサービスが見つかりました - ReportService2005" が表示されます。

Image may be NSFW.
Clik here to view.
image

2-c. [参照の追加(R)] ボタンを押します。

5. Web References 配下に、net.windows.reporting.<SQL Reporting Services のサーバ名> で Web サービスの参照が追加されます。

Image may be NSFW.
Clik here to view.
clip_image035

例) サーバ名が xxxxxxxxxの場合

net.windows.reporting.xxxxxxxxx

6. ソース中に "名前区間名.net.windows.reporting.<SQL Reporting Services のサーバ名>"を宣言します。

Image may be NSFW.
Clik here to view.
clip_image037

例) 名前空間 WebApplication1 / Reporting Services のサーバ名が xxxxxxxxxの場合

using WebApplication1.net.windows.reporting.xxxxxxxxx

3. 処理を実装してみよう

以下、上記の MSDN のコードからデータ出力部分のみに構成しなおし、解説を加え、Web アプリケーション用に若干の変更を加えたものとなります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplication1.net.windows.reporting.xxxxxxxxx;// サービス参照追加後に宣言を追記。今回、名前空間はWebApplication1 にしてるので、上記のようになります。
using System.Configuration;
using System.Net;
namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            ReportExecutionService rs = new ReportExecutionService();
             // レポート URL 指定。黄色部分 xxxxxxxxxがサーバー名。Windows Azure SQL Database の Reporting Services のサーバー名を指定。ここを自分のサーバ名に変えます。
            rs.Url = String.Format("https://xxxxxxxxx.reporting.windows.net:443/ReportServer/reportExecution2005.asmx", "xxxxxxxxx.reporting.windows.net");
            rs.CookieContainer = new CookieContainer();

           //第一引数 = User ID第二引数 パスワード第三引数サーバー名
            rs.LogonUser("testuser", "Passw0rd!", "xxxxxxxxx.reporting.windows.net");
            byte[] result = null;

            // レポートのパスです。
            // 例 :https://xxxxxxxxx.reporting.windows.net/ReportServer/incometaxmapの場合
            string reportPath = "/incometaxmap";

            // レポートを表示する形式です。この引数は、表示拡張機能にマップされます。
            // サポートされる拡張機能には、XML、NULL、CSV、IMAGE、PDF、HTML4.0、HTML3.2、MHTML、EXCEL、Word があります。
            // サポートされる拡張機能の一覧は、ListRenderingExtensions メソッドを呼び出すことによって取得できます。
            string format = "PDF";
            string historyID = null;
            string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>"; // そのままで構いません。
            string encoding;
            string mimeType;
            string extension;
            Warning[] warnings = null;
            string[] streamIDs = null;

            // ExecutionInfo オブジェクトは、レポートの実行に使用した設定または使用する設定を確認するために使用されます。
            // レポートの実行にパラメータと資格情報が必要かどうかを確認する場合、および Render メソッドを呼び出す前に必要なパラメータと資格情報を提供する場合にも使用されます。
            //
http://msdn.microsoft.com/ja-jp/library/reportexecution2005.executioninfo(v=sql.100).aspx
             ExecutionInfo execInfo = new ExecutionInfo();
            ExecutionHeader execHeader = new ExecutionHeader();
            rs.ExecutionHeaderValue = execHeader;
            execInfo = rs.LoadReport(reportPath, historyID);
            String SessionId = rs.ExecutionHeaderValue.ExecutionID;

            try
            {
                // レポートの出力を result に取得します。結果は byte[] なので、Windows アプリケーションで実装する場合、後の処理でファイルストリームに書き込むようにするとよいでしょう。
                result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
                execInfo = rs.GetExecutionInfo();
                }
            catch (Exception se)
            {
                System.Diagnostics.Debug.WriteLine(se.StackTrace);
            }
            // 出力処理実施
            try
            {
                Response.Clear();
                Response.Buffer = true;
                Response.ContentType = "application/octet-stream";
                // ダウンロードする場合 "attachment; filename=Test.pdf" として、Test.PDF というファイル名で保存
                Response.AppendHeader("Content-Disposition", "attachment; filename=Test.PDF");
                Response.BinaryWrite(result);
                Response.Flush();
                Response.End();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.StackTrace);
            }
        }
    }

 

4. 実行してみよう

ブラウザで、ASP.NET Web アプリケーションを実行してみます。まずは、Visual Studio でデバッグ実行でも OK です。F5 を押すとデバッグ実行が開始されます。

Web ブラウザで、ページが開かれます。

Image may be NSFW.
Clik here to view.
clip_image039

Button をクリックしますと、しばらくすると、ダウンロードのダイアログが出てきます。

Image may be NSFW.
Clik here to view.
clip_image041

ダウンロードフォルダに PDF が保存されます。

Image may be NSFW.
Clik here to view.
image

今回、コード中では、”Test.pdf” で保存をしているので、これで OK です。保存して開くと、レポートを見ることができます。

Image may be NSFW.
Clik here to view.
clip_image043

いかがでしたでしょうか。レポートを自動的に出力したいときなど、ちょっと便利じゃないですか?よかったら、やってみてくださいね!オンプレミスでも同じ手順でできますので。

それではみなさん、ごきげんよう。

Image may be NSFW.
Clik here to view.

Viewing all articles
Browse latest Browse all 293

Trending Articles