Pada Episode sebelumnya (Epesiode 4) telah dibahas cara mengkoneksikan Visual Basic ke Database (MS Acces) dan bagaimana cara memanajemen record database menggunakan ADO (ActiveX Data Objects).
Program Stok kali ini lebih nyata dalam pemrograman dan tetap menjadi media belajar yang santai karena terdapat banyak peluang untuk memperbaiki sesuai dengan logika pembaca. Misalkan pada Pembelian (HBeli) digunakan field KODESUP untuk Suplier sedangkan pada tabel Penjualan (Hjual) digunakan field nama CUSTOMER padahal tabel CUSTOMER (TCUSTOMER) terdapat field KodeCust, tentunya diharapkan para pembaca yang memodifikasi program dan Database agar yang tersimpan adalah kode Customer sebagai mana layaknya basidata yang baik. Secara Umum untuk memperoleh STOK adalah dengan menghitung semua Pembelian dan dikurangkan dengan semua Penjualan seperti ditulis dalam rumus dibawah ini:
Stok = Pembelian – Penjualan
Pada praktiknya agar stok bersifat Real Time maka setiap terjadi transaksi Pembelian maka field JUMLAH pada Tabel Barang akan di tambahkan dengan jumlah barang yang dibeli. Begitu juga sebaliknya setiap terjadi transaksi Penjualan maka field JUMLAH akan dikurangkan dengan Jumlah barang yang dijual. Rumus diatas dituangkan dalam rancangan Basisdata Database Stok menggunakan Ms. Access 2003 sbb:
Database Name : STOK.MDB Tabel-Tabel sebagai berikut: 1. TBarang (Tabel Master dan Stok Barang) 2. HBeli (Tabel Header Pembelian) 3. DBeli (Tabel Detail Pembelian) 4. HJual (Tabel Header Penjualan) 5. Djual (Tabel Detail Penjualan) 6. TSupplier (Tabel Master Supplier) 7. TCustomer (Tabel Master Customer) 8. Tbantu (Tabel Bantu Form Transaksi Pembelian dan Penjualan)
Selain menggunakan tabel-tabel diatas maka pada database digunakan juga bebera query untuk memudahkan manipulasi data yakni sbb:
1. QBeli (Query transaksi Pembelian) 2. QJBeli (Query untuk menghitung Jumlah Pembelian) 3. QJual (Query transaksi Penjualan) 4. QJJual (Query untuk menghitung Jumlah Penjualan) 5. QJMLBRG (Query untuk menghitung Stok Barang)
Pada Bagian ini akan dibahas mengenai struktur tabel dan query database Stok.MDB: 1. TBarang, Struktur tabel ini sbb:
| Field Name | Data Type | Field Properties |
| KODEBRG | Text | Field Size 18 |
| NAMA BRG | Text | Field Size 100 |
| SATUAN | Text | Fiel Size 15 |
| JUMLAH | Number | Integer |
| HARGABELI | Number | Single |
| HARGAJUAL | Number | Single |
Buatkan index dengan nama XKODEBRG dari field KODEBRG yang bersifat Primarykey
2. Hbeli, Untuk menampung data transaksi Pembelian maka dibuatkan 2 Tabel (HBeli dan DBeli), ke 2 tabel dihubungkan dengan sebuah field kunci yakni NOFAKTUR.
Mungkin dari pembaca ada yang bertanya mengapa harus 2 tabel..?,
Jawabannya adalah:
Agar diperoleh Basis Data yang baik maka hindarkan hal-hal yang akan menyebabkan kesalahan dan kesulitan dalam mengakses dan memanipulasi database seperti annomaly, redudance (Field berulang), dsb.
Untuk keperluan tersebut maka Data-data yang bersifat tunggal (One) seperti Tanggal Transaksi, Kode Suplier, Keterangan dsb dicatat dalam tabel HBeli, sementara data-data yang berulang-ulang (Many) dalam hal ini record barang yang dibeli (KODEBRG, JML, HARGA BELI) dicatat dalam tabel DBeli.
Jadi sekali transaksi dapat membeli lebih dari 1 barang, Relasi HBeli dan DBeli disebut “One to Many”
Struktur tabel Hbeli ini sbb:
| Field Name | Data Type | Field Properties |
| NOFAKTUR | Text | Field Size 10, (Nomor Faktur Pembelian) |
| TGL | Date/Time | Field Size 8 otomatis (Tanggal Transaksi Pembelian) |
| KODESUP | Text | Field Size 5, (Kode Supplier) |
| KETERANGAN | Text | Field Size 100 (Mencatat Keterangan Transaksi) |
Buatkan index dengan nama XNOFAKTUR dari field NOFAKTUR yang bersifat Primarykey
3. DBeli, Untuk menampung data many transaksi Pembelian, Struktur Tabel DBeli ini sbb:
| Field Name | Data Type | Field Properties |
| NOFAKTUR | Text | Field Size 10, (Nomor Faktur Pembelian) |
| KODEBRG | Text | Field Size 18 (Kode Barang) |
| JML | Number | Integer,(Jumlah Barang yang di beli) |
| HARGA | Number | Single (Harga Beli Barang) |
Field Nofaktur dapat di index akan tetapi tidak boleh bersifat Primarykey
4.TSupplier, Untuk menampung data Master Supplier, Struktur Tabel TSupplier sbb:
| Field Name | Data Type | Field Properties |
| KODESUP | Text | Field Size 5, (Kode Supplier) |
| NAMASUP | Text | Field Size 100 (Nama Supplier) |
| ALAMAT | Text | Field Size 255,(Alamat Supplier) |
| TELEPON | Text | Field Size 15(Nomor Telepon Supplier) |
| KONTAK | Text | Field Size 50(Kontak Person Supplier) |
Buatkan index dengan nama XKODESUP dari field KODESUP yang bersifat Primarykey
5. QBELI, Adalah query untuk menampilkan record data pembelian,
Adapun struktur Query ini adalah melibatkan ke 4 tabel yang sudah dibuat diatas,lihat gambar dibawah ini:
Bila kesulitan membaca gambar maka dapat menempuh cara membuat query dengan mengcopy isi
statement SQLnya melalui menu SQL View. Adapun SLQ Stringnya seperti dibawah ini:
SELECT HBELI.NOFAKTUR, HBELI.TGL, HBELI.KODESUP, TSUPPLIER.NamaSup, HBELI.KETERANGAN, DBELI.KODEBRG, TBARANG.NAMABRG,TBARANG.SATUAN, DBELI.JML, DBELI.HARGA, [DBELI]![JML]*[DBELI]![HARGA] AS SUBJUMLAH FROM (DBELI INNER JOIN (TSUPPLIER INNER JOIN HBELI ON TSUPPLIER.KodeSup = HBELI.KODESUP) ON DBELI.NOFAKTUR = HBELI.NOFAKTUR) INNER JOIN TBARANG ON DBELI.KODEBRG = TBARANG.KODEBRG;
Catatan:
Baris perintah diatas tidak dipisahkan dengan enter, hilangkan dahulu efek enter tersebut dengan menekan tombol del di setiap diujung baris perintah.
6. QJBELI, Adalah query untuk menghitung jumlah pembelian masing2 barang,
Adapun struktur Query berasal dari query QBELI, lihat gambar dibawah ini:
Keterangan:
Bila kesulitan membaca gambar maka dapat menempuh cara membuat query dengan mengcopy isi statement SQLnya melalui menu SQL View. Adapun SLQ Stringnya seperti dibawah ini:
SELECT QBELI.KODEBRG, QBELI.NAMABRG, Sum(QBELI.JML) AS JMLBELI, Sum(QBELI.HARGA) AS HARGABELI, Sum(QBELI.SUBJUMLAH) AS SUBJUMLAHBELI FROM QBELI GROUP BY QBELI.KODEBRG, QBELI.NAMABRG;
Catatan:
Baris perintah diatas tidak dipisahkan dengan enter, hilangkan dahulu efek enter tersebut dengan menekan tombol del diujung baris perintah sehingga baris ke dua naik menyambung dengan baris pertama.
PROGRAM STOK
Perancangan program dimulai dengan membuat Project baru dan beri nama STOK, selanjutnya tambahkan modul dengan nama Modul1 (secara default VB akan memberikan nama ini).
Isi modul1.bas seperti dibawah ini Public VFrmbeli As Boolean
'------ BOF Modul1.bas ---------------------------------------
Public VFrmJual As Boolean
Public CN As ADODB.Connection
Public rSB As ADODB.Recordset 'Recordset Barang
Public rSDBeli As ADODB.Recordset 'Recordset Dbeli
Public rsHBeli As ADODB.Recordset 'Recordset Hbeli
Public rSDJual As ADODB.Recordset 'Recordset Djual
Public rsHJual As ADODB.Recordset 'Recordset Hjual
Public rSBantu As ADODB.Recordset 'Recordset Tbantu
'Sub program ini untuk merubah penekanan tombol enter bernilai TAB
Sub TekanEnter(Ntekan)
If Ntekan = 13 Then
SendKeys "{TAB}"
Ntekan = 0
End If End Sub' Awal startup program...
Sub Main()
Set CN = New ADODB.Connection
CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=STOK.mdb;
Persist Security Info=False
MDIForm1.Show
End Sub
'-------------- EOF Modul1.BAS ----------------FRMBELI (Form Pembelian) Form ini digunakan untuk melakukan transaksi pembelian, Desain dan Layout form seperti gambar dibawah:
Penjelasan:
'General Declarations
Public Mtotal As Single
Public RBaru As Boolean
Public SubHLama As Single
'Hapus Tbantu
Sub HapusTbantu()
If Adodc1.Recordset.State = 1 Then
Adodc1.Recordset.Close
End If
CN.Execute "delete * from Tbantu"
Adodc1.Recordset.Open "SELECT * FROM TBANTU", CN
Adodc1.Refresh
Me.DataGrid1.ReBind
Me.DataGrid1.Refresh
End Sub
' sub rutin ini memeriksa apakah user melakukan edit data pada datagrid
' ini penting untuk deteksi total harga
Private Sub Adodc1_WillChangeRecord(ByVal adReason As
ADODB.EventReasonEnum, ByVal cRecords As Long,
adStatus As ADODB.EventStatusEnum, ByVal pRecordset
As ADODB.Recordset)
' Paramater diatas tidak dipisahkan dengan enter
If adReason = adRsnAddNew Then
RBaru = True
Else
RBaru = False
End If
End Sub
' fungsi = diatas
Private Sub Adodc1_WillChangeRecordset(ByVal adReason As
ADODB.EventReasonEnum, adStatus As ADODB.EventStatusEnum,
ByVal pRecordset As ADODB.Recordset)
'Variabel diatas tidak dipisahkan dengan enter
If adReason = adRsnAddNew Then
RBaru = True
Else
RBaru = False
End If
End SubPrivate Sub cadd_Click() Me.Text1.Text = "" Me.Text2.Text = "" Me.Text3.Text = "" Me.Text4.Text = "" Me.Text5.Text = "" cESave.Caption = "&Save" Call HapusTbantu ' agar grid tidak empty (kosong) tambahkan 1 record data hidari ' error number 6016 Adodc1.Recordset.AddNew Adodc1.Recordset!KOdeBrg = "" Adodc1.Recordset.Update Me.Refresh Text1.SetFocus Mtotal = 0 End Sub
Private Sub cESave_Click()
If cESave.Caption = "&Save" Then
cESave.Caption = "&Edit"
Set rsHBeli = New ADODB.Recordset
rsHBeli.Open "select * from HBeli", CN, adOpenKeyset,
adLockOptimistic,adCmdText
rsHBeli.AddNew
rsHBeli!NoFaktur = Trim(Text1.Text)
rsHBeli!tgl = DtBeli.Value
rsHBeli!KodeSup = Trim(Text2.Text)
rsHBeli!keterangan = Trim(Text3.Text)
Set rSDBeli = New ADODB.Recordset
rSDBeli.Open "select * from DBeli ", CN,
adOpenKeyset, adLockOptimistic,adCmdText
With Adodc1.Recordset
.MoveFirst
Do Until .EOF
If Len(Trim(!KOdeBrg)) > 0 Then
rSDBeli.AddNew
rSDBeli!NoFaktur = Trim(Text1.Text)
rSDBeli!KOdeBrg = !KOdeBrg
rSDBeli!Jml = !Jml
rSDBeli!Harga = !HrgJual
Set rSB = New ADODB.Recordset
rSB.Open "select * from Tbarang where KODEBRG='" &
!KOdeBrg & "'", CN, adOpenKeyset, adLockOptimistic,
adCmdText
'Variabel diatas tidak dipisahkan dengan enter
If rSB.EOF And rSB.BOF Then
Else
' ini perintah mengedit JUMLAH barang pada tabel Tbarang
rSB!JUMLAH = rSB!JUMLAH + !Jml
rSB.Update
End If
rSDBeli.Update
End If
.MoveNext
Loop
'Yakin jika ada Detail baru Hbeli di update
rsHBeli.Update
End With
MsgBox "Data Pembelian sudah tersimpan"
End If
End SubPrivate Sub cexit_Click() Unload Me End Sub
Private Sub DataGrid1_AfterColEdit(ByVal ColIndex As Integer)
Dim Kobrg As String
If ColIndex = 0 Then
Kobrg = Trim(DataGrid1.Columns(0).Text)
Set rSB = New ADODB.Recordset
rSB.Open "select * from Tbarang where KodeBrg ='" & Kobrg & "'",
CN, adOpenKeyset, adLockOptimistic, adCmdText
'Parameter diatas tidak dipisahkan dengan enter
If rSB.EOF And rSB.BOF Then
MsgBox "Kode Barang ini tidak ada"
Else
With DataGrid1
.Columns(1).Text = rSB!NamaBrg
.Columns(2).Text = rSB!Satuan
.Columns(3).Text = rSB!HargaBeli
End With
'Tekan tombol Right 4 kali
SendKeys "{RIGHT 4}"
End If
End If
If ColIndex = 4 Then
With DataGrid1
.Columns(5).Text = Val(.Columns(3).Text) * Val(.Columns(4).Text)
If RBaru Then
Mtotal = Mtotal + Val(.Columns(5).Text)
Else
'Jika bukan data baru maka Mtotal harus dikurangi dengan
'Subharga yang lama
Mtotal = (Mtotal - SubHLama) + Val(.Columns(5).Text)
End If
SubHLama = 0
Text4.Text = Format(Mtotal, "#,##0")
End With
SendKeys "{DOWN}"
SendKeys "{HOME}"
End If
End SubPrivate Sub DataGrid1_BeforeColEdit(ByVal ColIndex As Integer,
ByVal KeyAscii As Integer, Cancel As Integer)
'Variabel tidak dipisahkan dengan enter
If ColIndex = 4 Then
SubHLama = Val(DataGrid1.Columns(5).Text)
End If End
SubPrivate Sub DtBeli_KeyDown(KeyCode As Integer, Shift As Integer) TekanEnter (KeyCode) End Sub
Private Sub Form_Load() VFrmbeli = True Me.Width = 9420 Me.Height = 5550 Me.Left = (Screen.Width - Me.Width) \ 2 Me.Top = 1000 Adodc1.Recordset.Close CN.Execute "delete * from Tbantu" Adodc1.Recordset.Open "select * from Tbantu" Me.Adodc1.Refresh Me.DataGrid1.Refresh End Sub
Private Sub Form_Unload(Cancel As Integer) VFrmbeli = False End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) TekanEnter (KeyAscii) End Sub
Private Sub Text1_LostFocus()
Dim Tanya As Integer
Mtotal = 0
If Len(Trim(Text1.Text)) > 0 Then
Set rsHBeli = New ADODB.Recordset
rsHBeli.Open "select * from QBELI where NOFAKTUR ='" & Trim
(Text1.Text) & "'", CN, adOpenKeyset, adLockOptimistic, adCmdText
'Variabel diatas tidak dipisahkan dengan enter
If rsHBeli.EOF And rsHBeli.BOF Then
Else
cESave.Caption = "&Edit"
Tanya = MsgBox("Faktur Sudah pernah ada, Mau ditampilkan.? ",
vbQuestion + vbYesNo, "FAKTUR GANDA")
'Variabel diatas tidak dipisahkan dengan enter
If Tanya = vbYes Then
Text2.Text = rsHBeli!KodeSup
DtBeli.Value = rsHBeli!tgl
Text3.Text = rsBeli!keterangan
Text5.Text = rsHBeli!NamaSup
CN.Execute "delete * from Tbantu"
Set rSBantu = New ADODB.Recordset
rSBantu.Open "select * from Tbantu", CN, adOpenKeyset,
adLockOptimistic,adCmdText
'Variabel tidak dipisahkan dengan enter
rsHBeli.MoveFirst
Do Until rsHBeli.EOF
rSBantu.AddNew
rSBantu!KOdeBrg = rsHBeli!KOdeBrg
rSBantu!NamaBrg = rsHBeli!NamaBrg
rSBantu!Satuan = rsHBeli!Satuan
rSBantu!HrgJual = rsHBeli!Harga
rSBantu!Jml = rsHBeli!Jml
rSBantu!Subjumlah = rsHBeli!Subjumlah
Mtotal = Mtotal + rsHBeli!Subjumlah
rSBantu.Update
rsHBeli.MoveNext
Loop
Set rsHBeli = Nothing
Set rSBantu = Nothing
Adodc1.Recordset.Close
Adodc1.Recordset.Open "sELECT * FROM TBANTU", CN
Adodc1.Recordset.Requery -1
Adodc1.Refresh
DataGrid1.ReBind
DataGrid1.Refresh
Text4.Text = Format(Mtotal, "#,##0")
Me.Refresh
End If
End If
End If
End SubPrivate Sub Text2_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) TekanEnter (KeyAscii) End Sub
Private Sub Text2_LostFocus()
Dim RsSup As ADODB.Recordset
Set RsSup = New ADODB.Recordset
RsSup.Open "select * from TSUPPLIER where KodeSup ='" &
Trim(Text2.Text) & "'", CN, adOpenForwardOnly, adLockReadOnly
If RsSup.EOF And RsSup.BOF Then
MsgBox "Maaf Kode Supplier ini tidak ada"
Text2.SetFocus
Exit Sub
Else
Text5.Text = RsSup!NamaSup
End If
End SubPrivate Sub Text3_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) TekanEnter (KeyAscii) End Sub '--------- EOF File Form Transaksi ---------------
PENJELASAN:
Pada Source Program yg di download terdapat form tambahan seperti form Input Barang (FrmTBarang, FrmTSupplier, FrmTCustomer), form ini dibuat dengan menggunakan Menu VB Data Form Wizard, dimana dengan menu ini hanya dibutuhkan untuk mengarahkan database (STOK.MDB) sebagai sumber databasenya
Demikian pembahasan transaksi pembelian dan akan dilanjutkan pada bagian ke dua tulisan ini untuk membahas transaksi penjualan dan menampilkan data pada komputer.
Silakan meninggalkan pesan untuk sesuatu yang perlu dijelaskan..



