忘れがちなことを、つらつらと...

俺的備忘録を公開してみるテスト

SQL Serverで作成したレポートを出力する

SQL Server2008のReporting Serviceを使って固定帳票を出してる訳なんだけど、自動で帳票を作成して欲しいんだよね。まぁ、サブスクリプションでも簡単にはできるんだけど、だいたいこういった機能って、本番運用に耐えられないんだよね...200種類ぐらい帳票あるし、いろんな条件絡んでくるし...

バッチとかスケジューラとかで使えるように、Webサービスを使ってレポート出力するプログラムを作ってみた。

/*
 * SharpDevelopによって生成
 * ユーザ: hoge
 * 日付: 2014/02/18
 * 時刻: 00:10
 * 
 * このテンプレートを変更する場合「ツール→オプション→コーディング→標準ヘッダの編集」
 */
using System;
using System.IO;
using System.Web.Services.Protocols;
using hoge.hoge;

namespace hoge
{
    class ReportWriter
    {
        private ReportExecutionService rs = new ReportExecutionService();
        public string ServerName { get; set; }
        public string ReportName { get; set; }
        public string OutputName { get; set; }
        public string Params { get; set; }
        public string ExportType { get; set; }

        public ReportWriter(string pServerName)
        {
            rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
            ServerName = pServerName;
            rs.Url = "http://" + ServerName + "/reportserver/ReportExecution2005.asmx";
        }
        public bool Write() {
            byte[] result = null;
            string historyID = null;
            string devInfo = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
            int paramLen = 0;
            string[] reportParams =Params.Split('|');
            bool retcode;
            
            if (!Params.Equals(string.Empty)){
                paramLen =  reportParams.Length;
            }
            // レポートパラメータの設定
            ParameterValue[] parameters = new ParameterValue[reportParams.Length];
            for (int i = 0; i < paramLen; i++) {
                parameters[i] = new ParameterValue();
                string[] tempParams = reportParams[i].Split(':');
                parameters[i].Name = tempParams[0];
                parameters[i].Value = tempParams[1];
            }
            string encoding = "";
            string mimeType = "";
            Warning[] warnings = null;
            string[] streamIDs = null;
            ExecutionInfo execInfo = new ExecutionInfo();
            ExecutionHeader execHeader = new ExecutionHeader();
            string extension = "";

            try {
                rs.ExecutionHeaderValue = execHeader;
                execInfo = rs.LoadReport(ReportName, historyID);
                rs.SetExecutionParameters(parameters, "ja-jp");
                result = rs.Render(ExportType, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
                execInfo = rs.GetExecutionInfo();
                FileStream stream = File.Create(OutputName, result.Length);
                stream.Write(result, 0, result.Length);
                stream.Close();
                retcode = true;
            } catch (Exception e) {
                retcode = false;
            }
            return retcode;
        }
    }
    
    class Program
    {
        public static void Main(string[] args)
        {
            ReportWriter rw = new ReportWriter("hoge");
            rw.ReportName = "/消費税対応/売上一覧表";
            rw.OutputName = "C:\\Users\\hoge\\Documents\\sample.pdf";
            rw.ExportType = "PDF";
            rw.Params = "";
            rw.Write();
            
            // TODO: Implement Functionality Here
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}

SharpDevelop 4.3を使った場合の設定手順は

SnapCrab_hoge - SharpDevelop_2014-2-18_11-24-55_No-00

Webサービスの参照設定をする。

SnapCrab_NoName_2014-2-18_11-33-17_No-00

アドレスバーに http://レポーティングサーバのIPか名前か/ReportServer/ReportExecution2005.asmx を入力して移動ボタンをクリック。資格情報を入力すると

SnapCrab_NoName_2014-2-18_11-33-38_No-00

となるので、名前空間と参照名を指定して

SnapCrab_hoge - SharpDevelop_2014-2-18_11-27-29_No-00

こんな感じになればいい。

あと、System.Web.Services の参照設定も忘れずに!

SnapCrab_NoName_2014-2-18_11-33-50_No-00

これを選べばいい。

SnapCrab_NoName_2014-2-18_11-34-9_No-00