SHOEISHA iD

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

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

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

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

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

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 データ表示

次のページ
グリッド表示UIでできること

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

  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ComponentOne Studio)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

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

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9524 2016/07/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング