C#에서 DataTable의 컬럼을 가변적(유기적)으로 만들고 사용하는 방법


C# 닷넷 프로그램을 개발할 때 DataTable을 많이 사용하게 됩니다.

특히 GridView 컨트롤을 사용할 때는 DataTable에 데이터를 모두 채운 후 GridView에 Bind해서 GridView 컨트롤을 화면에 표시하게 됩니다.

프로그램을 개발하다보면 다양한 요구사항을 반영해야 할 때가 있습니다.

조회 기간의 월별 수량과 금액을 집계해서 월별로 보여줘야 할 경우가 있는데 조회 기간은 늘 가변적이게 됩니다.
조회 기간이 6개월일 수도 있고, 1년일 수도 있고, 5년일 수도 있습니다.

그리고 수량만 집계하거나 금액만 집계하거나 또는 둘다 집계해서 보여줘야 할 때도 있습니다.

이처럼 다양한 요구를 반영하기 위해 DataTable을 만들 때 Column을 가변적(유기적)으로 만드는 방법과 이렇게 만들어진 DataTable에 Row를 추가하는 방법에 대해 알아보겠습니다.

C#에서 DataTable의 컬럼을 가변적(유기적)으로 만들고 사용하는 방법

C#에서 DataTable의 Column을 가변적으로 만드는 방법

아래 예제는 조회기간을 textFrom과 textTo로 입력 받아 DataTable의 컬럼을 “년월” 이름으로 만드는 예제 입니다.

매월 입고수량과 입고금액, 그리고 출고수량과 출고금액의 Column을 추가하고 있습니다.

예) 2023년1월인 경우 데이터테이블의 컬럼명은 “202301_IN_QTY“, “202301_IN_AMT“, “202301_OUT_QTY“, “202301_OUT_AMT” 이렇게 4개가 추가됩니다.

컬럼의 데이터 타입은 모두 “decimal”이고, 디폴트 값은 “0”으로 지정해 주었습니다.

//조회 범위의 월별 수량과 금액을 집계하기 위해 DataTable의 컬럼을 가변적으로 만듦
int iFrom = int.Parse(DateTime.Parse(textFromDate.Text).ToString(“yyyyMM”));
int iTo = int.Parse(DateTime.Parse(textToDate.Text).ToString(“yyyyMM”));
 
DataTable dt = new DataTable();
 
dt.Columns.Add(“Plant”typeof(string));
dt.Columns.Add(“ToolCode”typeof(string));
dt.Columns.Add(“ToolName”typeof(string));
 
for (int i = iFrom; i < iTo; i++)
{
    //입고수량
    string name = i.ToString() + “_IN_QTY”;
    dt.Columns.Add(name, typeof(decimal));
    dt.Columns[name].DefaultValue = 0;
    //입고금액
    name = i.ToString() + “_IN_AMT”;
    dt.Columns.Add(name, typeof(decimal));
    dt.Columns[name].DefaultValue = 0;
 
    //출고수량
    name = i.ToString() + “_OUT_QTY”;
    dt.Columns.Add(name, typeof(decimal));
    dt.Columns[name].DefaultValue = 0;
    //출고금액
    name = i.ToString() + “_OUT_AMT”;
    dt.Columns.Add(name, typeof(decimal));
    dt.Columns[name].DefaultValue = 0;
 
    if (i.ToString().Substring(4,2== “12”)
        i = i  12 + 100;
 
}
dt.Columns.Add(“SUM_IN_QTY”typeof(decimal));
dt.Columns.Add(“SUM_IN_AMT”typeof(decimal));
dt.Columns.Add(“SUM_OUT_QTY”typeof(decimal));
dt.Columns.Add(“SUM_OUT_AMT”typeof(decimal));
 


– 요구사항에 따라 수량 컬러만 추가하거나 금액 컬럼만 추가하거나 또는 예제처럼 둘 다 추가해서 사용할 수 있습니다.

C#에서 가변적으로 만들어진 DataTable의 Column을 사용하는 방법

아래 예제의 조회 기간의 Tool Code에 대한 입고와 출고를 DataSet으로 가져와서 앞에서 만든 DataTable에 Row를 추가하는 예제입니다.

데이터베이스 테이블의 CloseYM 컬럼이 DataTable의 컬럼과 매칭해서 Row의 Column에 값이 들어가게 됩니다.
DataTable의 “Plant”에 동일한 Plant가 있고, “ToolCode”에 동일한 코드가 있으면 수량과 금액을 더해주고, 새로운 코드면 추가해 주는 로직입니다.

foreach (DataRow dr in ds.Tables[0].Rows)
{
    DataRow row = dt.NewRow();
    
    row[“Plant”= dr[“Plant”].ToString().Trim();
    row[“ToolCode”= dr[“ToolCode”].ToString().Trim();
    row[“ToolName”= dr[“ToolName”].ToString().Trim();
 
    string yearmonth = dr[“CloseYM”].ToString();
 
    decimal inputqty = decimal.Parse(dr[“InputQty”].ToString());
    decimal inputamt = decimal.Parse(dr[“InputAMT”].ToString());
    decimal outputqty = decimal.Parse(dr[“OutputQty”].ToString());
    decimal outputamt = decimal.Parse(dr[“OutputAMT”].ToString());
 
    // 동일한 Plant와 ToolCode인 경우 수량과 금액을 해당 년월 컬럼에 더해 줌.
    DataRow[] drow = dt.Select(string.Format(“Plant='{0}’ AND ToolCode='{1}'”, row[“Plant”], row[“ToolCode”]));
 
    if (drow.Length > 0)
    {
        string name = yearmonth + “_IN”;
        drow[0][name] = decimal.Parse(drow[0][name].ToString()) + inputqty;
        name = yearmonth + “_IN_AMT”;
        drow[0][name] = decimal.Parse(drow[0][name].ToString()) + inputamt;

        drow[0][“SUM_IN”= decimal.Parse(drow[0][“SUM_IN”].ToString()) + inputqty;
        drow[0][“SUM_IN_AMT”= decimal.Parse(drow[0][“SUM_IN_AMT”].ToString()) + inputamt;
 
        name = yearmonth + “_OUT”;
        drow[0][name] = decimal.Parse(drow[0][name].ToString()) + outputqty;
        name = yearmonth + “_OUT_AMT”;
        drow[0][name] = decimal.Parse(drow[0][name].ToString()) + outputamt;

        drow[0][“SUM_OUT”= decimal.Parse(drow[0][“SUM_OUT”].ToString()) + outputqty;
        drow[0][“SUM_OUT_AMT”= decimal.Parse(drow[0][“SUM_OUT_AMT”].ToString()) + outputamt;
    }
    else
    {
        row[“anMonthTool”= month;
        string name = yearmonth + “_IN”;
        row[name] = inputqty;
        name = yearmonth + “_IN_AMT”;
        row[name] = inputamt;

        row[“SUM_IN”= inputqty;
        row[“SUM_IN_AMT”= inputamt;
 
        name = yearmonth + “_OUT”;
        row[name] = outputqty;
        name = yearmonth + “_OUT_AMT”;
        row[name] = outputamt;

        row[“SUM_OUT”= outputqty;
        row[“SUM_OUT_AMT”= outputamt;
 
        dt.Rows.Add(row);
    }
}
 


이상으로 C#에서 DataTable의 컬럼을 가변적(유기적)으로 만들고 사용하는 방법에 대해 알아보았습니다.
C#에서 DataTable을 좀 더 유연하게 사용할 수 있는 팁입니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기