studio Odyssey




スタジオ日誌

日誌的なもの

2008.12.14

このblogは、相変わらず我が道をいくのです

Written by
しゃちょ
Category
C#
プログラム

 複数人でメンテしようぜという話ですが、基本的に、このblogは我が道を行き続けるので、俺は仕事の話も書くし、プログラムの話も書くのです。
 つーか、忘れないようにメモなんですけど。

 新規開発プロジェクトのアーキタイプを作っていて、帳票系のDataSetを作っていたのですが、速度的なパフォーマンスはあとでチューニングすればいいとして、どうすれば簡単にできるかなあと考えていたんですけど、よくよく考えてみれば、DataColumnのExpressionでなんとかならないのかねと。
 帳票ツールはActiveReportsなので、ちゃんとリレーションされた更新用のDataSetがそこにあるんだから(TableAdapterManagerつかってる)、これを再利用できんもんかと。

 MSDNを見ると、Expressionはちゃんと、リレーションの親子を、ParentとChildで見られるのね。
 ちゅーわけで、サンプルコード。

 キーワードは、DataSet DataColumn Expression リレーションあたりか。
 あれ、これ、blogのキーワードにいれると、どうなるんだろう。

static void Main(string[] args)
{
    DataSet ds = new DataSet();
    {
        DataTable table = new DataTable("Type");

        ds.Tables.Add(table);

        table.Columns.Add("Type", typeof(decimal));
        table.Columns.Add("TypeName", typeof(string));

        table.Rows.Add(0, "Parent1");
        table.Rows.Add(1, "Parent2");
    }
    {
        DataTable table = new DataTable("TypeList");

        ds.Tables.Add(table);

        table.Columns.Add("Type", typeof(decimal));
        table.Columns.Add("ListNo", typeof(decimal));
        table.Columns.Add("ListName", typeof(string));

        
        table.Rows.Add(0, 0, "Child1_1");
        table.Rows.Add(0, 1, "Child1_2");
        table.Rows.Add(0, 2, "Child1_3");

        table.Rows.Add(1, 0, "Child2_1");
        table.Rows.Add(1, 2, "Child2_2");
        table.Rows.Add(1, 3, "Child2_3");
        table.Rows.Add(1, 4, "Child2_4");
    }

    //リレーション
    ds.Relations.Add("TypeListRelation", ds.Tables["Type"].Columns["Type"], ds.Tables["TypeList"].Columns["Type"]);


    //子から親
    ds.Tables["TypeList"].Columns.Add("TypeName", typeof(string), "Parent.TypeName");

    foreach (DataRow row in ds.Tables["TypeList"].Rows)
    {
        foreach (DataColumn column in ds.Tables["TypeList"].Columns)
        {
            Console.WriteLine("{0} : {1} ", column.ColumnName, row[column]);
        }
    }

    Console.WriteLine();

    //親が子を見るときは、複数行あることがあるので、集計関数が必要
    ds.Tables["Type"].Columns.Add("TypeListCount", typeof(decimal), "COUNT(Child.ListNo)");

    foreach (DataRow row in ds.Tables["Type"].Rows)
    {
        foreach (DataColumn column in ds.Tables["Type"].Columns)
        {
            Console.WriteLine("{0} : {1} ", column.ColumnName, row[column]);
        }
    }
}

 リレーション使えば、DataSetはかなり強力なんだよなぁ。
 使い方次第。


トラックバックURL

http://blog.studio-odyssey.net/cgi-bin/mt/mt-tb.cgi/14


コメントする