Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

IoT時代のコンポーネントの決定打、FlexPivotで高速データ分析アプリをつくろう

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2016/07/27 14:00
目次

DBに接続する

 今回のサンプルデータとしてはComponentOne Studio EnterpriseのWindowsフォームサンプルにあるNorthWnd.mdfファイルを使用します。

データベースとの接続

 MDFファイルとの接続は、System.Data.SqlClient.SqlConnectで行います。DataPath_TextBox.Textに、NorthWnd.mdfファイルの位置が絶対パスで設定されているものとすると、接続するための文字列は次のようになります。

リスト1 接続文字列
var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions\12.0");
var ver = key == null ? "v11.0" : "MSSQLLocalDB";
return string.Format(@"Data Source=(LocalDB)\{0};AttachDbFilename={1};Integrated Security=True;Connect Timeout=30", ver, this.DataPath_TextBox.Text);

 指定したMDFファイルからDataTableに値を取得します。接続文字列「GetConnectionString」を指定して、SqlConnectionをOpenしてからSqlDataAdapterでSQL分を指定してDataTableに値を取得するまでの流れは次のようになります。

リスト2 SqlConnection
using (var conn = new SqlConnection(GetConnectionString()))
{
    conn.Open();

    using (var da = new SqlDataAdapter(Properties.Resources.SqlStatement, conn))
    {
        using (var dt = new DataTable("NorthWind Sales Data"))
        {
             da.Fill(dt);

    //ここにC1FlexPivotPageへの設定ロジックを記述する
        }
    }
    //
    conn.Close();
}

 SqlStatement自体はリソースとしてコード外で定義しています。かなり複雑なSQL文になるので詳細はサンプルコードを参照してください。

 なお、サンプルコードではC1FlexPivotPageの設定前に、AddToDataTableメソッドの中で50万行のテストデータをDataTableに生成しています。こちらも詳細はサンプルコードを参照してください。

データ保存ファイルの指定

 C1FlexPivotPageはローカルに作業用ファイルを用いることでメモリ利用量を効率化します。そのため、最初に行うべき作業は作業ファイルの指定です。

リスト3 Workspace.Init
string DataPath = Path.Combine(System.Windows.Forms.Application.StartupPath, "Data");
		:
		(中略)
		:
this.MyPivot.FlexPivotPanel.Workspace.Init(this.DataPath);

データをインポート

 ADO.NET標準であるSystem.Data.DataTableよりも高速動作可能なC1.DataEngine.Tableに、値をインポートします。

リスト4 DataEngine テーブルにインポート
private void AddToEngineTable(SqlConnection conn, DataTable table, int count)
{
    this.MyPivot.FlexPivotPanel.Workspace.Clear();
    C1.DataEngine.DbConnector.GetData(this.MyPivot.FlexPivotPanel.Workspace, table, table.TableName);
}

C1.DataEngine.TableとC1FlexPivotPageを接続

 C1.DataEngine.Tableにインポートが完了したら、C1FlexPivotPageからC1.DataEngine.Tableに接続します。

リスト5  C1.DataEngine.Tableに接続
var fPanel = this.MyPivot.FlexPivotPanel;
fPanel.FlexPivotEngine.BeginUpdate();
fPanel.ConnectDataEngine(dt.TableName);
SetLookupSQL(conn);     // コード引き設定
fPanel.FlexPivotEngine.EndUpdate();

マスタテーブルからのコード引き設定

 SetLookupSQLメソッドでは、マスタテーブルからのコード引き部分をDictonaryとして定義し、それをLookupプロパティとして設定します。今回のサンプルでは次の5つのマスタが存在します。

  1. Country
  2. Product
  3. Customer
  4. Employee
  5. Category

 一例としてCountryでの設定を具体的にみていきましょう。

リスト6 Categories マスタからの取得SQL
SELECT [CategoryID], [CategoryName] FROM Categories

 取得SQLは必ずコードとコード値の順でSELECT句を書きます。このSQL文を使ってDictionaryのKeyとValueを設定します。

リスト7 Dictionary 生成
Dictionary<object, string> GetLookup(SqlConnection conn, string command)
{
    var dict = new Dictionary<object, string>();
    SqlCommand cmd = new SqlCommand(command, conn);
    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    while (reader.Read())
        dict.Add(reader.GetValue(0), reader.GetString(1));
    reader.Close();
    return dict;
}

 Dictionaryができたら、フィールド名「Category」フィールドのLookupプロパティに設定します。

リスト8  Lookupプロパティに設定
private void FillLookup(SqlConnection conn, string fieldName, string lookupSql)
{
    var field = this.MyPivot.FlexPivotPanel.FlexPivotEngine.Fields[fieldName];
    if (field.Lookup == null)
        field.Lookup = GetLookup(conn, lookupSql);
}

 これでコードの記述は完了です。早速動かしてみましょう。

サンプルの実行

 サンプルを実行して[接続]ボタンをクリックするとマシンスペックにもよりますが5秒程度で50万行のデータが生成されます(参考までにSystem.Data.DataTableを使うと40秒程度かかります)。

図5 サンプルの実行
図5 サンプルの実行

 データが生成できたら、[テーブルに加えるフィールドを選択してください]チェックリストから「Country」は[行フィールド]、「Category」は[列フィールド]、「Sales」は[表示するデータ]にそれぞれドラッグ&ドロップします。

 これで、Country-CategoryのSales合計表が完成します。

図6 データ表示
図6 データ表示

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

著者プロフィール

  • 初音玲(ハツネアキラ)

    国内SIerのSEで受託開発を主に行っています。Visual Basic + Oracleという組み合わせに関する事が得意です。 Internet of Thingsという名前もよく聞くようになってきてセンサーとクラウドという組み合わせに注目があつまっています。Kinectなどのモーションセンサー...

バックナンバー

連載:現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ComponentOne Studio)

もっと読む

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5