본문 바로가기

NET/C#

DataTable을 이용한 rollup 기능

참조 : http://www.shblitz.net/92 , http://www.ezineasp.net/post/C-sharp-DataTable-Group-by-Example.aspx , http://duraboys.tistory.com/602

 

그리드뷰를 이용하여 각 레벨 별로 계정 코드에 맞게 rollup 하는 기능입니다.

DataTable 의 Select / Compute 기능을 이용

 

System.Data.DataTable dt_new = new System.Data.DataTable();

                            dt_new = dt.Copy();    //기존 데이타 테이블의 내용을 카피

                            dt_new.PrimaryKey = null;    //PrimaryKey 키 오류가 발생하므로 초기화
                           

                            DataRow[] row =  dt.Select("LEVEL = 1");

                            int Lv1Count = int.Parse(dt.Compute("COUNT(LEVEL)", "LEVEL = 1").ToString()); // DataSet의 ID = 1인 레코드의 갯수

                            for (int j = 0; j < row.Length-1; j++)
                            {
                                string strLv2Code = row[j]["CODE"].ToString();
                                strLv2Code = strLv2Code.Substring(0, 2);

                                DataRow[] row1 = dt.Select("LEVEL = 2 and CODE like '" + strLv2Code + "%'");

                                double valueLv2 = 0;

                                for (int k = 0; k < row1.Length-1; k++)
                                {
                                    string strLv3Code = row[j]["CODE"].ToString();
                                    strLv3Code = strLv3Code.Substring(0, 4);

                                    DataRow[] row2 = dt.Select("LEVEL = 3 and CODE like '" + strLv3Code + "%'");

                                    double valueLv3 = 0;

                                    for (int l = 0; l < row2.Length - 1; l++)
                                    {
                                        if (!string.IsNullOrEmpty(row[l][ColumnIndex].ToString()))
                                        {
                                            valueLv3 += Convert.ToDouble(row[l][ColumnIndex].ToString());
                                        }
                                    }
                                    
                                     if (row2.Length != 0)
                                    {
                                        row1[k][ColumnIndex] = valueLv3;
                                        dt_new.ImportRow(row1[k]);
                                    }


                                    if (!string.IsNullOrEmpty(row1[k][ColumnIndex].ToString()))
                                    {
                                        valueLv2 += Convert.ToDouble(row1[k][ColumnIndex].ToString());
                                    }

                                    
                             }

 

                                if (row1.Length != 0)
                                {
                                    row[j][ColumnIndex] = valueLv2;
                                    dt_new.ImportRow(row[j]);
                                }
                            }