Microsoft Report の基礎の基礎

実は以前にも同じ件を書いてられる人が見えたのですがちょっと初見の人には難しく感じたので（汗　もっと簡単に「結果をコミット」する為の試みです。

#MicrosoftReportとは

ExpressEditionには無いのかもしれませんがCommunityがある現在では問題にならないかと思います。
未だにCrystalReportの呪いがある人でそんなたいした帳票を出してない人には選択肢の一つとなると思います。
ネットで結構有名なC#等の質問サイト等に行くとすぐに「ActiveReportを導入しなさい」的な書き込みが多く見られます。
私が昔から尊敬するネットで良く質問に答えて下さる様な人たちも同じ返答をします。
ActiveReportって結構良い値段します。

<h2>なぜMicrosoftReportなのか？</h2>
無料だという事とコンポーネントの互換を気にしなくて良い事です。
今回使おうと思ったのはVS2015が出てCommunityを使ってみようと思った事でした。
簡単な顧客管理のプログラムを依頼され、先方の予算も安かったし（笑）当初は帳票の予定が無く、画面のみでの確認で良かった為、じゃあせっかくだからVS2015で開発してみようと思った訳です。
んが良くある事ですがテストで使ってもらいデータ登録を始めてみると「やっぱり顧客一覧は紙に出したいな・・・」って言われた訳です。

さて、CrystalReportは今のところ2015に対応してないみたいだし、どうしようか・・・って思ってて「あ、これくらいならMicrosoftReportでも行けるかも？」と言うのがきっかけでした。

CrystalReportはここ数回、新しいVSが出てから対応版が出る間での期間が大変長くなってきてます。
そもそも無償でサポートしてくれてるだけなので、正直いつ対応をやめられても文句は言えない状況な訳です。
ですのでどうしても必要なら有償のActiveReport等は新しいVSが出れば比較的すぐに対応版を出してきますし、出なければ文句も言えるしと言う事になるでしょうか（笑
後はCrystalReportはランタイムがでかくて数十MBの物を顧客PC毎にインストールしなきゃ行けないのはちょっと躊躇するんですよね・・・


ここでは簡単にデータベースのテーブルからデータを取り出してそれを表（テーブル）として表示するまでを目標に進めたいと思います。

<h2>まずはこの件の環境</h2>
IDE：VISUAL STUDIO Community 2015
言語：C#　WindowsForm
FrameWork：4.5.2
データデース：SQLite
データベースにはテーブルにデータはすでに入っているものとして進めていきます。

<h3>データセットの作成</h3>
プロジェクト右クリック→追加→新しい項目
左側の列から「データ」をクリックして、右側から「データセット」を選択　名前は適当で良いけど、ここでは「DsKokyakuList」とします。

データセットデザイナが（正式には「ビューデザイナ」って言うのかな？右クリックではそう出てくる）立ち上がるので、何も無い所で右クリックして「追加→DataTable」とします。
すると真ん中にボックスが一個出来るので「Dt1」と名前を付けます。
そして右クリックで「列」を追加しながらデータベースと同じ列名を作成していって下さい。
初心者のやりがちなミスとしてここでデータセットに厳密に型を設定したくなるって言うのがあります（笑
とりあえず型はレポートの方でキャストとかすれば良いのでまずは全てStringのままでやってみて下さい。

スクリーンショットでは６列作ってあります。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/12930/622f3d79-9b7a-4768-4936-f94bb28ef626.jpeg)

<h3>余談でデータセットとは（超簡易説明）</h3>
簡単に言うと、データセットとはエクセルのブックで、データテーブルはシートだと思って下さい。
ですので今回は簡単にしてますが実際は一つのデータセットの中に複数のデータテーブルを入れてリレーションしたりして、データを取り出すような事が可能です。
必要なデータをデータベースからいったんデータセットの中に取り込んで、そこからレポートやらグリッドやらに表示用のデータを取り出して与えるようなイメージを持つと良いかも。

<h3>帳票をデザインする</h3>
プロジェクトを右クリック→追加→新しい項目
左列のレポーティングをクリックして右側の「レポート」を選択　名前は適当でOKだがここでは「Report1.rdlc」にします。

でそのままだと何も無いのでツールボックスから「テーブル」をデザイナへドラッグします。
すると「データセットのプロパティ」画面が開いてきます。
これはテーブルにどんなデータを表示したら良いのか？を決める画面です。
「名前」はそのままでOK　ここだとDataSet1になってると思います。
「データソース」に先ほど作成したデータセットを選択すると勝手に「使用できるデータセット」にDt1が選ばれるはずです。
スクリーンショットはここまで完了した状態。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/12930/f2da94f7-e136-7879-48e9-9e55d31878ad.jpeg)

後はこれをコードにしていきます。

<h3>フォーム側の処理</h3>
フォームを一つ作って、ツールの「レポート」から「ReportViewer」をフォーム画面にドラッグします。
好みですがDockをFillにしておけばフォームいっぱいに表示されます。

後はLoad部分なり、Clickのイベント部分に下記コードを書きます。

```
using (SQLiteConnection cn = new SQLiteConnection("Data Source=database.db;version=3;"))
            {
                DsKokyakuList ds1 = new DsKokyakuList();

                cn.Open();
                SQLiteCommand com = cn.CreateCommand();
                string sql = "select * from member where enable = 1 ";

                //データセット作成
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, cn);
                adapter.Fill(ds1.Dt1);

                //レポートセッティング
                reportViewer1.Reset();
                reportViewer1.ProcessingMode = ProcessingMode.Local;
                reportViewer1.LocalReport.ReportPath = Environment.CurrentDirectory + @"\Report1.rdlc";
                ReportDataSource rds = new ReportDataSource();
                rds.Name = "DataSet1";
                rds.Value = ds1.Dt1;
                //ReportViewerに表示
                this.reportViewer1.LocalReport.DataSources.Add(rds);
                this.reportViewer1.RefreshReport();
            }
```
まずはデータセットを初期化します。
でここではデータベースのmemberテーブルの有効（enable）な物を全て取り出しています。

データセット作成部分ではデータアダプタを初期化してSQLを実行させ、データセット内のデータテーブルにデータを入れています（Fillの部分）

でいよいよレポートの設定です。
ビューワーを初期化して、レポートファイルを設定します。
rds.nameの所はデータセットのプロパティ＠スクリーンショットの「名前」を入れます。
rds.Valueの部分にFillしたデータテーブルを与えます。

でデータソースとして追加して、ビューワーを再描画させれば表示されます。

![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/12930/ba84eaca-9562-bdd2-2097-619e7a591195.jpeg)
（実際のデータもあるのでモザイクかけてます　笑）
スクリーンショットはヘッダを追加したり、出力日を追加したりして触ってます。
実際の所は結構複雑な物まで対応できると思います。
情報が少ないので毛嫌いしてる人は多いと思いますが、簡単なグラフ等もいけますし、大企業の超凝った必要あるのか分からないグラフまみれのレポートでも無ければ（汗　通常はこれで十分な気がします。