SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

5分でわかるActiveReports帳票

5分でわかるActiveReports帳票-さまざまなデータソースの利用とデータのグラフ表示(2007年度版)

ActiveReports for .NET 3.0Jで作るサンプル帳票

  • このエントリーをはてなブックマークに追加

ChartControlを利用したグラフの作成

 ここからは、データソースとして指定したXMLファイルに含まれていない項目の表示部分について説明していきます。

 ActiveReportsで帳票にグラフを描画するには、ChartControlコントロールを利用します。ツールバーからレポートデザイナ上のグラフを描画したい場所へChartControlコントロールをドロップすると、自動的にグラフウィザードが起動します。グラフウィザードでは、画面の指示に従って必要な項目を設定していくことでグラフを作成できます。

 今回はグラフにバインドするデータソース(成績データを取得する部分)をまだ作っていないので、そのままの状態で「完了」ボタンを押し、いったんグラフウィザードを終了します。

グラフウィザード
グラフウィザード

 今回の帳票ではX軸(横軸)に「テスト実施月」を、Y軸(縦軸)にテストの点数を取り、科目ごとに点数をバーで表示する簡単な棒グラフを作成します。

成績グラフ
成績グラフ

 グラフを表示させるためのデータは、Accessデータベースに次のような形式で格納されています。

グラフ表示に必要な成績データ(一部)
グラフ表示に必要な成績データ(一部)

グラフに表示するためのデータを取得する

 グラフは生徒ごとに別々のものを表示する必要があるので、データを取得するには生徒のID番号を指定して試験結果を取得する、以下のようなSQLを考えます。「?」の部分は実行時に生徒のID番号がバインドされます。

グラフ描画に必要なデータを取得するSQL
  SELECT ExamName, MONTH(ExamDate) as ExamDate, StudentID,
         JapaneseScore, MathScore, EnglishScore
    FROM ExamResults
   WHERE StudentID = ?
ORDER BY ExamDate

接続文字列は設定ファイルに書こう

 前回までは便宜のため、ソースコード中に接続文字列を直接記述(ハードコーディング)していましたが、接続先データベースやアカウントの情報をハードコーディングしてしまうと、設定を変えるたびにソースを修正して再ビルドしなくてはならず、非常に不便です。

 今回は、アプリケーション設定ファイル(App.config)に接続文字列を記述しておき、実行時に読み出す方法を紹介します。App.configには接続文字列を記述するためのconnectionStringsセクションが用意されているので、ここに接続文字列と設定名を記述します。ここではAccessデータベースへの接続と、SQL Serverへの接続を追加します。

設定ファイル(App.config)の接続文字列定義例
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <!--Accessデータベースへの接続-->
    <add name="access"
         connectionString="Provider=Microsoft.Jet.OLEDB.4.0;
         Data Source=C:\ActiveReports3\Sample_05\Students.mdb;
         Persist Security Info=False"/>
    <!--SQL Serverデータベースへの接続-->
    <add name="sqlserver"
         connectionString="Data Source=localhost\sqlexpress;
         Database=Sample05;Trusted_Connection=SSPI;
         Persist Security Info=True;"/>
  </connectionStrings>
</configuration>

 App.configに定義した接続文字列をアプリケーション側で取得するには、System.Configuration.ConfigurationManagerクラスを使用します。ConfigurationManagerクラスを使う場合、ソースの先頭にUsing(VBの場合はImports)ディレクティブを追加するだけでなく、プロジェクトにSystem.Configuration.dllへの参照を追加する必要があります。

