Aplikasi Penjualan dengan VB.net dan MariaDB V1 : Membuat Form Transaksi Penjualan Part 2



Assalamu’alaikum Wr Wb

Selamat datang di web sibukngoding.com. Masih di seri pembuatan Aplikasi Penjualandengan menggunakan Vb.net dan database Maria DB. Setelah kemarin saya jelaskan tentang pembuatan form Transaksi penjualan, pada kesempatan kali ini saya akan jelaskan source code yang digunakan dalam form transaksi penjualan.
Untuk langkah langkahnya sebagai berikut:
1. Import Data ODBC
Tekan F7 untuk masuk ke layar coding, kita import dulu ODBC nya karena untuk koneksi kita menggunakan Connector ODBC. Tuliskan Source Code dibawah ini di bagian paling atas.
Imports System.Data.Odbc

2. Sub Bersihkan barang
Berfungsi untuk membersihkan texbox yang terisi dibagian inputan barang di transaksi.
    Sub bersihkanbarang()
        TxtKodeBarang.Clear()
        TxtNamaBarang.Clear()
        TxtHarga.Text = "0"
        TxtJumlah.Text = "0"
        TxtSubTotal.Text = "0"
        TxtKodeBarang.Focus()
    End Sub


3. Sub No Otomatis
Untuk membuat no otomatis di nomor transaksi penjualan.

    Sub Nootomatis()
        Koneksi()
        Dim Urutan As String
        Dim Hitung, Cari As Long
        CMD = New OdbcCommand("Select * from penjualan where no_penjualan in (select max(no_penjualan) from penjualan)", Conn)
        RD = CMD.ExecuteReader
        RD.Read()
        If Not RD.HasRows Then
            Urutan = "PJ" & Date.Now.Year & "0001"
        Else
            Cari = Microsoft.VisualBasic.Right(RD.GetString(0), 4)
            If Microsoft.VisualBasic.Left(RD.GetString(0), 6) <> "PJ" & Date.Now.Year Then
                Urutan = "PJ" & Date.Now.Year & "0001"
            Else
                Hitung = Microsoft.VisualBasic.Right(RD.GetString(0), 4) + 1
                Urutan = "PJ" & Date.Now.Year & Microsoft.VisualBasic.Right("0000" & Hitung, 4)
            End If
        End If
        RD.Close()
        TxtNoPenjualan.Text = Urutan
        Conn.Close()
    End Sub

4.  Sub AutoNumberRowsForGrid
Untuk membuat nomor di datagridview
Sub AutoNumberRowsForGrid()
        If DGV IsNot Nothing Then
            Dim count As Integer = 0
            While (count <= (DGV.Rows.Count - 1))
                DGV.Rows(count).HeaderCell.Value = String.Format((count + 1).ToString(), "0")
                count += 1
            End While
        End If
    End Sub

5. Sub buat kolom
Untuk membuat kolom pada datagridviews
Sub BuatKolom()
        With DGV
            .Columns.Add("Kode_Barang", "Kode_Barang")
            .Columns.Add("Nama_Barang", "Nama_Barang")
            .Columns.Add("Harga", "Harga")
            .Columns.Add("Jumlah", "Jumlah")
            .Columns.Add("SubTotal", "SubTotal")
            '----------------------
            .Columns("Kode_Barang").Width = 80
            .Columns("Nama_Barang").Width = 150
            .Columns("Harga").Width = 90
            .Columns("Jumlah").Width = 70
            .Columns("SubTotal").Width = 90
        End With
    End Sub

6.  Sub Autocomplete Barang
Untuk membuat sugesti pada txtkodebarang
    Sub Autocompletebarang()
        Koneksi()
        CMD = New OdbcCommand("SELECT kode_barang FROM barang", Conn)
        RD = CMD.ExecuteReader
        While RD.Read
            With TxtKodeBarang
                .AutoCompleteCustomSource.Add(RD(0).ToString)
                .AutoCompleteMode = AutoCompleteMode.Suggest
                .AutoCompleteSource = AutoCompleteSource.CustomSource
            End With
        End While
        Conn.Close()
    End Sub

