ラベル vc2005 の投稿を表示しています。 すべての投稿を表示
ラベル vc2005 の投稿を表示しています。 すべての投稿を表示

2008年5月21日水曜日

[vc2005] -- DataTable.Computeメソッドの利用。 (Sum()のみ)

 これ見るときは、下の『[vc2005] -- カラム名&型の設定』と併せるとちょっぴり幸せかも。

 以下のコードに登場する『dtSetTable』は、既に宣言されているDataTable。



// 総合計行追加DataRow dtTotalRow = dtSetTable.NewRow();
dtTotalRow[0] = "総合計"; // 名称
int k = 0;
foreach (DataColumn col in dtSetTable.Columns)   // 列数分、
{
    if (k != 0)
{
dtTotalRow[k] = dtSetTable.Compute("Sum(" + col.ColumnName + ")", null); // 集計。条件はなし
    }
k++;
}
dtSetTable.Rows.Add(dtTotalRow); // テーブルに総合計行を追加
 
 DataTable.Computeメソッドについて:
  細かい事(型の種類とか、条件の設定とか)はMSDNに記載されているので記載しない。
  自分が使ったとこだけメモ。

   DataTable.Compute("Sum(ColumnName)", filter)
   ↑これで、対象データをSumしてくれる。

   「filter」は「式で評価される行を制限するフィルタ」と、MSDNに書いてある。
   「filter」を指定しない場合は、「null」で動いた。(vb2005なら「Nothing」)。

   Sum()以外でも、Count()などのよく利用されるものは用意されている模様。
   ちなみに、文字列で指定しないといけない。(""で括る。)
   「filter」も、利用するときは文字列にしないといけない。

   そして、この集計関数を利用する場合は、DataColumn の型指定が正しくないとダメ。
   (intとか。stringぢゃ計算しちくりんばい)
   アタシも何度怒られたことか・・・VS2005に。
 
 
 

[vc2005] -- DataTableのカラム名&型設定。

 自分、VBに慣れ親しんできたんですが(といっても数ヶ月)、VCアプリの修正頼まれまして。。。
 同じ「.NET」利用でも、構文の書き方が若干違うので戸惑う。


【目的】作成した DataTable へ、新しいカラム(列)を追加する。
 以下のコードについて:
  自作関数にて取得した DataTable (コード内:dtGetData)から、新しい DataTable (コード内:dtSetTable )へデータをコピーすることが目的のコードの一部。
  上記にあたり、列名も同じくコピーしようってトコロ。

 ※コードに登場する Get_DataTbl() は自作関数。返り値はDataTable。
  ここではこの関数の詳細は記載しない。



DataTable dtGetData = new DataTable();
DataTable dtSetTable = new DataTable();

// DataTable 取得&保持。
dtGetData = Get_DataTbl();

// 列(名)設定。
dtSetTable.Columns.Add("年月"); // 一つ目のカラムを設定
foreach (DataColumn Col in dtGetData.Columns)
{
// ↓駄目なやり方。(最初にかいたコード)
//string strCol = Col.ToString();
//dtSetTable.Columns.Add(strCol);

// ↓MSDNに載っていた方法。
DataColumn dtCol = new DataColumn(Col.ColumnName); // 新しいDataColumnを作成し、カラム名を設定する
dtCol.DataType = System.Type.GetType("System.Int32"); // 作成したDataColumnの型を設定する
dtSetTable.Columns.Add(dtCol); // 作成したDataColumnを、テーブルに追加する
Console.WriteLine("[Debug--ColumnName]" + dtCol.ColumnName); // デバッグ出力(カラム名)
}



●補足
 「駄目なやり方」の方法だと、列名は設定できるけど、型の設定ができない。
 型の設定はなくてもいいときは、一応これでも動くことは動く。
 ※でも色々間違ってる。
  ・文字列型で宣言しているし、
  ・カラム名の取得を「.ToString()」で無理やりしてる。

 ただ、今回どうしても型を設定したかった。
 ここにコードは載せていないが、上記コードを含むプログラムで行っている内容が

  1.取得した DataTable『dtGetData』から、
   新しい DataTable 『dtSetTable』へデータをコピーする処理を12回繰り返し、
  2.dtSetTable に溜めたデータを列毎に集計して「総合計」として最終行に追加する。

 というもので、この集計の際に【DataTable.Compute メソッド】を使いたかったのよ。
 【.Compute メソッド】さん、便利関数。Sum() とかCount() とか Max() とか、手軽にやってくれる。
 あ、これもメモっとこう。次で。