複数人でメンテしようぜという話ですが、基本的に、この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はかなり強力なんだよなぁ。
使い方次第。
コメントする