Bagi file jadinya bos buat refrensi tugas ni
BalasHapuseh cucok
Hapusbagaimana cara mengupdate data stok secara otomatis setelah di input jumlah stok baru
BalasHapus..
For jumlah As Integer = 0 To DGVrsp.Rows.Count - 2
HapusDim updatestok As String = "UPDATE obat SET jumlah_o = jumlah_o - '" & DGVrsp.Rows(jumlah).Cells(3).Value & "' WHERE id_o = '" & DGVrsp.Rows(jumlah).Cells(0).Value & "'"
cmd = New OleDbCommand(updatestok, conn)
cmd.ExecuteNonQuery()
Form1.DGV.Refresh()
Next jumlah
bagi file udah jadi dong mas? :)
Hapuswow it's amazing article...admin saya ada tugas bagaimana cara menggunakan tombol simpan dengan perintah enter, sementara setelah ditekan tab dia focus pada tombol keluar atau hapus...
BalasHapusterima kasih admin..
min mau tanya dong klo mau buat STOK.MDB nya di mana ya min tolong pencerahan nya tanks min
BalasHapuswahhhhh..... masih agak bingung sih gan
BalasHapusOFFICIAL BLOG SEDERHANA BREMA | BREMA NOTE BLOG [:-D]
OFFICIAL BLOG SEDERHANA BREMA | BREMA NOTE BLOG [:-D]
www.brema-blog.blogspot.com [:-D]
www.brema-blog.blogspot.com [:-D]
bagaimana cara mengupdate harga data stok secara otomatis setelah di input harga pembelian baru
BalasHapusSuka (Y)
BalasHapusmin, buka filenya gimana ya? kok double klik stok hanya muncul query
BalasHapusmohon maaf unutk link download source codenya sudah tidak aktif
BalasHapusrizalcassa@gmail.com
salam kenal
BalasHapusGan tlng kirim donk source codenya utk pembelajaran ke sapeikids73@gmail.com
Salam Sapei
min tolong kirim bahannya ke rommykhaasland@yahoo.co.id
BalasHapusmin tolong g bisa di download kirim kodenya.. mohon bantuannya.. terima kasih izzanqolbiokey@gmail.com
BalasHapuskirim ke ira_nadia@hotmail.com filenya gan
BalasHapusDapat file jadi nya gak kak ?
Hapusmohon bantuanya untuk share link nya ke ekoarisaputra1995@gmail.com,saya sangat butuh aplikasi persediaan barang. terimaksih
BalasHapus