자료실

부자는 돈을 써서 시간을 아끼지만 가난한 사람은 시간을 써서 돈을 아낀다

vb.net

IT HUB를 찾아주셔서 감사합니다.

Controls [vb.net] DataTable 날짜를 그룹으로 설정하고 그룹별 합계내기

페이지 정보

profile_image
작성자 하나를하더라도최선을
댓글 0건 조회 10,767회 작성일 20-07-16 20:21

본문

지식인 답변내용입니다.


70cd5d03da4119edb04c5d655a914e40_1594898394_3149.png
 



Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim D As New DataTable, R As DataRow
        D.Columns.Add("금액", GetType(Integer))
        D.Columns.Add("날짜", GetType(Date))
        D.Columns.Add("종류", GetType(String))
        D.Columns.Add("품명", GetType(String))
        For i = 1 To 10
            R = D.NewRow
            R("금액"= Int(Rnd() * 100* 10
            R("날짜"= Date.Today.AddDays(Int(Rnd() * 4- 3)
            R("종류"= Choose(Int(Rnd() * 4+ 1"과일""채소""음료""육류")
            R("품명"= "내가산 품명 " & i
            D.Rows.Add(R)
        Next
        DataGridView1.DataSource = D
    End Sub 
 
    Private Sub DataGridView1_DataSourceChanged(sender As Object, e As EventArgs) Handles DataGridView1.DataSourceChanged,
                                                                                          DataGridView2.DataSourceChanged
        DATAGRIDVIEW_DEFAULT_SETTING(sender)
    End Sub
 
    Public Function DATAGRIDVIEW_DEFAULT_SETTING(ByRef DGV As DataGridView) As DataGridView
        DGV.AllowUserToAddRows = False
        DGV.RowHeadersVisible = False
        DGV.AllowUserToDeleteRows = False
        DGV.ColumnHeadersDefaultCellStyle.BackColor = Color.LightGray
        DGV.ColumnHeadersDefaultCellStyle.Font = New Font("맑은 고딕"9.0!, FontStyle.Bold)
        DGV.BackgroundColor = Color.White
        DGV.AutoResizeColumnHeadersHeight() 
        DGV.AutoResizeColumns() 
        For Each C As DataGridViewColumn In DGV.Columns
            C.SortMode = DataGridViewColumnSortMode.Programmatic    '// 해더 클릭시 Sort X
        Next 
        Return DGV
    End Function
    
    ?Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Not IsDate(TextBox2.Text) Then MsgBox("[시작일] 날짜형식이 아닙니다.") : Return
        If Not IsDate(TextBox3.Text) Then MsgBox("[종료일] 날짜형식이 아닙니다.") : Return
        Dim D As DataTable = DataGridView1.DataSource
        Dim expression As String = String.Format(
            "날짜 >= '{0}' AND 날짜 <= '{1}'",
            DateValue(TextBox2.Text).ToString("yyyy-MM-dd"),
            DateValue(TextBox3.Text).ToString("yyyy-MM-dd")
        )
        D = D.Select(expression).CopyToDataTable()
        Dim fruitGroups = D.AsEnumerable().GroupBy(Function(row) row.Field(Of Date)("날짜"))
        Dim tableResult = D.Clone()
        For Each grp In fruitGroups
            tableResult.Rows.Add(
                grp.Sum(Function(row) row.Field(Of Int32)("금액")), grp.Key,
                grp.First().Field(Of String)("종류"),
                grp.First().Field(Of String)("품명")
            )
        Next
        DataGridView2.DataSource = tableResult
    End Sub
End Class        
 
 

원칙적으로 아래와 같이 하는것이 맞을것이다.

        Dim D As DataTable = DataGridView1.DataSource
        Dim q = From r In D.AsEnumerable()
                Select C1 = r.Field(Of Integer)("금액"),
                        C2 = r.Field(Of String)("날짜"),
                        C3 = r.Field(Of Integer)("종류"),
                        C4 = r.Field(Of Integer)("품명")
                Group By C2, C3, C4 Into Group
                Select C1 = Group.Sum(Function(x) x.C1), C2, C3, C4
        Dim result = D.Clone()
        For Each item In q
            result.Rows.Add(item.C1, item.C2, item.C3)
        Next
        DataGridView2.DataSource = result
 
 
 

첨부파일

댓글목록

등록된 댓글이 없습니다.