7.  Sub Autocomplete Pelanggan
Untuk membuat sugesti pada txtkodepelanggan
    Sub Autocompletepelanggan()
        Koneksi()
        CMD = New OdbcCommand("SELECT kode_pelanggan FROM pelanggan", Conn)
        RD = CMD.ExecuteReader
        While RD.Read
            With TxtKodePelanggan
                .AutoCompleteCustomSource.Add(RD(0).ToString)
                .AutoCompleteMode = AutoCompleteMode.Suggest
                .AutoCompleteSource = AutoCompleteSource.CustomSource
            End With
        End While
        Conn.Close()
    End Sub

8. Sub Awal
Untuk mengatur  tampilan awal pada saat aplikasi pertama kali dijalankan.
    Sub awal()
        Nootomatis()
        TxtTanggal.Text = Format(Now, "dd MMMM yyyy")
        TxtNoPenjualan.Enabled = False
        TxtTanggal.Enabled = False
        rbnonpelanggan.Checked = True
        TxtKodePelanggan.Enabled = False
        TxtNamaPelanggan.Enabled = False
        TxtKodePelanggan.Text = "000"
        TxtNamaPelanggan.Text = "-"
        TxtNamaBarang.Enabled = False
        TxtHarga.Enabled = False
        TxtSubTotal.Enabled = False
        txttotalbarang.Text = "0"
        txttotalharga.Text = "0"
        txttotalbayar.Text = "0"
        txtdiskon.Text = "0"
        txttotalbayar.Text = "0"
        txtdibayar.Text = "0"
        txtkembali.Text = "0"
        txttotalbarang.Enabled = False
        txttotalharga.Enabled = False
        txttotalbayar.Enabled = False
        txtkembali.Enabled = False
        DGV.Rows.Clear()
        bersihkanbarang()
    End Sub

9.  Event Form load
Klik 2x pada form lalu ketikkan source code berikut
    Private Sub FormPenjualan_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        BuatKolom()
        Autocompletebarang()
        Autocompletepelanggan()
        awal()
    End Sub

10. Event Keydown pada txtkodebarang
Bertujuan untuk menampilkan data nama barang, harga ke dalam txtnamabarang dan txtharga setelah kodebarang dipilih. Untuk masuk ke event Keydown Klik pada bagian (General) pilih txtkodebarang, kemudian pada bagian (Declaration) pilih KeyDown. Ketikkan coding berikut.
    Private Sub TxtKodeBarang_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtKodeBarang.KeyDown
        If e.KeyCode = Keys.Enter Then
            Koneksi()
            CMD = New OdbcCommand("SELECT * FROM barang WHERE kode_barang = '" + TxtKodeBarang.Text + "'", Conn)
            RD = CMD.ExecuteReader
            If RD.Read Then
                TxtKodeBarang.Text = RD(0).ToString
                TxtNamaBarang.Text = RD(1).ToString
                TxtHarga.Text = RD(4).ToString
                Conn.Close()
                TxtJumlah.Focus()
            Else
                MsgBox("Kode Barang Yang Anda Inputkan Salah")
                TxtKodeBarang.Focus()
            End If
        End If
    End Sub

11. Event Click pada BtPlus (Tombol  + )
Berfungsi untuk menyimpan data kodebarang(txtkodebarang), nama barang (txtnamabarang), harga (txtharga), jumlah(txtjumlah) dan subtotal(txtsubtotal) ke dalam datagridview. Klik 2 kali pada btplus lalu masukkan source code berikut:
    Private Sub btplus_Click(sender As Object, e As EventArgs) Handles btplus.Click
        If Len(Trim(TxtKodeBarang.Text)) = 0 Then
            MsgBox("Kode Barang Belum Diisi", MsgBoxStyle.Information)
            TxtKodeBarang.Focus()
        ElseIf Len(Trim(TxtNamaBarang.Text)) = 0 Then
            MsgBox("Data Belum Lengkap", MsgBoxStyle.Information)
            TxtKodeBarang.Focus()
        ElseIf Len(Trim(TxtHarga.Text)) = 0 Then
            MsgBox("Data Belum Lengkap", MsgBoxStyle.Information)
            TxtKodeBarang.Focus()
        ElseIf (Len(Trim(TxtJumlah.Text)) = 0) Or (TxtJumlah.Text = "0") Then
            MsgBox("Jumlah Belum dimasukkan", MsgBoxStyle.Information)
            TxtJumlah.Focus()
        ElseIf Len(Trim(TxtSubTotal.Text)) = 0 Then
            MsgBox("Data Belum Lengkap", MsgBoxStyle.Information)
            TxtJumlah.Focus()
        Else
            Try
                Dim rownumber As Integer = DGV.Rows.Add()
                DGV.Rows.Item(rownumber).Cells(0).Value = TxtKodeBarang.Text
                DGV.Rows.Item(rownumber).Cells(1).Value = TxtNamaBarang.Text
                DGV.Rows.Item(rownumber).Cells(2).Value = TxtHarga.Text
                DGV.Rows.Item(rownumber).Cells(3).Value = TxtJumlah.Text
                DGV.Rows.Item(rownumber).Cells(4).Value = TxtSubTotal.Text
                'Hitung Total Harga di datagrid
                Dim totalharga, totalbarang As Integer
                totalharga = 0
                totalbarang = 0
                For t As Integer = 0 To DGV.Rows.Count - 1
                    totalharga = totalharga + Val(DGV.Rows(t).Cells(4).Value)
                    totalbarang = totalbarang + Val(DGV.Rows(t).Cells(3).Value)
                Next
                txttotalharga.Text = totalharga
                txttotalbarang.Text = totalbarang
                txttotalbayar.Text = totalharga
                AutoNumberRowsForGrid()
                bersihkanbarang()
            Catch ex As Exception
                MsgBox("Gagal !!!!", MsgBoxStyle.Information)
            End Try
        End If
    End Sub

