Artikel ini merupakan lanjutan artikel Belajar MS Access (8).
Keterangan:
Artikel Belajar MS Access ditulis secara bersambung di www.RumahAccess.com sebagai bahan belajar/tutorial bagi pemula. Dalam tulisan ini dibahas cara pembuatan database dan aplikasi Invoice sebagai contoh kasusnya.
Pada artikel sebelumnya kita telah membuat form untuk membuat (memasukkan data) Invoice (frm_Invoice). Sekarang kita lanjutkan.
Jalankan Microsoft Access, lalu buka file database Invoice.accdb yang telah kita buat pada latihan-latihan sebelumnya (NOTE: jika anda baru menemukan artikel ini, anda harus memulai dari artikel pertama karena mengandung latihan yang berkesinambungan).
MEMBUAT SUBFORM
Subform kita perlukan untuk memasukkan detail data Invoice, biasanya berupa list item-item pekerjaan atau barang yang dikirim. Subform ini berdasarkan data pada table tbl_Invoice_detail.
Untuk membuat subform, lakukan langkah-langkah sebagai berikut:
- Klik ribbon tab CREATE, klik “Form Design”.
- Langsung simpan form dengan nama: frm_Invoice_dtl
- Tekan F4 untuk menampilkan Property Sheet.
- Pada property Record Source, klik tombol Builder […] di bagian kanan untuk menampilkan Query Builder.
- Pada query, tambahkan table tbl_Invoice_detail.
- Klik-ganda * (asterik) pada kotak field untuk menambahkan * ke dalam grid. (Ingat: * artinya meng-include-kan semua field).
- Pada kolom kedua, ketik rumus: Jumlah: [Qty]*[Harga]
- Pada kolom ketiga, pilih field NomorUrut, lalu pilih Sort: Ascending. Hilangkan tanda centang pada baris Show. Kolom ketiga ini dimaksudkan agar data detail Invoice diurutkan berdasarkan field NomorUrut, namun field ini tidak perlu ditampilkan lagi karena sudah include dalam tanda * di kolom pertama. Jika tanda centang pada baris Show tidak dihapus maka akan ada dua field NomorUrut, dan Access akan otomatis memberikan nama alias yang justru bisa membuat kita bingung.
Gambar-1. Query untuk Record Source form frm_Invoice_dtl
9. Setelah query di atas jadi, tutup Query Builder untuk kembali ke form. Jawab “Yes” jika ada pertanyaan konfirmasi dari Access.
10. Pada Form Design, klik ribbon tab DESIGN, klik “Add Existing Fields” (atau bisa juga menekan Alt+F8) untuk menampilkan Field List.
11. Tambahkan (drag) field-field yang diperlukan ke atas form, sehingga tampak seperti pada Gambar-2.
12. Gunakan ribbon tab ARRANGE untuk merapikan tata letak field. Ubah Caption di Label sehingga mirip dengan Gambar-2. Ingat, kita “nyontoh” dari form Invoice yang sudah jadi, sehingga teks pada Label kita sesuaikan. (NOTE: Field KodeItem di sini tidak kita gunakan. Field ini sebenarnya berguna jika kita ingin memasukkan list item barang berdasarkan kodenya, atau tinggal milih dari list/table yang sudah disediakan, namun di dalam contoh ini tidak kita gunakan).
Gambar-2. Disain form frm_Invoice_dtl
13. Tampilkan Property Sheet. Pilih “Form” pada Selection Type. Atur property sebagai berikut:
14. Klik field Deskripsi. Atur property sebagai berikut:
15. Atur property yang sama untuk field Keterangan. Pengaturan ini berguna agar pemakai bisa menekan Enter untuk menambahkan baris baru dalam field, dan muncul scroll bar jika teks dalam field lebih dari ukuran field.
16. Field NomorUrut sebaiknya di-align Center (rata tengah).
17. Field Qty sebaiknya berformat: Standard dengan Decimal Places: 2. Untuk perataan bisa dibuat Center.
18. Field Harga dan Jumlah juga berformat Standard namun Decimal Places: 0 saja (untuk mata uang rupiah lazimnya tidak menggunakan desimal).
19. Agar perubahan yang dilakukan pada data detail ini otomatis me-refresh informasi pada form induk, masukkan sedikit code berikut ini pada Event: After Update (event pada Form).
Private Sub Form_AfterUpdate()
On Error Resume Next
Parent!txtSubTotal.Requery
End Sub
20. Selesai. Simpan dan tutup form.
MEMASUKKAN SUBFORM PADA FORM INDUK
Setelah form untuk subform selesai dibuat, sekarang kita bisa memasukkannya ke dalam form induk.1. Klik-kanan frm_Invoice dalam Navigation Pane, pilih “Design View”.
2. Klik control subform Sub1, lalu tampilkan Property Sheet.
3. Di bawah tab Data, pada property Source Object, pilih “frm_Invoice_dtl”
4. Secara otomatis Access akan menghubungkan form induk dengan form anak dengan kunci relasinya, yaitu: InvoiceID. Namun jika tidak, anda perlu mengatur property menjadi sebagai berikut:
5. Agar pemakai tidak memasukkan data detail sebelum record pada table induk tercipta, kita perlu mencegah agar focus tidak bisa dipindahkan ke dalam subform. Triknya: pada event On Enter dari Sub1, kita memasukkan procedure sebagai berikut:
Private Sub Sub1_Enter()
If IsNull(Me.InvoiceID) Then
Me.Pengantar.SetFocus
End If
End Sub
Artinya: jika focus masuk ke Sub1, maka cek apakah InvoiceID masih Null. Jika masih Null maka focus alihkan ke Pengantar (field di atas Sub1).
6. Selesai.
MEMBUAT QUERY qry_Invoice_total
Query qry_Invoice_total digunakan untuk menghitung nilai total dari detail data. Informasi ini ditampilkan pada form Invoice, dan menjadi dasar bagi perhitungan Diskon dan Pajak.
Untuk membuat query qry_Invoice_total, lakukan langkah-langkah sebagai berikut:
1. Klik ribbon tab CREATE, klik “Query Design”.
2. Pada Query Design, tambahkan table tbl_Invoice_detail ke dalam query.
3. Pada ribbon tab DESIGN, klik “Totals”.
4. Klik-ganda field InvoiceID dari kotak field. Kolom pertama ini baris Total berisi “Group By”.
5. Pada kolom kedua, masukkan rumus: Total: [Qty]*[Harga] dan pada baris Total berisi “Sum”. (Lihat Gambar-3).
6. Simpan query dengan nama: qry_Invoice_total
7. Selesai. Tutup query.
Gambar-3. Disain query qry_Invoice_total
MEMBUAT NOMOR OTOMATIS
Nomor Invoice yang akan kita buat di sini mengikuti aturan sebagai berikut:
- Nomor dibuat berurutan, dalam arti nomor terakhir + 1
- Nomor akan di-reset ke 1 lagi setiap tahun
- Format nomor Invoice: Inv. 0029/BIT/VII/18
Dimana: “Inv.” adalah teks prefiks, “0029” adalah nomor Invoice dalam format 4 digit, “BIT” adalah inisial perusahaan, “VII” adalah angka rumawi bulan Juli, dan “18” adalah tahun 2018.
Skenario pembuatan nomor otomatis ini sebagai berikut:
- Pada record kosong, nomor tidak tersedia.
- Pemakai harus mengklik-ganda field No. Invoice (pada form Invoice) untuk menciptakan nomor baru secara otomatis.
- Nomor Invoice memerlukan data Nomor (dari field Nomor) dan data Tanggal (dari field Tanggal), kedua field ini harus terisi data agar bisa dibuatkan nomor Invoice.
- Data pada Nomor akan diisi secara otomatis berdasarkan data Nomor terbesar dalam periode reset, plus 1.
- Data Tanggal secara otomatis akan diisi dengan tanggal komputer, namun bisa diedit (agar fleksibel dalam pembuatan Invoice).
- Perubahan data tanggal selama dalam periode reset tidak mempengaruhi data Nomor yang sudah dibuat, namun jika tanggal berubah di luar periode reset, maka data Nomor akan mengikuti (Nomor terbesar dalam periode tersebut plus 1).
- Nomor yang sudah terpakai tidak bisa dipakai lagi. Nomor baru selalu Nomor paling besar plus 1.
- Selain data Nomor, tampilan format Nomor Invoice disesuaikan dengan prefiks dan data Tanggal.
Berdasarkan ketentuan-ketentuan di atas, maka kita bisa membuat procedure untuk menghasilkan nomor otomatis, dimulai dengan trigger klik-ganda pada field No. Invoice.
Untuk itu lakukan langkah-langkah sebagai berikut:
- Tampilkan form frm_Invoice ke dalam Design View.
- Klik field Nomor, lalu tekan F4 untuk menampilkan Property Sheet.
- Klik tab Other, ubah property Name menjadi: txtNomor
- Klik tab Data, isi property Control Source dengan: =fNomorInvoice([Nomor];[Tanggal])
- Klik tab Event, pada property On Dbl Click pilih [Event Procedure].
- Klik tombol Builder […] di sebelah kanannya untuk menampilkan jendela Visual Basic for Application.
- Ketik code sebagai berikut:
- Setelah selesai memasukkan code program, tutup jendela Visual Basic for Application dan simpan form.
Code:
Private Sub txtNomor_DblClick(Cancel As Integer)If Not Me.AllowEdits Then Exit Sub 'hanya berlaku jika boleh edit
'
If IsNull(Me.Tanggal) Then Me.Tanggal = Date 'Tanggal tidak boleh kosong
whr = "Year(Tanggal)=" & Year(Me.Tanggal) 'reset per tahun
'whr = whr & " AND Month(Tanggal)=" & Month(Me.Tanggal) 'kalau mau reset per bulan
'
If Nz(Me.Nomor, 0) = 0 Then 'Field Nomor belum terisi, jadi belum pernah dibuat
'Isi dengan nomor terakhir + 1 (sesuai kondisi reset)
Me.Nomor = Nz(DMax("Nomor", "tbl_Invoice", whr), 0) + 1
Else 'Field Nomor sudah terisi
'cek kesesuaian dengan tanggal
tNom = Me.Nomor
tRid = Me.InvoiceID
whr1 = whr & " AND Nomor=" & tNom & " AND InvoiceID<>" & tRid
If IsNull(DLookup("InvoiceID", "tbl_Invoice", whr1)) Then
'Nomor tidak duplicate, bisa digunakan
Else
'Nomor dipakai pada record lain
'Buat Nomor baru sesuai tanggal / kondisi reset
Me.Nomor = Nz(DMax("Nomor", "tbl_Invoice", whr), 0) + 1
End If
End If
'
Me.Requery
End Sub
Gambar-4. Code untuk membuat nomor otomatis
Penampilan nomor invoice diformat dengan sebuah function bernama fNomorInvoice(). Function ini bisa kita masukkan pada sebuah module standar yang berlaku umum. Caranya adalah sebagai berikut:
1. Pada Access, klik ribbon tab CREATE, Klik “Module”.
2. Masukkan code sebagai berikut:
3. Simpan module dengan nama: mdl_Procedures (nama module boleh apa saja, namun dalam contoh ini kita beri nama mdl_Procedures).
Code:
Function fNomorInvoice(ByVal pNomor, ByVal pTanggal)If IsNull(pNomor) Then Exit Function
If IsNull(pTanggal) Then Exit Function
'
'Format nomor: Inv. 0029/BIT/VII/18
fNomorInvoice = _
"Inv. " & Format(pNomor, "0000") & _
"/BIT/" & _
fRumawiBulan(Month(pTanggal)) & _
"/" & Right(Year(pTanggal), 2)
End Function
Function di atas membutuhkan sebuah function yang lain bernama fRumawiBulan(). Codenya bisa dimasukkan di bawah function fNomorInvoice().
Gambar-5. Code untuk function fNomorInvoice() dan fRumawiBulan()
Sampai tahap ini, seharusnya form Invoice anda sudah bisa digunakan untuk memasukkan data Invoice, dan nomor Invoice sudah bisa dihasilkan otomatis.
Hal yang masih perlu dilakukan pada form Invoice adalah memudahkan pemasukan data Diskon dan Pajak yang bisa menggunakan nilai nominal atau persentase. Selain itu, kita juga masih belum mengaktifkan tombol-tombol (Button) serta beberapa prosedur validasi data.
In syaa Allah kita akan bahas pada artikel berikutnya. Mohon bantu doa dari teman-teman agar saya masih ada umur, sehat, sempat, dan mampu untuk melakukannya.
(Bersambung)
1 komentar:
Apakah bisa Subtotal di footer terisi pada saat kursor ada di field total atau belum berpindah ke record selanjutnya
Posting Komentar