Menu Horisontal

Selasa, 07 November 2017

Sub Total dan Grand Total di Datagridview VB.net

Setelah lama vacum dari blogger, tiba2 teman menanyakan bagaimana caranya membuat Sub Total dan Grand Total di Datagridview seperti dibawah ini


setelah dicoba-coba akhirnya dapat procedure seperti dibawah ini. Procedurenya simpan di modul

ini procedure SubTotal

Public Sub SubTotalDGV(dgv As DataGridView, GroupOn As Integer, TotalOn As Integer, Warna As Color)
        Dim clST As New DataGridViewTextBoxColumn
        Dim clSTID As New DataGridViewTextBoxColumn
        Dim Total As Double = 0
        Dim SubTotalID As String = ""
        Dim i As Integer = 0

        If dgv.Rows.Count = 0 Then Exit Sub

        With clST
            .HeaderText = "SubTotalID"
            .Name = "SubTotalID"
            .Width = 120
            .ReadOnly = True
            .Visible = False
        End With

        With clSTID
            .HeaderText = "KodeAsal"
            .Name = "KodeAsal"
            .Width = 120
            .ReadOnly = True
            .Visible = False
        End With

        If dgv.Columns.Contains("SubTotalID") = False Then dgv.Columns.Add(clST)
        If dgv.Columns.Contains("KodeAsal") = False Then dgv.Columns.Add(clSTID)
        For k As Integer = 0 To dgv.Rows.Count - 1
            If dgv.Rows(k).Cells("SubTotalID").Value Is Nothing Then
                dgv.Rows(k).Cells("SubTotalID").Value = "0"
                dgv.Rows(k).Cells("KodeAsal").Value = dgv.Rows(k).Cells(GroupOn).Value
            End If
        Next

        SubTotalID = dgv.Rows(0).Cells(GroupOn).Value.ToString
        Do
            If SubTotalID = dgv.Rows(i).Cells("KodeAsal").Value.ToString And dgv.Rows(i).Cells("SubTotalID").Value.ToString = "0" Then
                Total += Convert.ToDouble(dgv.Rows(i).Cells(TotalOn).Value)
            Else
                If dgv.Rows(i).Cells("SubTotalID").Value.ToString = "0" Then
                    dgv.Rows.Insert(i, 1)
                End If
                dgv.Rows(i).Cells(TotalOn).Value = Total
                dgv.Rows(i).Cells("SubTotalID").Value = "1"
                dgv.Rows(i).Cells("KodeAsal").Value = SubTotalID
                dgv.Rows(i).DefaultCellStyle.BackColor = Warna

                If (i) < dgv.Rows.Count - 1 Then
                    i += 1
                    SubTotalID = dgv.Rows(i).Cells(GroupOn).Value.ToString
                    Total = (Convert.ToDouble(dgv.Rows(i).Cells(TotalOn).Value))
                End If
            End If

            If dgv.Rows.Count - 1 = (i) Then
                If dgv.Rows(i).Cells("SubTotalID").Value.ToString = "0" Then
                    dgv.Rows.Insert(i + 1, 1)
                    dgv.Rows(i + 1).Cells(TotalOn).Value = Total
                    dgv.Rows(i + 1).Cells("SubTotalID").Value = "1"
                    dgv.Rows(i + 1).Cells("KodeAsal").Value = SubTotalID
                    dgv.Rows(i + 1).DefaultCellStyle.BackColor = Warna
                Else
                    dgv.Rows(i).Cells(TotalOn).Value = Total
                    dgv.Rows(i).Cells("SubTotalID").Value = "1"
                    dgv.Rows(i).Cells("KodeAsal").Value = SubTotalID
                    dgv.Rows(i).DefaultCellStyle.BackColor = Warna
                End If
                Exit Do
            End If
            i += 1
        Loop Until (i) > dgv.Rows.Count - 1
    End Sub




ini Procedure Grand Total

    Public Sub GrandTotalDGV(dgv As DataGridView, TotalOn As Integer, Warna As Color)
        Dim Total As Double = 0

        If dgv.Columns.Contains("SubTotalID") = False Then
            dgv.Columns.Add("SubTotalID", "SubTotalID")
            dgv.Columns("SubTotalID").Visible = False
            For k As Integer = 0 To dgv.Rows.Count - 1
                If dgv.Rows(k).Cells("SubTotalID").Value Is Nothing Then
                    dgv.Rows(k).Cells("SubTotalID").Value = "0"
                End If
            Next
        End If

        For i As Integer = 0 To dgv.Rows.Count - 1
            If dgv.Rows(i).Cells("SubTotalID").Value.ToString = "0" Then
                Total += Convert.ToDouble(dgv.Rows(i).Cells(TotalOn).Value)
            End If
        Next

        Dim x As Integer = dgv.Rows.Count - 1
        If dgv.Rows(dgv.Rows.Count - 1).Cells("SubTotalID").Value.ToString = "2" Then
            dgv.Rows(x).Cells(TotalOn).Value = Total
            dgv.Rows(x).DefaultCellStyle.BackColor = Warna
        Else
            dgv.Rows.Insert(x + 1, 1)
            dgv.Rows(x + 1).Cells(TotalOn).Value = Total
            dgv.Rows(x + 1).Cells("SubTotalID").Value = "2"
            dgv.Rows(x + 1).DefaultCellStyle.BackColor = Warna
        End If
    End Sub


Ini Procedure untuk menghapus Sub Total dan Grand Total

    Public Sub ClearSubTotalDGV(dgv As DataGridView)
        For i As Integer = dgv.Rows.Count - 1 To 0 Step -1
            If dgv.Columns.Contains("SubTotalID") = True Then
                If dgv.Rows(i).Cells("SubTotalID").Value.ToString <> "0" Then
                    dgv.Rows.RemoveAt(i)
                End If
            End If
        Next
        If dgv.Columns.Contains("SubTotalID") = True Then dgv.Columns.Remove("SubTotalID")
        If dgv.Columns.Contains("KodeAsal") = True Then dgv.Columns.Remove("KodeAsal")
    End Sub


cara memanggilnya sebagai berikut

        ClearSubTotalDGV(dgv)
        SubTotalDGV(dgv, 1, 2, Color.Aquamarine)
        SubTotalDGV(dgv, 1, 3, Color.Aquamarine)
        GrandTotalDGV(dgv, 2, Color.Yellow)
        GrandTotalDGV(dgv, 3, Color.Yellow)

Silahkan dicoba procedure diatas semoga bisa bermanfaat

Syafruddin

Senin, 15 September 2014

Membuat dan Menambah Data di DataSet di VB.net

Sumber : http://angkringankode.wordpress.com/2011/03/23/membuat-dan-menambah-data-di-dataset/

Dataset adalah objek yang merepresentasikan data dan relasinya di memory. Strukturnya mirip dengan data di database. Dataset berisi koleksi dari datatable dan datarelation. Berikut adalah contoh dataset sederhana. Dataset Administrasi terdiri dari 2 datatable, Propinsi dan Kabupaten. Kedua datatable saling berhubungan melalui datarelation ‘propinsi-kabupaten’.
Biasanya relasi tabel seperti ini dibuat di database. Untuk dataset, bisa dibuat secara langsung menggunakan schema dengan menambahkan file dataset (xsd) di aplikasi. Baca artikel saya yang ini. Berikut ini adalah cara lain untuk membuat dataset, by code, berdasarkan diagram diatas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Function GetDataSet() As dataset
    'buat dataset baru dengan nama 'Administrasi'
    Dim adm As New DataSet("Administrasi")
    'buat datatable di dalam dataset dengan nama 'propinsi'
    Dim propinsi As DataTable = adm.Tables.Add("Propinsi")
    'buat kolom2 dalam tabel propinsi
    propinsi.Columns.Add("id", GetType(Integer))
    propinsi.Columns.Add("Nama", GetType(String))
    'set kolom id sebagai primary key
    propinsi.PrimaryKey = New DataColumn() {propinsi.Columns("id")}
    'buat datatable kedua dalam dataset dengan nama 'kabupaten'
    Dim kabupaten As DataTable = adm.Tables.Add("Kabupaten")
    'buat kolom2 dalam tabel kabupaten
    kabupaten.Columns.Add("idProp", GetType(Integer))
    kabupaten.Columns.Add("idKab", GetType(Integer))
    kabupaten.Columns.Add("Nama", GetType(String))
    'set kolom idprop dan idkab sebagai primary key
    kabupaten.PrimaryKey = New DataColumn() {kabupaten.Columns("idProp"), kabupaten.Columns("idKab")}
    'buat relasi antara tabel propinsi dan kabupaten
    Dim Relasi As New DataRelation("propinsi_kabupaten", propinsi.Columns("id"), kabupaten.Columns("idProp"))
    adm.Relations.Add(Relasi)
    Return adm
End Function
Untuk menambahkan data kedalam datatable, tabel propinsi perlu diisi terlebih dahulu karena adanya relasi antara tabel propinsi dan kabupaten.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Dim ds As DataSet = GetDataSet()
Dim dtpropinsi As DataTable = ds.Tables("Propinsi")
Dim dtkabupaten As DataTable = ds.Tables("Kabupaten")
'menambah data ke table propinsi
Dim rowPropinsi As DataRow = dtpropinsi.NewRow()
rowPropinsi("id") = 31
rowPropinsi("Nama") = "DKI Jakarta"
dtpropinsi.Rows.Add(rowPropinsi)
'menambah data ke tabel kabupaten
Dim rowkabupaten As DataRow = dtkabupaten.NewRow()
rowkabupaten("idProp") = 31
rowkabupaten("idKab") = 71
rowkabupaten("Nama") = "Jakarta Selatan"
dtkabupaten.Rows.Add(rowkabupaten)
rowkabupaten = dtkabupaten.NewRow()
rowkabupaten("idProp") = 31
rowkabupaten("idKab") = 72
rowkabupaten("Nama") = "Jakarta Timur"
dtkabupaten.Rows.Add(rowkabupaten)
rowkabupaten = dtkabupaten.NewRow()
rowkabupaten("idProp") = 31
rowkabupaten("idKab") = 73
rowkabupaten("Nama") = "Jakarta Pusat"
dtkabupaten.Rows.Add(rowkabupaten)
Contoh diatas berjalan dengan baik, datatable dan kolomnya diakses berdasarkan string nama. Namun jika nama tabel atau nama kolom salah tulis, pasti akan muncul error. Ini akan merepotkan kalau dataset yang dibuat cukup besar, karena nama tabel dan nama-nama kolom di datatable harus ditulis secara tepat.
Cara lain yang lebih aman adalah dengan membuat strong typed dataset. Dengan strong type dataset, nama tabel dan kolom akan dedefinisikan sebagai property. Sehingga untuk mengkases datatable propinsi menjadi
Dim dtpropinsi As DataTable = Admin.Propinsi
Untuk membuat strong typed dataset diperlukan XML Schema. Berdasarkan dataset yang kita buat sebelumnya, kita cukup menjalankan method WriteXmlSchema()
1
2
3
Dim ds As DataSet = GetDataSet()
Dim fileschema As String = Server.MapPath("App_Code\Administrasi.xsd")
ds.WriteXmlSchema(fileschema)
Berikut contoh kode untuk menambahkan data ke dataset berdasarkan schema yang terbentuk.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim admin As New Administrasi
'menambah data ke table propinsi
Dim rowPropinsi As Administrasi.PropinsiRow = admin.Propinsi.AddPropinsiRow(31, "DKI Jakarta")
'menambah data ke tabel kabupaten
Dim rowkabupaten As Administrasi.KabupatenRow = admin.Kabupaten.NewRow()
rowkabupaten.PropinsiRow = rowPropinsi
rowkabupaten.idKab = 71
rowkabupaten.Nama = "Jakarta Selatan"
admin.Kabupaten.AddKabupatenRow(rowkabupaten)
rowkabupaten = admin.Kabupaten.NewRow()
rowkabupaten.PropinsiRow = rowPropinsi
rowkabupaten.idKab = 72
rowkabupaten.Nama = "Jakarta Timur"
admin.Kabupaten.AddKabupatenRow(rowkabupaten)
rowkabupaten = admin.Kabupaten.NewRow()
rowkabupaten.PropinsiRow = rowPropinsi
rowkabupaten.idKab = 73
rowkabupaten.Nama = "Jakarta Pusat"
admin.Kabupaten.AddKabupatenRow(rowkabupaten)
Bandingkan antara cara kedua ini dengan cara pertama. Cara kedua lebih aman, karena untuk mengakses datatabel dan kolom tidak lagi mengacu pada string ‘nama’.
Masih banyak hal tentang dataset yang tidak ditulis disini. Semoga bisa dituliskan lain kali.
Semoga bermanfaat. Happy coding
Baca Juga dari Sumber diatas :
http://angkringankode.wordpress.com/2010/01/19/membuat-file-excel-dari-datatable/
http://angkringankode.wordpress.com/2009/10/14/transfer-data-dari-excell-ke-database/