12. Event  Click pada btmin( Tombol -)
Berfungsi untuk menghapus data yang ada di dalam datagridviews ketika terjadi salah input. Klik 2 kali pada btmin lalu masukkan skrip berikut.
    Private Sub btmin_Click(sender As Object, e As EventArgs) Handles btmin.Click
        Try
            If DGV.CurrentRow.Index <> DGV.NewRowIndex Then
                DGV.Rows.RemoveAt(DGV.CurrentRow.Index)
                'Hitung Total Harga di datagrid
                Dim totalharga, totalbarang As Integer
                totalharga = 0
                totalbarang = 0
                For t As Integer = 0 To DGV.Rows.Count - 1
                    totalharga = totalharga + Val(DGV.Rows(t).Cells(4).Value)
                    totalbarang = totalbarang + Val(DGV.Rows(t).Cells(3).Value)
                Next
                txttotalharga.Text = totalharga
                txttotalbarang.Text = totalbarang
                txttotalbayar.Text = totalharga
            End If
        Catch ex As Exception
            MsgBox("Tidak Ada Data yang DiHapus", MsgBoxStyle.Information)
        End Try
    End Sub

13. Event Keydown pada txtkodepelanggan
Terdapat fungsi untuk menampilkan namapelanggan ditxtnamapelanggan berdasarkan kode pelanggan yang dipilih. Untuk masuk ke event Keydown Klik pada bagian (General) pilih txtkodepelanggan, kemudian pada bagian (Declaration) pilih KeyDown. Ketikkan coding berikut.
    Private Sub TxtKodePelanggan_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtKodePelanggan.KeyDown
        If e.KeyCode = Keys.Enter Then
            Koneksi()
            CMD = New OdbcCommand("SELECT * FROM pelanggan WHERE kode_pelanggan = '" + TxtKodePelanggan.Text + "'", Conn)
            RD = CMD.ExecuteReader
            If RD.Read Then
                TxtKodePelanggan.Text = RD(0).ToString
                TxtNamaPelanggan.Text = RD(1).ToString
            End If
            Conn.Close()
            TxtKodeBarang.Focus()
        End If
    End Sub

14. Event Keydown pada Txtjumlah
Terdapat fungsi yang digunakan untuk mencari subtotal. Untuk masuk ke event Keydown Klik pada bagian (General) pilih txtjumlah, kemudian pada bagian (Declaration) pilih KeyDown. Ketikkan coding berikut.
    Private Sub TxtJumlah_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtJumlah.KeyDown
        If e.KeyCode = Keys.Enter Then
            'Rumus Mencari Sub Total
            TxtSubTotal.Text = Val(TxtHarga.Text) * Val(TxtJumlah.Text)
            btplus.Focus()
        End If
    End Sub

15 Event Keypress pada txtjumlah
Terdapat fungsi yang digunakan agar txtjumlah hanya bisa diinput angka. Untuk masuk ke event Keypress Klik pada bagian (General) pilih txtjumlah, kemudian pada bagian (Declaration) pilih Keypress. Ketikkan coding berikut.
    Private Sub TxtJumlah_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtJumlah.KeyPress
        'Agar hanya angka yang bisa diinputkan
        If Not IsNumeric(e.KeyChar) And e.KeyChar <> Chr(13) And e.KeyChar <> vbBack Then e.Handled = True
    End Sub

16. Event Keydown pada txtdiskon
Terdapat fungsi yang digunakan untuk menhitung total harga setelah didiskon. Disini diskon yang digunakan berupa persentase. Untuk masuk ke event Keydown Klik pada bagian (General) pilih txtdiskon, kemudian pada bagian (Declaration) pilih KeyDown. Ketikkan coding berikut.
    Private Sub txtdiskon_KeyDown(sender As Object, e As KeyEventArgs) Handles txtdiskon.KeyDown
        If e.KeyCode = Keys.Enter Then
            'Rumus mencari total bayar setelah didiskon
            txttotalbayar.Text = Val(txttotalharga.Text) - ((Val(txtdiskon.Text) / 100) * Val(txttotalharga.Text))
            txtdibayar.Focus()
        End If
    End Sub

17. Event Keypress pada txtdiskon
Terdapat fungsi yang digunakan agar txtjumlah hanya bisa diinput angka. Untuk masuk ke event Keypress Klik pada bagian (General) pilih txtdiskon, kemudian pada bagian (Declaration) pilih Keypress. Ketikkan coding berikut.
    Private Sub txtdiskon_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtdiskon.KeyPress
        'Agar hanya angka yang bisa diinputkan
        If Not IsNumeric(e.KeyChar) And e.KeyChar <> Chr(13) And e.KeyChar <> vbBack Then e.Handled = True
    End Sub

18. Event Keydown pada txtdibayar
Terdapat fungsi yang digunakan untuk menhitung uang kembalian. Untuk masuk ke event Keydown Klik pada bagian (General) pilih txtdibayar, kemudian pada bagian (Declaration) pilih KeyDown. Ketikkan coding berikut.
    Private Sub txtdibayar_KeyDown(sender As Object, e As KeyEventArgs) Handles txtdibayar.KeyDown
        If e.KeyCode = Keys.Enter Then
            If (Len(Trim(txtdibayar.Text)) = 0) Or (txtdibayar.Text = "0") Then
                MsgBox("Data Belum Diisi...", MsgBoxStyle.Information)
                txtdibayar.Focus()
            ElseIf Val(txttotalbayar.Text) > Val(txtdibayar.Text) Then
                MsgBox("Uang yang dimasukkan kurang.....", MsgBoxStyle.Information)
                txtdibayar.Focus()
            Else
                'Rumus mencari uang kembali
                txtkembali.Text = Val(txtdibayar.Text) - Val(txttotalbayar.Text)
                btsimpan.Focus()
            End If
        End If
    End Sub

19. Event Keypress pada txtdibayar
Terdapat fungsi yang digunakan agar txtdibayar hanya bisa diinput angka. Untuk masuk ke event Keypress, Klik pada bagian (General) pilih txtdibayar, kemudian pada bagian (Declaration) pilih Keypress. Ketikkan coding berikut.
    Private Sub txtdibayar_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtdibayar.KeyPress
        'Agar hanya angka yang bisa diinputkan
        If Not IsNumeric(e.KeyChar) And e.KeyChar <> Chr(13) And e.KeyChar <> vbBack Then e.Handled = True
    End Sub


20. Radio Button pada rbpelanggan
Berfungsi jika rbpelanggan di pilih maka txtkodepelanggan  akan aktif dan kita bisa memilih pelanggan di daftar pelanggan. Klik 2 kali pada rbpelanggan lalu masukkan source code berikut:
    Private Sub rbpelanggan_CheckedChanged(sender As Object, e As EventArgs) Handles rbpelanggan.CheckedChanged
        TxtKodePelanggan.Enabled = True
        TxtKodePelanggan.Clear()
        TxtNamaPelanggan.Clear()
        TxtKodePelanggan.Focus()
    End Sub

21. Radio Button pada rbnonpelanggan
Berfungsi jika rbnonpelanggan di pilih maka txtkodepelanggan  tidak akan  aktif dan secara default kode pelanggan tertulis ‘000’ yang menandakan bahwa kode tersebut khusus  bukan pelanggan. Klik 2 kali pada rbnonpelanggan lalu masukkan source code berikut:
    Private Sub rbnonpelanggan_CheckedChanged(sender As Object, e As EventArgs) Handles rbnonpelanggan.CheckedChanged
        TxtKodePelanggan.Enabled = False
        TxtKodePelanggan.Text = "000"
        TxtNamaPelanggan.Text = "-"
        TxtKodeBarang.Focus()
    End Sub


22. Event Click Pada Btsimpan (Tombol Simpan)
Berfungsi untuk menyimpan  data ke dalam database. Klik 2 kali pada btsimpan lalu ketikkan source code berikut:
    Private Sub btsimpan_Click(sender As Object, e As EventArgs) Handles btsimpan.Click
        Try
            'validasi jika data masih kosong
           If Len(Trim(TxtKodePelanggan.Text)) = 0 Then
                MsgBox("Data Pelanggan Belum diinputkan...", MsgBoxStyle.Information)
                TxtKodePelanggan.Focus()
            ElseIf (Len(Trim(txtdibayar.Text)) = 0) Or (txtdibayar.Text = "0") Then
                MsgBox("Transaksi belum dibayar...", MsgBoxStyle.Information)
                txtdibayar.Focus()
            Else
                'simpan data non pelanggan
                Koneksi()
                CMD = New OdbcCommand("SELECT kode_pelanggan FROM pelanggan WHERE kode_pelanggan = '" + TxtKodePelanggan.Text + "'", Conn)
                RD = CMD.ExecuteReader
                RD.Read()
                If Not RD.HasRows Then
                    Koneksi()
                    CMD = New OdbcCommand("INSERT INTO pelanggan VALUES (?,?,?,?)", Conn)
                    With CMD
                        .Parameters.AddWithValue("?", TxtKodePelanggan.Text)
                        .Parameters.AddWithValue("?", TxtNamaPelanggan.Text)
                        .Parameters.AddWithValue("?", "-")
                        .Parameters.AddWithValue("?", "-")
                        .ExecuteNonQuery()
                    End With
                    Conn.Close()
                End If
                'simpan Data ke tabel penjualan
                Koneksi()
                CMD = New OdbcCommand("INSERT INTO penjualan VALUES (?,?,?,?,?)", Conn)
                With CMD
                    .Parameters.AddWithValue("?", TxtNoPenjualan.Text)
                    .Parameters.AddWithValue("?", Format(Now.Date, "yyyy-MM-dd"))
                    .Parameters.AddWithValue("?", TxtKodePelanggan.Text)
                    .Parameters.AddWithValue("?", txttotalbarang.Text)
                    .Parameters.AddWithValue("?", txttotalharga.Text)
                    .ExecuteNonQuery()
                End With
                Conn.Close()
                'Simpan Data ke tabel detail penjualan
                Koneksi()
                For i As Integer = 0 To DGV.Rows.Count - 1
                    CMD = New OdbcCommand("INSERT INTO detail_penjualan VALUES (?,?,?,?,?)", Conn)
                    With CMD
                        .Parameters.AddWithValue("?", TxtNoPenjualan.Text)
                        .Parameters.AddWithValue("?", DGV.Rows(i).Cells(0).Value)
                        .Parameters.AddWithValue("?", DGV.Rows(i).Cells(3).Value)
                        .Parameters.AddWithValue("?", DGV.Rows(i).Cells(2).Value)
                        .Parameters.AddWithValue("?", DGV.Rows(i).Cells(4).Value)
                        .ExecuteNonQuery()
                    End With
                Next
                awal()
                MsgBox("Data Berhasil disimpan.....", MsgBoxStyle.Information, "Informasi")
                End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

22. Event Click pada BtKeluar (Tombol Keluar)
Klik 2 kali pada btkeluar lalu masukkan source code berikut
    Private Sub btkeluar_Click(sender As Object, e As EventArgs) Handles btkeluar.Click
        Me.Close()
    End Sub

Demikian contoh pembuatan Transaksi penjualan yang bisa saya sampaikan. Silahkan dimodifikasi sesuai selera anda dan jika ada pertanyaan bisa ditanyakan dikomentar. Untuk cara menjalankan program transaksi penjualan bisa dilihat di Part 3

Terimakasih atas kunjungannya, Selamat belajar dan jangan mudah menyerah.

Wassalamu'alaikum Wr Wb

Comments