接続文字列の取得(C# 2.0)
string connStr
 = ConfigurationManager.ConnectionStrings["access"].ConnectionString;
接続文字列の取得(VB.NET 2005)
Dim connStr = _
 ConfigurationManager.ConnectionStrings("access").ConnectionString

グラフに必要なデータの取得処理

 App.configに接続文字列を記述したら、今度はActiveReports帳票のDetailFormatイベントに、生徒1人分のテスト結果データを取得してグラフを描画するためのコードを追加します。

DetailFormatイベント(C# 2.0)
private void detail_Format(object sender, EventArgs e)
{
    this.chartControl1.Visible = true;
    //XMLの科目コード(EMJなど)を「英・数・国」などの表記に変更
    //subjects(Dictionary型)の初期化はReportStartイベントで行う
    this.txtsubject1.Text
     = subjects[this.txtsubject1.Value.ToString()];

    //クエリの定義
    string query
    = "SELECT ExamName, MONTH(ExamDate) as ExamDate, StudentID, "
    + "JapaneseScore, MathScore, EnglishScore "
    + "FROM ExamResults "
    + "WHERE StudentID = ? "
    + "ORDER BY ExamDate ";

    //設定ファイルから接続文字列を取得する
    string connStr
  = ConfigurationManager.ConnectionStrings["access"].ConnectionString;

    //Accessデータベースに接続し、取得したデータをDataTableに格納する
    DataTable dt = new DataTable();
    using (OleDbConnection conn = new OleDbConnection(connStr))
    {
        OleDbCommand cmd = new OleDbCommand(query, conn);
        cmd.Parameters.Add(new OleDbParameter(
                                 "id", this.txtIdHidden.Value));
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        da.Fill(dt);
    }

    //DataTableをChartControlのデータソースに設定する
    this.chartControl1.DataSource = dt;
}
DetailFormatイベント(VB.NET 2005)
Private Sub Detail_Format(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Detail.Format

    Me.ChartControl1.Visible = True
    'XMLの科目コード(EMJなど)を「英・数・国」などの表記に変更
    'subjects(Dictionary型)の初期化はReportStartイベントで行う
    Me.TextSubject1.Text = subjects(Me.TextSubject1.Value.ToString())

    '設定ファイルから接続文字列を取得する
    Dim connStr = _
 ConfigurationManager.ConnectionStrings("access").ConnectionString

    Dim query _
    = "SELECT ExamName, MONTH(ExamDate) as ExamDate, StudentID, " _
    & "JapaneseScore, MathScore, EnglishScore " _
    & "FROM ExamResults " _
    & "WHERE StudentID = ? " _
    & "ORDER BY ExamDate "

    'Accessデータベースに接続し、取得したデータをDataTableに格納する
    Dim dt As New DataTable
    Using conn As New OleDbConnection(connStr)
        Dim cmd As New OleDbCommand(query, conn)
        cmd.Parameters.Add(New OleDbParameter( _
                                  "id", Me.TxtIdHidden.Value))
        Dim da As New OleDbDataAdapter(cmd)
        da.Fill(dt)
    End Using

    'DataTableをChartControlのデータソースに設定する
    Me.ChartControl1.DataSource = dt
End Sub

取得したデータとChartControlコントロールのマッピング

 グラフ表示に使うデータ取得処理ができあがったら、次はChartControlコントロールとグラフデータの紐付けを行います。プロパティウィンドウの右下に表示されている「グラフ デザイナ」のリンクをクリックすると、グラフデザイナが起動されます。

 グラフデザイナのウィンドウが表示されたら、左側に表示されている「系列」ボタンをクリックし、グラフに表示するアイテム(国語、数学、英語)を追加していきます。左上に表示されている「アイテム追加ボタン」をクリックしてアイテムを追加し、オブジェクト名を「Japanese」とします。また、X軸のデータバインドには「ExamDate」を、Y軸のデータバインドには「JapaneseScore」を入力します。同様の手順で数学(Math)、英語(English)の系列も追加します。

 グラフデザイナではこの他「グラフエリア」「タイトル」「凡例」「概観」などの設定項目を変更することで、グラフの見栄えを設定できます。

プロパティウィンドウの下に「グラフデザイナ」へのリンクが表示される
プロパティウィンドウの下に「グラフデザイナ」へのリンクが表示される
グラフデザイナ
グラフデザイナ
今回グラフデザイナで設定した項目
  • グラフエリア:3Dをオフにする
  • グラフエリア-軸(AxisX)「全般」タブ:種類=カテゴリ軸、最大値=6、タイトル=なし
  • グラフエリア-軸(AxisY)「全般」タブ:種類=数値軸、最大値=100、タイトル=Score
  • グラフエリア-軸(AxisY)「ラベル」タブ:「表示」にチェック
  • タイトル:ヘッダ、フッタを非表示
  • 凡例:「タイトル」タブ→ヘッダ、フッタを非表示
  • 概観:パレットを「Greens」に変更、グラフ全体の背景を白(単色)に変更

OleObjectコントロールによるExcelワークシートの貼り付け

 帳票フッタでは、これまでに実施した学力テストの平均偏差値とテストの平均点を表形式で表示しています。これは、特に複雑なことをやっているわけではなく、Excelワークシートをそのまま表示させています。ActiveReports帳票でExcelワークシートなどのOLEオブジェクトを取り込んで表示するには、OleObjectコントロールを使用します。

Excelファイル
Excelファイル

 OleObjectコントロールをレポートデザイナへドラッグ&ドロップすると、挿入オブジェクトを指定するダイアログが表示されるので、目的のファイルを読み込みます。

OleObject
OleObject
読み込み後
読み込み後

 このコントロールは実行環境にExcelがインストールされていなくてもコントロールの描画を行いますが、実行環境にActiveReports.Interop.dll がないとエラーメッセージが表示されてしまいますので注意が必要です。

OleObjectの描画エラー
OleObjectの描画エラー

 このコントロールはAccessデータベースなどのDB内のOleObjectをバインドする用途でも利用できますが、CanGrowプロパティがないので、固定幅で表示されます。

次のページ
データソースとしてDataReaderを使用する

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
5分でわかるActiveReports帳票連載記事一覧

もっと読む

この記事の著者

宮本奈紗(ミヤモトナサ)

株式会社システムインテグレータ ERPソリューション部所属。ERPシステムの設計・開発に従事。業務でActiveReportsを使用。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

渡辺俊史(ワタナベトシフミ)

株式会社システムインテグレータ パッケージ開発部所属。ECサイト構築パッケージの設計・開発に従事。VSUG(Visual Studio User Group) データベース・データアクセスフォーラムリーダー。blog...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1943 2014/02/06 11:25

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング