1
KATA PENGANTAR
Visual Basic merupakan salah satu bahasa pemograman yang popular sejak pertama kali di rilis tahun 1991. Karena kehandalannya maka Microsoft selalu membuat perbaikan disana-sini untuk setiap versi terbarunya. Pada bulan April yang lalu Microsoft telah merilis Visual Studio 2010 yang didalamnya terdapat Visual Basic terbaru yaitu Visual Basic 10. Pada versi ini banyak sekali fitur-fitur yang memudahkan programmer dalam develop aplikasi. Dan untuk mengetahui fitur-fitur apa saja yang terdapat pada VB 10 dan VS 2010 buku ini dapat dijadikan salah satu referensi karena di kemas dengan gamblang dan mudah dimengerti, sekaligus di sertakan dengan contoh pembuatan aplikasi. Selain membahas Visual Basic buku ini juga membahas tentang fitur-fitur baru pada Ms Access 2010, dimana Ms Access 2010 dapat dijadikan sebaga database pada suatu aplikasi. Penulis menyarankan sebelumnya mengunduh (download) terlebih dahulu project yang dibahas pada buku ini disini (http://geeks.netindonesia.net/files/folders/source_codes_vb/default.aspx). Salah satu kelebihan buku ini adalah, bagaimana pembaca dibimbing untuk membuat aplikasi dengan VB 10 dan Ms Access 2010. Walaupun sebelumnya pembaca tidak memiliki pengetahuan dengan 2 (dua) produk ini, tapi dengan bimbingan buku ini pembaca dapat mengikuti dengan baik. Tetapi penulis juga manusia, jadi buku ini masih jauh dari sempurna dan untuk itu penulis menantikan saran dan usulan dari para pembaca untuk perbaikan penulisan di masa yang akan datang. Saran dan usulan para pembaca dapat dilayangkan ke alamat email penulis
[email protected].
2
Penulis panjatkan puja-puji syukur kehadirat Allah SWT, yang telah melimpahkan rahmat dan hidayah-Nya sehingga penulis dapat menyelesaikan penulisan buku ini. Buku special penulis persembahkan untuk “Si Kecil ,sibuah hati” Syifa Afrah Syafira, yang baru berumur 5 bulan.
Sebulan Sebelum Bulan Kelahiran Ku,
Junindar, MVP VB.NET
3
4
Biografi Penulis.
Junindar Lahir di Tanjung Pinang, 21 Juni 1982. Menyelesaikan Program S1 pada jurusan Teknik Informatika di Sekolah Tinggi Sains dan Teknologi Indonesia (ST-INTEN-Bandung). Junindar mendapatkan Microsoft MVP VB pertanggal 1 oktober 2009. Penulis merupakan Ketua Microsoft User Group Indonesia Regional Batam (MUGI – Batam). Senang mengutak-atik
computer
yang berkaitan
dengan
bahasa
pemrograman. Keahlian, sedikit mengerti beberapa pemrograman seperti : VB.Net, LINQ, VBA. Database : Access dan SQL Server 00/05. Simulation / Modeling Packages: Visio Enterprise, Rational Rose dan Power Designer. Dan senang bermain gitar, karena untuk bisa menjadi pemain gitar dan seorang programmer sama-sama membutuhkan seni. Pada saat ini bekerja di salah satu Perusahaan Swasta di BATAM sebagai Software Development. Mempunyai moto hidup : “Jauh lebih baik menjadi Orang Bodoh yang giat belajar, dari pada orang Pintar yang tidak pernah mengimplementasikan ilmunya”.
Kritik dan saran kirim ke :
[email protected] http://junindar.blogspot.com
5
Ketika anak Adam meninggal, terputuslah amalannya kecuali dari tiga perkara : Shadaqah jariyah, ilmu yang bermanfaat bagi orang sesudahnya dan anak shalih yang mendo'akannya.
Semoga ini menjadi Ilmu yang bermanfaat. Amin
6
DAFTAR ISI
Halaman KATA PENGANTAR .............................................................................................................1 TENTANG PENULIS ............................................................................................................3 DAFTAR ISI............................................................................................................................5 BAB I. MS ACCESS 2010 1.1 Fitur – Fitur Ms 2010 .............................................................................................7 1.2 Membuat Database dan Table ................................................................................16 1.3 Membuat Query ......................................................................................................20 BAB II. VISUAL STUDIO & VISUAL BASIC 2010 2.1 Visual Studio 2010 IDE .........................................................................................23 2.2 Fitur – Fitur Baru pada VS 2010 ............................................................................24 2.3 Fitur – Fitur Baru pada Visual Basic 10 .................................................................28 2.4 Membuat Project Baru............................................................................................37 2.5 Menambah Control Pada Form ..............................................................................40 BAB III. ANALISIS PROGRAM
7
3.1 Analisa Proses………………………………………………………………….....45 3.2 Analisa Pengguna....................................................................................................45 BAB IV. PEMBUATAN APLIKASI 4.1 Membuat Database..................................................................................................47 4.2 Bekerja dengan VB 10 (Membuat Management User)...........................................53 4.3 Membuat Form Group ............................................................................................104 4.4 Membuat Form Genre .............................................................................................118 4.5 Membuat Form Customer .......................................................................................125 4.6 Membuat Form DVD ..............................................................................................138 4.7 Membuat Form Rental DVD ..................................................................................157 4.8 Membuat Form Return DVD ..................................................................................173
8
BAB I MS ACCESS 2010 Pada bab ini akan dijelaskan tentang fitur-fitur baru pada Ms Access 2010, dan cara pengunaan dasar pada Ms Access 2010, seperti membuat table, query maupun relationships. Sebelum kita masuk ke penjelasan penggunaan MS Access 2010, terlebih dahulu kita membahas tentang Ms Office 2010 pada umumnya. Untuk Ms Office 2010 ini terdapat 7 versi yang tersedia seperti dibawah.
Office Professional Plus 2010
Office Professional 2010
Office Standard 2010
Office Home and Business 2010
Office Home and Student 2010
Office Professional Academic 2010
Office Starter 2010
Ms Office 2010 dapat berjalan pada office 2007, dan untuk menginstall Ms Office 2010 di butuhkan system requirements sebagai berikut :
Processor 500 MHZ atau lebih
RAM 256 MB atau lebih
Hard disk 2 GB
CD atau DVD drive
Display 1024 x 768 atau lebih
OS : Windows Xp SP3, Windows Vista SP1 (32 atau 64 bit), Windows 7 (32 atau 64 bit), Windows Server 2003 R2 dengan SP2 (32 atau 64 bit) dan Windows Server 2008 dengan SP1 (32 atau 64 bit)
1. 1 Fitur - Fitur Ms 2010 Sebelum kita menggunakan suatu produk, kita biasanya terlebih dahulu kita selalu mencari tau bagaimana kelebihan produk baru ini di banding dengan produk sebelumnya. 9
Oleh karena disini penulis akan menjelelaskan beberapa fitur-fitur terbaru untuk Ms Access 2010. Contextual tabs
Ribbon
Record Navigation Database search
View Control
Gambar 1.1
Quick Start Fields Pada versi sebelumnya untuk membuat field seperti berikut (Address, City, State, Zip dan Country) kita melakukan nya satu persatu. Tapi dengan Ms Access 2010 ini kita cukup hanya sekali klik, yaitu dengan menggunakan Quick Start. Cara nya buka table yang ingin ditambahkan field nya lalu pada Table Tool Fields Tab klik More Fields pada Add & Delete Grop. Lalu Scroll ke bawah dan pada Quick Start pilih Address.
10
Gambar 1.2
Gambar 1.3
Terdapat beberapa field didalam Quick start, dan kita dapat mengganti options pada field. Sebagai contoh, jika kita memilih Payment, maka secara otomatis akan terdapat beberapa pilihan (Cahs, Credit Card, Check dan In Kind) kita dapat 11
mengubah pilihan ini, dengan cara klik kanan pada field, lalu pilih Edit List Item, maka akan muncul jendela seperti dibawah. Lalu ganti sesuai yang dinginkan .
Gambar 1.4
Menu dan Ribbon Untuk fitur ini terdapat pada aplikasi Ms Office lain nya. Seperti kita ketahui pada Ms Access 2007 terdapat “Office Button” pada pojok kiri atas, dan fitur ini telah dihilangkan pada ms Access 2010. Pada Ms Access 2010 terdapat menu “File” sebagai ganti nya. Dan pada Menu File terdapat beberapa item seperti Info, Recent, New dan lainnya.
Gambar 1.5
12
Application Part Untuk menggunakan application part, click Create Tab dan klik Application Part maka list dari application part akan tampil seperti dibawah. Lalu pilih application part yang dinginkan.
Gambar 1.6
Office Themes Untuk Ms Access 2010 ini ada fitur yang memudahkan kita untuk mendesign form atau report dengan sekali klik. Dimana kita dapat memilih theme yang kita suka. Theme ini sudah mengatur dari warna dan font pada form maupun report. Klik Form/Report yang mau diubah, lalu pada Contextual > Design pilih themes pada Themes group. Seperti gambar dibawah.
13
Gambar 1.7
Calculate Fields Pada fitur ini kita bisa membuat sebuah field uang otomatis mengkalkulasi antara field. Seperti contoh kita memilki field A yang bernilai 2 dan Field B bernilai 5, lalu secara otomatis kita ingin membuat sebuah field untuk menampung jumlah dari Field A dan B, dengan menggunaka fitur ini kita dapat mengkalkulasi 2 field tersebut. Untuk penggunaannya, buka table yang di inginkan, lalu pada Contextual Tools > Fields, pilih More Fields pada Add & Delete Group. Dan klik Calculate Fields dan pilih type dari field yang dinginkan.
Gambar 1.8 Lalu akan tampil Expression Builder seperti dibawah, masukkan formula untuk hasil dari expression value nya.
14
Gambar 1.9
Data Bars dan Conditional Formating Data Bars membantu kita dalam membaca sebuah laporan, seperti melakukan perbandingan data, kadang tidak setiap orang mengerti maksud dari laporan tersebut. Dengan adanya data bars membatu secara visualisasi.. Fitur ini sekarang sudah tersedia pada Ms Access 2010.
Gambar 1.10
15
Buka Report yang dinginkan, Report Layout Tools > Format, lalu pilih Conditional Formatting. Maka akan muncul tampilan seperti dibawah. Pilih Field yang dinginkan pada Show Formatting rules for :
Gambar 1.11 Pilih New Rule, pada Select a rule type, pilih compare to other records. Dan ganti warna dari Bar, dan klik OK.
Gambar 1.12
Navigation Forms Sesuai dengan namanya navigation forms, fitur ini memudahkan kita dalam membuat navigasi dari form/report, hanya dengan menarik form kedalam Navigation Forms. Navigation Forms berfungsi untuk memudahkan dalam mencari form atau Report yang dinginkan. Untuk membuat Navigation Forms ikuti langkah-langkah sebagai berikut. Pada Tab Create, lalu klik Navigation Forms pada group forms. Maka akan muncul layout dari Navigation forms. 16
Gambar 1.13
Pilih layout yang dinginkan. Drag dan Drop form atau report kedalam Navigation Forms.
Gambar 1.14
17
Macro Untuk Ms Access 2010 ini dalam penggunaan macro menjadi lebih mudah. Dimana dapat dilakukan dengan Drag dan Drop saja.
Gambar 1.15
1. 2 Membuat Database dan Table Penulis bersumsi bahwa tidak semua pembaca sudah bisa atau pernah menggunakan Ms Access. Oleh karena itu pada bab ini juga penulis menjelaskan bagaimana cara membuat Database dan Table, yang nanti nya pada bab kedepan penulis tidak menjelaskan secara detail tentang membuat database dan table kembali. Pada Start > All Programs > Ms Office > Ms Access 2010, maka akan muncul tampilan seperti dibawah.
18
Gambar 1.16
Lalu pilih Blank database, kemudian ganti nama database dan browse dimana file akan disimpan. Kemudian teka button Create. Dan tampilan dari Ms Access pun akan berganti menjadi seperti gambar dibawah. Dengan default Table1.
Gambar 1.17
19
Dengan melakukan langkah-langkah dibawah maka kita telah memiliki sebuah database. Langkah selanjutnya adalah membuat table. Klik Tab Create, lalu klik Table pada Tables group. Lalu Contextual Table Tools > Fields, klik View pada Views Group dan pilih Design View. Maka akan muncul dialog Save As, ketikkan nama table yang dinginkan.
Gambar 1.18
Gambar 1.19 Setelah menekan button OK, maka kita akan masuk pada tampilan Design untuk Table, seperti gambar dibawah.
20
1
2
3
4
Gambar 1.20
Keterangan : 1. Field Name : Merupakan tempat menambah menghapus dan mengganti Nama Field dai table. 2. DataType : Tempat untuk mengganti Tipe Data dari Field. 3. Description : Tempat untuk mendeskripsikan field 4. General : Merupakan Properties dari field Disinilah merupakan tempat untuk mengganti properties seperti, field size, format, Input Mask dan lain-lain.
Lalu tekan button Save atau Ctrl + Save untuk menyimpan hasil dari perubahan table.
21
Save
Gambar 1.21
1. 3 Membuat Query Setelah selesai dengan membuat table, kita lanjutkan dengan membuat query, mungkin masih banyak pembaca tidak mengetahui dari fungsi query. Query dapat berfungsi untuk menampilkan data dari 1 table atau lebih, atau untuk proses insert, delete maupun update, yang bisa diakses diluar Ms Access 2010, seperti Visual Basic 10. Untuk membuat Query (Select table) ikuti langkah-langkah seperti berikut : Klik Tab Create, selanjutnya klik Query Design pada Queries group.
Gambar 1.22 Selanjutnya akan tampil jendela Show Table, pilih table yang ingin di tampilkan lalu tekan button “Add”, lalu klik button “Close” untuk menutup tampilan show table. Lalu klik ganda field yang ingin ditampilkan, seperti gambar dibawah.
22
Gambar 1.23 Untuk menampilkan hasil dari query pada Query Design Tools, klik View pada Result Group dan pilih DatasheetView
Gambar 1.24
Gambar 1.25
23
Untuk melihat sintaks SQL nya pilih SQL View. Kita dapat memodifikasi sintaks SQL seperti dibawah ini, contoh jika kita ingin menampilkan dengan menggunakan criteria (parameter). SELECT t_cust.refer_cust, t_cust.first_name, t_cust.last_name, t_cust.telp, t_cust.email FROM t_cust WHERE (((t_cust.refer_cust)=[@refer_cust]));
Lalu pada View pilih DatasheetView, maka akan tampil dialog seperti dibawah.
Gambar 1.26 Untuk kedepan penulis hanya memberikan sintaks dari SQL pada setiap query tanpa menjelaskan secara detail pembuatanya. Pembaca dapat copy paste sintaks SQL dan modifikasi pada jendela SQL View.
24
BAB II VISUAL STUDIO & VISUAL BASIC 2010
Pada bab ini akan di
jelaskan dasar-dasar Visual Studio dan Visual Basic 2010, yang
dimana akan membantu pembaca untuk membuat aplikasi pada bab berikut nya. 2. 1 Visual Studio 2010 IDE Untuk membuat aplikasi sebenarnya kita tidak harus menggunakan Visual Studio 2010, kita dapat menuliskan semua code dengan menggunakan text editor seperti notepad. Tetapi dengan Visual Studio 2010 IDE akan memudahkan kita dalam membuat aplikasi karena didukung dengan fitur-fitur yang memudahkan seorang programmer. Untuk Visual Studio 2010 terdapat 5 versi yang tersedia :
Express
Professional
Professional with MSDN
Premium with MSDN
Ultimate with MSDN
Gambar 2.1 25
2. 2 Fitur-Fitur Baru pada VS 2010 Berikut beberapa penjelasan tentang improvement yang ada pada VS 2010. Multi windows Pada fitur ini kita dapat menarik windows keluar dari IDE dengan cara Ctrl + Klik ganda.
Gambar 2.2 Multi targeting Sebenarnya fitur ini sudah ada pada Visual Studio versi sebelumnya, Cuma yang membedakan dengan VS 2010, VS 2010 akan menampilkan ToolBox dan properties sesuai dengan .net framework yang dipilih.
Gambar 2.3
26
Add References Pada Visual Studio versi sebelumnya jika kita melakukan Add References pada project itu membutuhkan waktu yang cukup “mengganggu”, untuk versi 2010 ini waktu yang dibutukan sangat cepat, dan focus pada jendela Add References pada tab Projects.
Gambar 2.4 Zoom Fungsi ini sangat membantu sekali pada saat kita di code editor. Kita dapat memperbesar dan memperkecil pada Code Editor dengan menekan Ctrl + Mouse Scroll.
Gambar 2.4 27
Navigate To Biasanya pada saat melakukan pemograman sering sekali kita melakukan pencarian kata-kata, dan untuk VS versi sebelumnya kita menggunakan fungsi search. Pada versi 2010 ini kita dapat menggunakan fungsi Navigate To dengan cara menekan Ctrl + , (koma) atau Edit > Navigate To. Dengan mengetikkan kata yang dicari maka secara otomatis pada Result Found akan memfilter kata yang dicari, dan cukup meng-klik pada list maka secara otomatis akan menuju ke lokasi.
Gambar 2.5 Generate Sequence Diagram. Fungsi ini hanya bisa dilakukan pada Versi Premium dan Ultimate. Fungsi ini adalah untuk membuat diagram pada method. Dengan cara klik kanan pada function dan pilih “Generate Sequence Diagram”.
28
Gambar 2.6 Generate From Usage Pada fitur ini kita dapat menggunakan Class dan member sebelum kita membuatnya. Seperti kita ketahui jika suatu class belum dibuat maka tidak bisa kita melakukan deklarasi terhadap class tersebut. Untuk VS 2010 kita dapat menggenerate Class tersebut dengan cara. Tekan Ctrl + . (titik) pada error list, maka akan tampil tooltip seperti dibawah.
Gambar 2.7 29
Lalu pilih Generate New Type untuk bisa memodifikasi class yang dinginkan.
Gambar 2.8 2. 3 Fitur – fitur baru pada Visual Basic 10 Untuk
fitur-fitur
baru
ini
di
ambil
dari
blog
Erick
Kurniawan,
MVP
VB
(http://mugi.or.id/blogs/erick)
Collection Initializer Collection Initializer digunakan untuk menginisialisasi object collection dalam sebuah baris kode saja, sehingga mempermudah penulisan kode. Pada VB9 untuk menginisialisasi object Collection anda harus menuliskan kode: 1: Dim objNama As New List(Of String) 2: objNama.Add("Erick") 3: objNama.Add("Wely") 4: objNama.Add("Lutfie") 5: objNama.Add("Ridi") 6: 7: For Each nama In objNama 30
8: Console.WriteLine(nama) 9: Next Pada VB10 dengan menggunakan Collection Initializer anda dapat menggunakan keyword „from‟ untuk mempersingkat penulisan kode diatas. 1: Dim objNama As New List(Of String) From {"erick", "wely", "lutfie", "ridi"} 2: For Each nama In objNama 3: Console.WriteLine(nama) 4: Next Anda juga dapat menggunakannya untuk object Dictionary 1: Dim dictMahasiswa As New Dictionary(Of String, String) From { 2: {"23080008", "erick"}, 3: {"23080009", "budi"}, 4: {"23080010", "anton"}} 5: For Each mhs In dictMahasiswa 6: Console.WriteLine("Nim :" & mhs.Key & "Nama :" & mhs.Value) 7: Next Jika anda ingin menginisialisasi list of class maka anda dapat menggunakan extension method untuk mengoverride method „add‟ yang ada pada object collection. 1: Imports System.Runtime.CompilerServices 2: Module Module1 3: 'menggunakan extension method 4:
5: Sub Add(ByVal lstMhs As List(Of Mahasiswa), 6: ByVal nim As String, 7: ByVal nama As String, 8: ByVal ipk As Double) 9: lstMhs.Add(New Mahasiswa With {.Nim = nim, .Nama = nama, .IPK = ipk}) 10: End Sub 11: 12: Sub Main() 13: Dim list As New List(Of Mahasiswa) From { 14: {"23080008", "Erick Kurniawan", 3.4}, 15: {"22080009", "Budi Anduk", 3.3} 16: } 17: 18: For Each mhs In list 19: Console.WriteLine("Nim :" & mhs.Nim & " Nama :" & mhs.Nama & " Ipk :" & mhs.IPK) 20: Next 21: End Sub 22: 31
23: End Module
Array Literals ArrayLiteral memberi kemudahan kepada kita untuk memberi nilai ke object array secara langsung, compiler akan secara otomatis meng-infers tipe datanya. 1: Dim arr1 = {1, 2, 4, 5, 6} 'infers ke tipe integer 2: Dim arr2 = {1, 2.5, 3.5, 5} 'infers ke tipe double 3: Dim arr3 = {"erick", "budi"} 'infers ke tipe string 4: Dim arr4 = {1, "erick"} 'infers ke tipe object (dengan catatan Option Strict On) 5: 6: 'untuk array multidimensi 7: Dim matrix1 = {{1, 32, 12}, {23, 45, 67}} 'infers ke tipe int(,)
ImplicitLineContinuation Pada bahasa VB kita biasanya menggunakan underscore untuk memisahkan satu baris logic code menjadi dua baris code atau lebih. Underscore mengindikasikan bahwa code yang dipisahkan menjadi beberapa baris tersebut sebenarnya masih satu logic code. Pada VB10 compiler VB akan menambahkan underscore secaraimplicit jadi anda tidak perlu menuliskannya. Namun pada beberapa kasus tertentu anda masih perlu menggunakan underscore. Dengan menggunakan implicit line continuation maka developer tidak perlu lagi menuliskan underscore pada sebagain besar baris code yang ditulis (ini sangat membantu terutama ketika anda menggunakan LINQ). Compiler VB akan secara implicit menggunakan line continuation pada kodisi-kondisi berikut:
Setelah Attribute
Setelah karakter koma (,)
Setelah karakter dot (.)
Setelah binary operator
Setelah LINQ Query Clause
Setelah karakter (, {, or <%=
Sebelum karakter ), }, or %>
32
Daftar karakter yang mendukung implicit line continuation dapat anda lihat pada table berikut:
33
Gambar 2.9 Contoh penggunaan implicit line continuation pada VB10:
Gambar 2.10
34
Auto-implementedProperties Fitur ini sebenarnya telah dimiliki oleh C# sejak versi 3.0, pada VB fitur ini baru ditambahkan pada VB10. Pada VB9 untuk membuat property anda harus menuliskan kode berikut: 1: Public Class Mahasiswa 2: Private _nim As String 3: Public Property Nim() As String 4: Get 5: Return _nim 6: End Get 7: Set(ByVal value As String) 8: _nim = value 9: End Set 10: End Property 11: 12: Private _nama As String 13: Public Property Nama() As String 14: Get 15: Return _nama 16: End Get 17: Set(ByVal value As String) 18: _nama = value 19: End Set 20: End Property 21: End Class dengan menggunakan auto-implemented properties maka anda dapat menuliskan: 1: Public Class Mahasiswa 2:
Public Property Nim As String
3:
Public Property Nama As String
4: End Class maka secara otomatis compiler akan menggenerate field dengan nama yang sama dengan property tapi dengan ditambahkan underscore didepannya, property getter dan setter juga akan digenerate otomatis.anda juga dapat menginisialisasi auto-implemented properties yang anda buat, contohnya: 1: Public Class Mahasiswa 35
2:
Property Nim As String = "23082321"
3:
Property Nama As String = "Erick Kurniawan"
4:
Property Angkatan As New List(Of Integer) From {12, 34, 56}
5: Property Ambil As New Matakuliah With {.Kode = "IM2043", .Nama = "Web Database"} 6: End Class kemudian pada main class cara mengaksesnya: 1: Sub Main() 2: Dim objMhs As New Mahasiswa 3: Console.WriteLine(objMhs.Nim & " " & objMhs.Nama) 4: For Each ang In objMhs.Angkatan 5: Console.WriteLine(ang) 6: Next 7: Console.WriteLine(objMhs.Ambil.Kode & " " & objMhs.Ambil.Nama) 8: End Sub
MultilineLambdas Pada blog series kali ini saya ingin mengeksplorasi fitur-fitur baru dari VB10 (VB10 akan dirilis bersama dengan VS2010 dan .NET 4.0). Fitur yang akan kita bahas kali ini adalah Multiline Lambdas, sebenarnya fitur ini sudah disupport di C# 3.0, tapi VB baru menambahkan fitur ini pada VB10. Pada VB10 anda dapat menggunakan Multiline Lambdas sebagai berikut: 1: Dim bil() As Integer = {1, 2, 3, 4, 5, 6, 7} 2: bil = Array.FindAll(bil, Function(n) 3: Console.WriteLine("Array ke-" & n) 4: If n Mod 2 = 0 Then 5: Return n 6: End If 7: End Function) 8: For Each num In bil 9: Console.WriteLine(num) 10: Next outputnya :
36
Gambar 2.11 Sama seperti Lambda Expression pada VB9 maka parameter dari Lambda tersebut akan diinfer secara otomatis oleh compiler (pada contoh diatas n akan diinfer menjadi tipe integer). Dengan menggunakan Multiline Lambda anda dapat membuat anonymous delegate dengan mudah contohnya: 1: Dim cthDelegate = Function(n As Integer) 2: Dim count = 0 3: For i = 1 To n 4: If n Mod i = 0 Then 5: count += 1 6: End If 7: Next 8: If count = 2 Then 9: Return "Bilangan Prima" 10: Else 11: Return "Bukan Bilangan Prima" 12: End If 13: End Function 14: 15: Console.WriteLine(cthDelegate(17)) outputnya :
Gambar 2.12
37
Jika anda cermati dari kode diatas maka nilai kembalian dari function tersebut adalah tipe “String” (compiler juga secara otomatis akan meng-infer tipenya). Anda juga dapat secara eksplisit menentukan tipe kembalian dari function diatas sehingga compiler tidak akan meng-infer tipenya secara otomatis. 1: Dim cthDelegate = Function(n As Integer) as String 2: Dim count = 0 3: For i = 1 To n 4: If n Mod i = 0 Then 5: count += 1 6: End If 7: Next 8: If count = 2 Then 9: Return "Bilangan Prima" 10: Else 11: Return "Bukan Bilangan Prima" 12: End If 13: End Function
Sub Lambdas Selain menggunakan “Function” keyword untuk membuat multiline lambda yang mengembalikan nilai, anda juga dapat menggunakan multiline lambda yang tidak mengembalikan nilai menggunakan “sub” keyword . 1: Dim arrNama() As String = {"erick", "ricky", "joni"} 2: Array.ForEach(arrNama, Sub(n As String) 3: Dim balik = "" 4: For i = n.Length - 1 To 0 Step -1 5: balik &= n(i) 6: Next 7: Console.WriteLine(balik) 8: End Sub) outputnya:
Gambar 2.13
38
Single line Sub Lambdas Pada VB9 anda hanya dapat menggunakan single expression lambda jika ada return valuenya, misal: 1: Dim bil() As Integer = {1, 3, 4, 5, 8, 10} 2: Dim query = bil.Where(Function(n) n Mod 2 = 0) 3: For Each num In query 4: Console.WriteLine(num) 5: Next Akan error jika anda tuliskan kode berikut pada VB9: 1: Dim bil() As Integer = {1, 3, 4, 5, 8, 10} 2: Array.ForEach(bil, Sub(n) Console.WriteLine(n)) Pada VB10, anda dapat menggunakan keyword “sub” untuk membuat single expression yang tidak mengembalikan nilai 1: Dim bil() As Integer = {1, 3, 4, 5, 8, 10} 2: Array.ForEach(bil, Sub(n) Console.WriteLine(If(n Mod 2 = 0, "Genap :" & n, "Ganjil :" & n)))
2. 4 Membuat Project Baru Klik New Project pada Toolbar atau File > New Project Pada New Project Dialog, pilih Visual Basic pada Installed Templates kemudian pilih Windows pada node Visual Basic, lalu pada Template Pane sebelah kiri pilih Windows Form Application template. Dan terakhir ketikkan “Belajar VB”, pada textbox Name, dan klik OK.
39
Gambar 2.14
Gambar 2.15 Ubah nama form, dengan cara klik Form1 pada Solution Explorer (gambar 2.16), lalu pada properties ganti “BelajarVB.vb” (gambar 2.17) kemudian tekan enter atau klik property yang lain untuk melihat perubahannya.
40
Gambar 2.16
Gambar 2.17 Sekarang kita akan mengubah title (text property) dari form. Klik Form1 dan ubah properties Text menjadi “Selamat Belajar”.
Gambar 2.18
41
2. 5 Menambah Control Pada Form ToolBox ToolBox merupakan tempat dimana terdapat control-control yang digunakan untuk mendesign form. Untuk menampilkan Toolbox cuku dengan menekan Ctrl + Alt + X.
Gambar 2.19 Kita dapat menambahkan control pada ToolBox dengan cara klik kanan pada ToolBox > Choose Item.
42
Gambar 2.20 Tambahkan control TextBox pada form dengan cara, Klik ganda Control TextBox pada Toolbox maka secara otomatis textbox akan tampil pada form. Atau dengan Drag dan Drop control dari textbox ke form. Lakukan hal sama untuk control label dan 2 Button. Ubah properties Name untuk TextBox menjadi “txtNama”, untuk label ubah properties Text menjadi “Masukkan Nama anda” dan untuk button ubah properties Name menjadi “btnOK”, dan text menjadi “OK”, lalu susun seperti gambar dibawah.
Gambar 2.21
43
Sekarang kita akan membuat event handler, untuk membuat event handler ada beberapa cara yang pertama, pada jendela properties pilih icon “event” lalu akan tampil event handler untuk control tersebut.
Gambar 2.22 Atau melalui jendela code editor, pada combobox sebelah kiri pilih control yang dinginkan lalu pada combobox sebelah kanan pilih event handler.
Gambar 2.23
44
Gambar 2.24 Pada bab setelah ini penulis hanya menyebutkan nama event handler nya saja, tanpa menjelaskan cara pembuatan nya. Sebagai contoh penulis menyebutkan event handler txtNama_KeyUp, ini dimaksudkan control txtNama dengan event Handler KeyUp. Atau untuk membuat event handler bisa di lakukan dengan klik ganda, seperti contoh untuk button, jika di klik ganda maka akan terbentuk event hanlder Click. Buat event handler btnOk_Click (klik ganda button OK). Lalu ketikkan sintaks ini didalam event handler btnOk_Click Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click 'Ini Cuma Comment MessageBox.Show("Hiii, " & txtNama.Text & " Selamat mempelajari Visual Basic 10") End Sub
Simpan project dengan menekan Ctrl + Shift + S, maka Save Project Dialog akan muncul.
Gambar 2.25 Jalankan program (tekan F5), lalu masukkan nama anda dan klik button OK. 45
Gambar 2.26
Gambar 2.27
46
BAB III ANALISA PROGRAM
Pada bab ini akan dibahas bagaimana menganalisa proses dalam pembuatan suatu aplikasi. Aplikasi yang akan kita buat adalah “Aplikasi Rental DVD” dimana aplikasi ini berguna untuk memudahkan dalam mengolah data barang (DVD Rental) dan transaksi rental pada suatu rental DVD. 3.1. Analisa Proses Sebelum membuat suatu aplikasi, kita membutuhkan suatu tahap untuk menganalisa suatu proses, apa saja yang di butuhkan oleh aplikasi. Untuk aplikasi yang akan kita bua,t proses yang paling menonjol adalah proses Rental DVD dan Return DVD, dimana proses ini merupakan proses utama pada aplikasi yang akan kita buat. Dari proses ini tersebut, kita bisa memperluas proses-proses apa saja yang nantinya akan kita gunakan pada program ini. Secara umum dapat dikategorikan sebagai berikut : a. Rental Proses ini menangani tentang peminjaman DVD yang dilakukan oleh customer. Jika DVD yang di pinjam akan merubah status DVD menjadi Out. b. Return Proses ini merupakan tahap pengembalian DVD oleh customer. Jika pengembalian melewati batas yang telah di tentukan maka akan di kenakan denda. Dan juga merubah status DVD menjadi In. 3.2. Analisa Pengguna Setelah selesai menganalisa proses, selanjutnya adalah melakukan analisa pengguna. Analisa ini berfungsi untuk mengetahui ada berapa pengguna yang akan menggunakan aplikasi yang akan kita buat. Lalu kita berikan hak akses terhadap masing-masing pengguna. Pengguna pada aplikasi ini sebagai berikut : 1. Administrator Pengguna ini memiliki hak akses yang paling tinggi (dapat mengakses seluruh fasilitas pada aplikasi) 2. Staff 47
Staff merupakan pengguna yang memiliki hak akses dibawah admin, hanya manajamen user saja yang tidak bias dilakukan oleh pengguna ini. 3. Kasir Kasir merupakan pengguna yang paling sering menggunakan aplikasi ini, yaitu proses Rental dan Return DVD. 4. User Pengguna yang memilki hak akses paling kecil. Hanya dapat melihat daftar DVD.
48
BAB IV PEMBUATAN APLIKASI
Setelah selesai menganalisa, kita masuk ke tahap pembuatan aplikasi. Pada bab ini akan dibahas bagaimana membuat aplikasi dengan menggunakan VB 10 dan MS Access 2010. Pada tahap ini kita akan melihat bagaimana mudah nya membangun suatu aplikasi dengan dua program tersebut. 4.1.Membuat Database Sebelum masuk ke pemograman (Coding) pertama-tama kita buat terlebih dahulu database untuk aplikasi ini. Ikuti langkah-langkah dibawah ini untuk membuat database dan tabletabel yang akan di butuhkan pada aplikasi. a. Buka MS Access 2010
Gambar 4.1 b. Ketik DVD.accdb pada File Name , dan untuk sementara simpan terlebih dahulu ke My documents. Lalu klik “Create”. Untuk mengubah lokasi penyimpanan klik gambar folder dan pilih lokasi yang di inginkan. c. Selanjutnya secara otomatis akan ada sebuah table dengan nama Table1, klik kanan table tersebut dan klik Design, maka akan muncul form Save As dan ketikkan “T_Menu”
49
Gambar 4.2
d. Lalu ubah nama field pada table tersebut seperti gambar dibawah. Field Name
Data Type
Field size
Primary Key
MenuID
Text
10
PK (*)
MenuName
Text
25
MenuAction
Text
25
Table ini merupakan representasi dari Menu pada aplikasi yang akan kita buat nantinya. Field MenuID nantinya akan kita gunakan pada MenuStrip properties “Tag”. Sedangkan MenuName digunakan pada Text untuk MenuStrip, selanjutnya untuk MenuAction merupakan identitas apakah posisi Menu Item pada Header, Menu atau SubMenu. Lalu masukkan data dibawah pada table T_Menu, untuk membuka table klik ganda pada table. MenuID M1 M1-01 M1-02 M2 M2-01 M2-01-01 M2-01-02 M2-01-03 M2-02 M2-02-01 M2-02-02 M2-02-03 M2-03 M2-04 M3 M3-01
MenuName File Logout Exit Data DVD Add Edit DVD List Customer Add Edit Customer List Group Genre Tools Rental
MenuAction Header Menu Menu Header Menu SubMenu SubMenu SubMenu Menu SubMenu SubMenu SubMenu Menu Menu Header Menu 50
M3-02 M4 M4-01 M4-02 M4-03 M5 M5-01 M5-01-01 M5-01-02 M5-01-03 M5-02 M5-03 M6 M6-01
Return Report Rental Return Rekap Utility Users Add Edit User List Change Password Form Access Help About
Menu Header Menu Menu Menu Header Menu SubMenu SubMenu SubMenu Menu Menu Header Menu
e. Selanjutnya buat table baru dengan nama T_Role, dengan field-field nya sebagai berikut Field Name
Data Type
Field size
Primary Key
RoleID
Number
Integer
PK (*)
RoleName
Text
50
Dan isikan data pada table T_Role seperti dibawah RoleID 1 2 3 4
RoleName Admin Staff Kasir User
Table ini berfungsi untuk memetakan hak akses pada pengguna f. Tambahkan sebuah table lagi dengan nama T_RoleMenu, dengan format seperti dibawah. Field Name
Data Type
Field size
Primary Key
RoleID
Number
Integer
PK (*)
MenuID
Text
10
PK (*)
51
Untuk table ini merupakan gabungan antara table T_Menu dan T_Role dan berfungsi untuk menampung hak akses setiap Role. Contoh nya user dengan Role Admin dapat mengakses menu item Rental, Return, Customer data-data tersebut akan disimpan pada table ini. Dan isikan data seperti dibawah. RoleID 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
MenuID M1 M1-01 M1-02 M2 M2-01 M2-01-01 M2-01-02 M2-01-03 M2-02 M2-02-01 M2-02-02 M2-02-03 M2-03 M2-04 M3 M3-01 M3-02 M4 M4-01 M4-02 M4-03 M5 M5-01 M5-01-01 M5-01-02 M5-01-03 M5-02 M5-03 M6 M6-01
g. Dan tambahkan sebuah table dengan nama T_User dengan format seperti dibawah. Field Name
Data Type
Field size
Primary Key 52
UserName
Text
15
PK (*)
Password
Text
15
InputMask=Password
First_Name
Text
50
Last_Name
Text
50
RoleID
Number
Integer
Actived
Yes/No
Untuk pertama kali isikan data user seperti dibawah : Username : administrator Password= password First_Name : Admin RoleID=1 Actived=Yes (True) Selanjutnya adalah membuat relasi antar table, ikuti langkah-langkah seperti dibawah. Pada jendela MS Access, Klik Tab “Database Tools” lalu klik “Relationships”
1 2
Gambar 4.3 53
Lalu pada jendela Relationships, klik kanan > “Show Table”, maka akan tampil jendela Show Table, seperti dibawah. Klik Add untuk semua table didalam list.
Gambar 4.4
Gambar 4.5 Selanjutnya klik field “RoleID” pada table T_Role, dan drag ke field RoleID pada table T_RoleMenu. Maka akan muncul jendela “Edit Relationships” seperti dibawah.
54
Gambar 4.6 Klik checkbox “Enforce Rerential Integrity” lalu klik button “Create”, Lakukan hal sama pada field MenuID pada table T_Menu ke fied MenuID pada table T_RoleMenu. Lalu field RoleID pada table T_Role ke field RoleID pada table T_User., sehingga kita memiliki diagram relationships seperti dibawah.
Gambar 4.7 4.2. Bekerja dengan VB 10 (Management User) Sekarang adalah waktunya yang paling ditunggu-tunggu oleh pembaca, yaitu bekerja dengan VB 10. Untuk pertama kali kita buat terlebih dahulu project untuk aplikasi yang kita buat, dengan cara Start > All programs > Microsoft Visual Studio 2010 > Microsoft Visual Studi 2010. 55
Gambar 4.8
Gambar 4.9 Klik File > New Project, maka akan muncul jendela New Project. Pada “Installed Templates” > Visual Basic > Windows dan pilih “Windows Forms Application”. Lalu ubah Nama project menjadi “DVD Rental”, klik button OK.
56
Gambar 4.10
Gambar 4.11 Pada Solution Explorer, klik kanan “DVD Rental” > Add > New Item, maka akan tampil jendela Add New Item, pilih “Splash Screen” dan ubah namanya menjadi “Startup.vb”
57
Gambar 4.12 Tambahkan control Timer dan ubah properties nya seperti dibawah. Timer1 Name
timerSplash
Lalu buka Form1 yang ada pada saat kita membuat project, dan ganti properties pada Form1 seperti dibawah. Name
F_Login
ShowInTaksbar
False
Text
Login
StartPosition
CenterScreen
ControlBox
False
FormBorderStyle
FixedSingle
BackColor
White
Serta tambahkan control 2 label, 2 textbox, 2 button lalu ubah properties control-control tersebut seperti dibawah.
58
Textbox1 Name
txtUser
Textbox2 Name
txtPassword
UseSystemPasswordChar
True
Button1 Name
btnLogin
Text
Login
Button2 Name
btnCancel
Text
Cancel
Dan atur control-control diatas seperti gambar dibawah.
Gambar 4.13 Selanjutnya pada form Startup, tekan tombol F7 untuk menampilkan jendela Code. Lalu ketikkan variable class seperti dibawah. Dim opacityRate As Double = 0.0 Dim maximizeRate As Boolean = True Dim minimizeRate As Boolean = False
Pada form startup ini kita akan menggunakan fungsi Opacity pada form. Yaitu fungsi untuk membuat form menjadi trasnparan. jika nilai nya 1 maka form akan tampil normal, oleh
59
karena itu dengan variable “opacityRate” kita akan menggunakan untuk memasukkan nilai opacity. Lalu pada event handler Startup_Load ketikkan sintaks dibawah, yang berfungsi untuk mengaktifkan timer, dan memasukkan nilai Opacity menjadi 0 (Nol) atau hilang. Me.Opacity = 0.0 timerSplash.Interval = 60 timerSplash.Enabled = True timerSplash.Start()
Serta mengisi nilai interval timer menjadi 60 (1 detik), lalu klik ganda control Timer dan ketikan sintaks dibawah. If opacityRate >= 1.0 Then opacityRate = opacityRate + 1.0 If opacityRate >= 20.0 Then opacityRate = 0.99 Me.Opacity = opacityRate End If ElseIf maximizeRate Then opacityRate = opacityRate + 0.025 Me.Opacity = opacityRate If opacityRate >= 1.0 Then maximizeRate = False minimizeRate = True End If ElseIf minimizeRate Then opacityRate = opacityRate - 0.025 If opacityRate < 0 Then opacityRate = 0 End If Me.Opacity = opacityRate If Opacity <= 0.0 Then minimizeRate = False maximizeRate = False End If Else timerSplash.Stop() timerSplash.Enabled = False timerSplash.Dispose() Me.Visible = False Dim Login As New F_Login Login.Show() End If
Maksud dari sintaks diatas adalah, nilai opacityRate akan bertambah 0.025 perdetiknya, dan akan mengakibatkan form startup akan mulai kelihatan seiring dengan bertambahnya 60
opacityrate. Jika nilai opacity sudah lebih besa dari 1 (form kembali normal), maka secara perlahan (perdetik) nilai opacityrate akan dikurangi 0.025. dan jika nilai opacityrate sudah kembali menjadi 0, maka form login akan tampil. Sebelum menjalankan program terlebih dahulu kita ubah Startup dari project ini (form mana yang akan tampil terlebih dahulu). Klik Project > DVD Rental Properties. Klik Application lalu pada Startup Form pilih StartUp.
Gambar 4.14
Sekarang jalankan program dengan menekan F5.
Gambar 4.15 61
Gambar 4.16 Setelah berhasil membuat form startup, maka selanjutnya adalah membuat login user. Terlebih dahulu adalah dengan memindahkan file MS Access (DVD.accdb) kedalam project (~>DVD Rental\DVD Rental\bin\Debug). Lalu pada jendela project klik Project > DVD Rental properties, klik setting dan isikan datadata berikut Name : DVDConnection, Type : Connection String, Scope : Application. Dan
untuk
Value
:
Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=|DataDirectory|\dvd.accdb Dan tambahkan sebuah form pada project dan ubah propertiesnya seperti dibawah. Name
F_Main
ShowInTaksbar
True
Text
Main Neu
StartPosition
CenterScreen
FormBorderStyle
FixedSingle
Lalu tambahkan control menuStrip , tambahkan menuItem dan ubah properties nya seperti dibawah seperti dibawah. Text
Tag
&File
M1 &Logout
M1-01
E&xit
M1-02
&Data
M2 DVD
M2-01 62
Add
M2-01-01
Edit
M2-01-02
DVD List
M2-01-03
Customer
M2-02 Add
M2-02-01
Edit
M2-02-02
Customer List
M2-02-03
Group
M2-03
Genre
M2-04
&Tools
M3 Rental
M3-01
Return
M3-02
&Report
M4 Return
M4-01
Rental
M4-02
Rekap
M4-03
&Utility
M5 Users
M5-01 Add
M5-01-01
Edit
M5-01-02
User List
M5-01-03
Change Password
M5-02
Form Access
M5-03
&Help
M6 About
M6-01
Sehingga memilki susunan MenuItem seperti gambar dibawah.
63
Gambar 4.17 Tambahkan control StatusStrip, lalu pada properties Items klik button (…) maka akan tampil jendela ItemCollectionEditor. Pada combobox select item, pilih Statuslabel, lalu klik button Add. Lakukan sebanyak 3 kali. Dan ubah properties Name StatusLabel menjadi ToolName, ToolRole dan ToolTime. Lalu klik button OK. Sebelumnya penulis akan menunjukkan design dari Form Utama (F_Main) ini, agar memudahkan dalam pemberian ilustrasi untuk pengaturan control pada form.
Gambar 4.18
64
Tambahkan sebuah control SplitContainer pada form, dengan control ini form akan terbagi menjadi bagian yaitu SplitContainer.Panel1 dan SplitContainer.Panel2. dan ubah properties BorderStyle : FixedSingle dan dock : Fill. Tambah sebuah control panel, dan letakkan kedalam
SplitContainer.Panel1.
Dan
ubah
properties
panel
tersebut,
Name
:
pnlNavigationBackground, Dock : Fill, BackColor : White. Lalu tambahkan sebuah Panel kembali dan letakkan kedalam pnlNavigationBackground. Dan ubah propertiesnya. Name : pnlCurrentScreen , Dock : Top, BackColor : HighLight dan Text : Transaction. Lalu tambahkan sebuah panel dang anti propertiesnya, Name : pnlNavUsers, Dock : Bottom, BackColor : HighLight Selanjutnya Tambahkan sebuah Treeview dan letakkan kedalam pnlNavigationBackground. Ubah
ptopertiesnya .Name : TvTransaction, Dock : Fill.
Sehingga kita memiliki design form seperti gambar dibawah.
Gambar 4.18 Selanjutnya kita akan mengatur pada SplitContainer.Panel2. Tambahkan panel dan letakkan kedalam SplitContainer.Panel2. Dan ubah propertiesnya Name : pnlProjects, Dock : Fill dan BackColor : white. Lalu tambah panel dan letakkan kedalam pnlProjects dengan properties sebagai berikut Name : pnlProjectsTitle, Dock : Top, BackColor :HighLight dan Text : DVD
65
List. Dan tambahkan 1 Groupbox, 1 Label, 1TextBox dan 1 GridView letakkan pada pnlProjects. Dan ubah propertiesnya seperti dibawah. GroupBox1 Text
Search criteria
Textbox1 Name
txtSearch
Label1 Text
Title
DataGridView1 Name
DgView
Dan atur letaknya seperti pada gambar dibawah.
Gambar 4.19 Masih pada jendela F_Main tekan F8 untuk masuk jendela code, sebelumnya import NameSpace OleDB dengan cara ketikkan sintaks berikut pada baris paling atas Class. Imports System.Data.OleDb
66
Lalu ketikan sintaks berikut, yang berfungsi untuk membuat Node pada TreeView secara otomatis, dimana MenuItem menjadi referensi nya. (Sintaks ini di ambil dari blog mas Rully,MVP www.yulianmf.com) #Region "PopulateTree" Private Sub AddMenuToTree(ByVal YourNodeTree As TreeNode, ByVal YourToolStripMenuItem As ToolStripMenuItem) '//cek apakah toolstripmenuitem tsb mempunyai sub menuitem '//yang merupakan DropDownItem : If YourToolStripMenuItem.DropDownItems.Count > 0 Then '//jika ada sub menu item, iterate : For i As Int32 = 0 To YourToolStripMenuItem.DropDownItems.Count - 1 '//jika sub menu itemnya bukan merupakan toolstripmenuitem (bisa saja '//merupakan toolstripseparator) maka item tsb tdk ditambahkan ke treeview : If Not (TypeOf YourToolStripMenuItem.DropDownItems(i) Is ToolStripMenuItem) OrElse YourToolStripMenuItem.DropDownItems(i).Tag = "" Then Continue For Dim currentItem As ToolStripMenuItem = YourToolStripMenuItem.DropDownItems(i) Dim aNode As New TreeNode(Replace(currentItem.Text.ToString, "&", "")) aNode.Tag = currentItem.Tag.ToString YourNodeTree.Nodes.Add(aNode) '//cek jika ada sub menu item lagi dengan method recursive AddMenuToTree(aNode, currentItem) Next End If End Sub
Private Sub PopulateToolStripMenuItem(ByVal YourMainMenuStrip As MenuStrip) '//iterate toolstripmenuitem yang ada di MainMenuStrip : For Each aItem As ToolStripMenuItem In YourMainMenuStrip.Items If aItem.Visible = False Then Continue For '//buat node baru utk ditambahkan ke treeview node : Dim aNode As New TreeNode(Replace(aItem.Text.ToString, "&", "")) aNode.Tag = aItem.Tag.ToString TvTransaction.Nodes.Add(aNode) '//tambahkan node baru ke treeview jika '//node tersebut memiliki node child (DropDownItem): AddMenuToTree(aNode, aItem) Next TvTransaction.ExpandAll() TvTransaction.SelectedNode = TvTransaction.Nodes(0) End Sub #End Region
67
Lalu pada event handler F_Main_Load, ketikkan sintaks berikut. Try PopulateToolStripMenuItem(MenuStrip1) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Selanjutnya sebelum masuk ke F_Login, terlebih dahulu adalah membuat beberapa Class yang dibutuhkan. Pertama Tambahkan sebuah folder pada project dan ubah namanya menjadi Entity. Dan tambahkan 2 buah class pada folder tersebut masing-masing Role.Vb dan Users.vb. buka class Role dan ketikkan sintaks berikut. Namespace Entity Public Class Role Private m_roleid As Int16 Public Property RoleID() As Int16 Get Return m_roleid End Get
Set(ByVal value As Int16) If value.ToString = "" Then Throw New Exception("Masukkan RoleID") End If m_roleid = value End Set End Property Public Property RoleName() As String End Class End Namespace
Dan pada class Users ketikkan sintaks berikut : Namespace Entity Public Class Users Private m_username As String Public Property Username() As String Get Return m_username End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan username") End If m_username = value End Set End Property
68
Private m_password As String Public Property Password() As String Get Return m_password End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan Password") End If m_password = value End Set End Property
Private m_firstname As String Public Property First_Name() As String Get Return m_firstname End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan First Name") End If m_firstname = value End Set End Property Public Property Last_Name() As String Public Property Role As New Entity.Role Public Property Actived() As Boolean End Class End Namespace
Sebagai catatan bahwa Class yang berada dalam folder entity merupakan representasi dari Table, dan masuk kedalam NameSpace Entity. Tambahkan sebuah Folder dalam project dan ubah namanya menjadi “AccessData”. Selanjutnya adalah tambahkan sebuah Module pada folder AccessData dan ubah namanya menjadi DVDModule.vb, ketikkan sintaks berikut untuk mengimport NameSpace yang dibutuhkan pada Module. Imports Imports Imports Imports
System.Data System.Data.OleDb System.Collections.Generic System.Runtime.CompilerServices
Lalu membuat Public Variable seperti dibawah.
69
Public Operate, FormShow, UserName, Password, RoleID As String
Dan buat Extension Method untuk Class User dan Role seperti dibawah. Sub Add(ByVal UserList As List(Of Entity.Users), ByVal Username As String, ByVal Password As String, ByVal First_Name As String, ByVal Last_Name As String, ByVal Actived As Boolean, ByVal RoleID As Int16, ByVal RoleName As String) UserList.Add(New Entity.Users With {.Username = Username, .Password = Password, .First_Name = First_Name, .Last_Name = Last_Name, .Actived = Actived, .Role = New Entity.Role With {.RoleID = RoleID, .RoleName = RoleName}}) End Sub
Sub Add(ByVal RoleList As List(Of Entity.Role), ByVal RoleID As String, ByVal RoleName As String) RoleList.Add(New Entity.Role With {.RoleID = RoleID, .RoleName = RoleName}) End Sub
Tambahkan Class pada folder AccessData, dan ganti namanya menjadi AccessUser. Pada Class yang ada pada folder AccessData merupakan class yang menyimpan fungsi-fungsi seperti Insert,Delete dan lain-lain. Class-class ini masuk kedalam NameSpace AccessData. Ketikkan sintaks berikut yang digunakan untuk proses Login nantinya. Imports System.Data Imports System.Data.OleDb Namespace AccessData Public Class AccessUse Public Function Login(ByVal username As String) As List(Of Entity.Users) Dim User As New List(Of Entity.Users)() Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_selectlogin", connect) mycommand.CommandType = CommandType.StoredProcedure mycommand.Parameters.Add("@username", OleDbType.VarChar).Value = username connect.Open() Using rdr As OleDbDataReader = mycommand.ExecuteReader
70
While rdr.Read User.Add(rdr("username").ToString(), rdr("Password").ToString(), rdr("First_Name").ToString(), rdr("Last_Name").ToString(), rdr("Actived"), rdr("RoleID").ToString(), rdr("RoleName").ToString()) End While
End Using End Using End Using Catch sqlex As OleDbException Throw New Exception(sqlex.Message.ToString()) End Try Return User End Function End Class End Namespace
Selanjutnya buka MS Access (DVD.accdb) dan buat query dengan nama “usp_selectlogin” dengan SQL sebagai berikut. SELECT T_User.*, T_Role.RoleName FROM T_Role INNER JOIN T_User ON T_Role.RoleID=T_User.RoleID WHERE (((T_User.UserName)=[@username]));
Buka F_Login, klik ganda button Cancel lalu ketikkan sintaks berikut. End Jika user meng-klik button cancel ini makan aplikasi ini akan ditutup. Selanjutnya klik ganda button OK, dan ketikkan sintaks berikut.
71
Try Dim AccessUser As New AccessData.AccessUser Dim user As New Entity.Users user.Username = txtUser.Text user.Password = txtPassword.Text Dim list As List(Of Entity.Users) = AccessUser.Login(txtUser.Text) 'jika isi list kosong If list.Count = 0 Then MsgBox("Username Salah", MsgBoxStyle.Information, "DVD Rental") txtUser.Focus() txtUser.SelectAll() Exit Sub End If
UserName = list.First.Username Password = list.First.Password If txtPassword.Text <> Password Then MsgBox("Password Salah", MsgBoxStyle.Information, "DVD Rental") txtPassword.Focus() txtPassword.SelectAll() Exit Sub End If If list.First.Actived = False Then MsgBox("User sudah tidak aktif", MsgBoxStyle.Information, "DVD Rental") txtUser.Focus() txtUser.SelectAll() Exit Sub End If RoleID = list.First.Role.RoleID Password = list.First.Password Me.Close() Me.Dispose() Dim f_utama As New F_Main f_utama.ToolName.Text = list.First.First_Name & If(list.First.Last_Name = "", "", " " & list.First.Last_Name) f_utama.ToolRole.Text = list.First.Role.RoleName f_utama.ToolTime.Text = Now.Date f_utama.Show() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Pada saat user melakukan login, maka aplikasi ini akan mengecek dengan cara melakukan pencarian data user berdasarkan username yang dimasukkan. Lalu akan disimpan kedalam Generic List of Class. Jika isi dari List ini kosong makan username salah, selanjutnya mengecek password yang dimasukkan, apakah sama dengan hasil pencarian, jika tidak sama aka nada pesan
72
error nya. Dan mengecek apakah user tersebut masih aktif atau tidak. Buat event handler txtPassword_Keyup dan ketikkan sintaks berikut yang berfungsi jika user menekan Enter pada text box Password makan proses pada button login akan di jalankan. If e.KeyCode = Keys.Enter Then btnLogin.PerformClick() End If
Pada F_Main buat event handler F_Main_Closing dan Menu Item File > Exit ketikkan End. Dan pada Menu Item File > Logout ketikkan sintaks berikut, untuk menampilkan form login. Me.Dispose() My.Forms.F_Login.Show()
Jalankan Program dengan menekan F5 lalu login dengan username : administrator dan password : password.
Gambar 4.20
Gambar 4.21 73
Jika pembaca dengan benar mengikuti langkah-langkah diatas, maka akan mendapatkan hasil seperti gambar diatas. Yaitu TreeView secara otomatis akan menggenerate Node sesuai dengan MenuItem diatas. Selanjutnya adalah membuat Form Access yang dimana berfungsi untuk memberi hak akses suatu Role Menu apa saja yang bias di akses oleh role tersebut. Ikuti Langkah-langkah dibawah. Buat Query pada DVD.accdb seperti berikut usp_SelectRole, usp_SelectMenuRole, usp_DeleteRoleMenu dan usp_InsertRoleMenu. Dengan sintaks SQL sebagai berikut : SELECT T_Role.RoleID, T_Role.RoleName FROM T_Role ORDER BY T_Role.RoleID;
SELECT T_Menu.MenuID, T_Menu.MenuName, T_RoleMenu.RoleID FROM T_Menu INNER JOIN T_RoleMenu ON T_Menu.MenuID = T_RoleMenu.MenuID WHERE (((T_RoleMenu.RoleID)=[@RoleID]));
DELETE * FROM T_RoleMenu WHERE (((T_RoleMenu.RoleID)=[@RoleID]));
INSERT INTO T_RoleMenu ( RoleId, MenuID ) VALUES ([@RoleId], [MenuId]);
Buka Class AccessUser, kita akan membuat fungsi untuk mengahapus dan manambah data pada table T_MenuRole, seperti dibawah.
74
Public Function DeleteRoleMenu(ByVal MenuRole As Entity.MenuRole) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_DeleteRoleMenu", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterRoleID As OleDbParameter = New OleDbParameter("@RoleID", OleDbType.Integer) parameterRoleID.Value = MenuRole.Role.RoleID With mycommand.Parameters .Add(parameterRoleID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function Public Function InsertRoleMenu(ByVal MenuRole As Entity.MenuRole) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertRoleMenu", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterRoleID As OleDbParameter = New OleDbParameter("@RoleID", OleDbType.Integer) parameterRoleID.Value = MenuRole.Role.RoleID Dim parameterMenuID As OleDbParameter = New OleDbParameter("@MenuID", OleDbType.VarChar, 10) parameterMenuID.Value = MenuRole.Menu.MenuID
With mycommand.Parameters .Add(parameterRoleID) .Add(parameterMenuID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
75
Buka DVDModule.vb dan ketikkan sintaks dibawah. #Region "Process" Public Function GetLeftRightItemFromControl(ByVal Teks As String) As String() '//cari item kiri dari teks Dim intPanjangString As Integer Dim intPosisiDash As Integer intPanjangString = Strings.Len(Teks) intPosisiDash = Teks.IndexOf(">") Dim strID As String = Trim(Strings.Left(Teks, intPosisiDash - 1)) Dim strNama As String = Trim(Strings.Mid(Teks, intPosisiDash + 2, intPanjangString - intPosisiDash + 2)) Dim arrString As String() = {strID, strNama} Return arrString End Function Public Sub AddParameter(ByVal Name As String, ByVal Type As OleDbType, _ ByVal Size As Integer, ByVal Value As Object, ByVal myCommand As OleDbCommand) Try myCommand.Parameters.Add(Name, Type, Size).Value = Value Catch OleDbExceptionErr As OleDbException Throw New System.Exception(OleDbExceptionErr.Message, _ OleDbExceptionErr.InnerException) End Try End Sub #End Region
Pada fungsi GetLeftRightItemFromControl berfungsi untuk mengambil text setelah tanda “>”. Dimana kita gunakan ini untuk mengambil RoleID pada Form Access yang akan kita buat nantinya. Sedangkan AddParameter berfungsi untuk membantu dalam pembuatan Paramater dinamis untuk suatu fungsi. Selanjutnya kita akan membuat method dimana akan membantu kita dalam mencari suatu data dan dimasukkan kedalam Generic List. Biasanya kita selalu membuat suatu method untuk mencari data tertentu. Dengan method dibawah ini kita tidak perlu lagi membuat secara satupersatu, sehingga ini sangat memudahkan kita dalam membuat program. Untuk method dibawah ini hanya berfungsi untuk mencari data yang berdiri sendiri atau tidak berelasi dengan yang lain. Ketikkan sintaks dibawah ini.
76
#Region "Fill" Private Sub Fill(Of T)(ByVal reader As IDataReader, ByVal list As IList(Of T), _ ByVal type As Type, ByVal fields As String()) Dim index As Integer = 0 ' run the reader While reader.Read() ' create an instance of the type Dim item As T = DirectCast(Activator.CreateInstance(type), T) ' get all the properties of the type Dim properties As Reflection.PropertyInfo() = DirectCast(item.GetType(), Type).GetProperties() 'Dim MyType As Type = type.GetType("Myproperty") If fields.Length <> 0 Then For j As Integer = 0 To fields.Length - 1 ' get the index of the property index = FindProperyIndexByColumnName(fields(j), properties) ' set the value of the property ' properties(index).GetAccessors( If index <> -1 Then properties(index).SetValue(item, If(reader(fields(j)).ToString = "", "", reader(fields(j))), Nothing) End If Next Else For i As Integer = 0 To reader.FieldCount - 1 index = FindProperyIndexByColumnName(reader.GetName(i), properties) Dim a, b As String a = reader(reader.GetName(i)).ToString b = "" If index <> -1 Then properties(index).SetValue(item, If(reader(reader.GetName(i)).ToString = "", "", reader(reader.GetName(i))), Nothing) End If
Next End If ' add the item to the list list.Add(item) End While
End Sub
77
Private Function FindProperyIndexByColumnName(ByVal columnName As String, ByVal prop As Reflection.PropertyInfo()) As Integer Dim index As Integer = -1 For i As Integer = 0 To prop.Length - 1 If UCase(prop(i).Name) = UCase(columnName) Then index = i Exit For End If Next Return index End Function
Public Sub FillListWithParam(Of T)(ByVal list As IList(Of T), ByVal fields As String(), ByVal Query As String, ByVal type As Type, ByVal Name As String(), ByVal OleType As OleDbType(), ByVal Size As Integer(), ByVal Value As Object()) Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand(Query, connect) mycommand.CommandType = CommandType.StoredProcedure If Name.Length > 0 Then For i = 0 To Name.Length - 1 DVDModule.AddParameter(Name(i), OleType(i), Size(i), Value(i), mycommand) Next End If connect.Open() Using reader As OleDbDataReader = mycommand.ExecuteReader() Fill(reader, list, type, fields) End Using End Using End Using End Sub
Public Sub FillListWithoutParam(Of T)(ByVal list As IList(Of T), ByVal fields As String(), ByVal Query As String, ByVal type As Type) Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand(Query, connect) mycommand.CommandType = CommandType.StoredProcedure connect.Open() Using reader As OleDbDataReader = mycommand.ExecuteReader() Fill(reader, list, type, fields) End Using End Using End Using End Sub #End Region
78
Untuk penggunaan method akan di jelaskan dibawah. Selanjutnya tambahkan sebuah Form pada project dan ubah properties nya seperti dibawah. (Form ini diambil dari blog mas rully). Name
F_FormAccess
ShowInTaksbar
False
Text
Form Access
StartPosition
CenterScreen
MaximizeBox
False
MinimizeBox
False
FormBorderStyle
FixedSingle
BackColor
White
Tambahkan sebuah Panel kedalam form dan ubah properties Dock : Fill dan BackColor : White. Lalu tarik sebuah panel lagi dan ubah propertiesnya Dock : Left, BackColor : white , Name : pnlLeft. Tambahkan 2 Groupbox, 2 RadioButton, 1 Button, 1 ListBox. Dan ubah properties seperti dibawah. GroupBox1 Text GroupBox2 Text
Roles
RadioButon1 Text
Unchecked All Node
Name
rbUncheckedAll
Checked
True
RadioButon2 Text
Checked All Node
Name
rbCheckedAll
Checked
False
ListBox1 Name
LstRoles
Button1
79
Name
btnUpdate
Text
Update
Dan atur posisi control-control diatas seperti gambar dibawah.
Gambar 4.22 Selanjutnya tambahkan control ImageList, dan pada properties Images klik button browse (..) lalu Add sebuah image yang diinginkan (ukuran 16 x 16). Lalu tambahkan sebuah TreeView dan ubah properties Name : tvUserRights, CheckBoxes : True, ImageList : ImageList1 dan ImageIndex : 0, SelectedImageIndex : 0. Lalu letakkan pada Panel1 sesuai dengan gambar dibawah.
Gambar 4.23 Buatlah variable Class seperti dibawah. Dim AccessUser As New AccessData.AccessUser Dim columns As String() = {}
80
Ketikkan sintaks berikut yang berfungsi untuk generate Node pada TreeView yang mengambil data dari MenuItem pada F_Main. Private Sub AddMenuToTree(ByVal YourNodeTree As TreeNode, ByVal YourToolStripMenuItem As ToolStripMenuItem) '//cek apakah toolstripmenuitem tsb mempunyai sub menuitem '//yang merupakan DropDownItem : If YourToolStripMenuItem.DropDownItems.Count > 0 Then '//jika ada sub menu item, iterate : For i As Int32 = 0 To YourToolStripMenuItem.DropDownItems.Count - 1 '//jika sub menu itemnya bukan merupakan toolstripmenuitem (bisa saja '//merupakan toolstripseparator) maka item tsb tdk ditambahkan ke treeview : If Not (TypeOf YourToolStripMenuItem.DropDownItems(i) Is ToolStripMenuItem) Then Continue For Dim currentItem As ToolStripMenuItem = YourToolStripMenuItem.DropDownItems(i) Dim aNode As New TreeNode(Replace(currentItem.Text.ToString, "&", "")) aNode.Tag = currentItem.Tag.ToString YourNodeTree.Nodes.Add(aNode) '//cek jika ada sub menu item lagi dengan method recursive AddMenuToTree(aNode, currentItem) Next End If End Sub Private Sub PopulateToolStripMenuItem(ByVal YourMainMenuStrip As MenuStrip) ' daFormActions.Fill(dsFormActions, "formActions") '//iterate toolstripmenuitem yang ada di MainMenuStrip : For Each aItem As ToolStripMenuItem In YourMainMenuStrip.Items '//buat node baru utk ditambahkan ke treeview node : Dim aNode As New TreeNode(Replace(aItem.Text.ToString, "&", "")) aNode.Tag = aItem.Tag.ToString tvUserRights.Nodes.Add(aNode) '//tambahkan node baru ke treeview jika '//node tersebut memiliki node child (DropDownItem): AddMenuToTree(aNode, aItem) Next tvUserRights.ExpandAll() tvUserRights.SelectedNode = tvUserRights.Nodes(0) End Sub
Dan selanjutnya adalah membuat procedure untuk mengambil data pada table T_Role dan dimasukkan kedalam LstRoles. Pada procedure ini kita akan
menggunakan method pada
DVDModule yang telah kita buat sebelumnya. Private Sub PopulateRolesToListBox() lstRoles.Items.Clear() Dim RoleList As New List(Of Entity.Role) DVDModule.FillListWithoutParam(RoleList, columns, "usp_SelectRole", _ GetType(Entity.Role)) For Each items In RoleList lstRoles.Items.Add(items.RoleID & " > " & items.RoleName) Next End Sub
81
Dengan menggunakan method pada DVDModule akan mempermudah kita dalam membuat aplikasi ini. Kita tidak perlu lagi membuat satu-persatu fungsi untuk mengambil data, hanya cukup dengan memanggil method FillListWithoutParam (pencarian tanpa parameter) dan FilllistWithParam (pencarian dengan parameter), yang akan kita gunakan pada form-form berikut nya. Selanjutnya pada event handler F_FormAccess_Load ketikkan sintaks dibawah. Try PopulateToolStripMenuItem(My.Forms.F_Main.MenuStrip1) PopulateRolesToListBox() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Lalu buka F_Main (Main Menu), klik menu item Utility > Form Access, dan ketikkan sintaks dibawah. Try Dim frm_access As New F_FormAccess frm_access.ShowDialog() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Buatlah event handler TvTransaction_DoubleClick, dan ketikkan sintaks dibawah, yang berfungsi untuk memanggil event handler click pada MenuItem. Sebagai contoh, jika pengguna meng-klik text Group pada TreeView maka secara otomatis program akan memanggil event handler cick untuk Menu Item Group. Try For Each aItem As ToolStripMenuItem In MenuStrip1.Items Dim str As String = TvTransaction.SelectedNode.Tag.ToString If aItem.DropDownItems.Count > 0 Then For i As Int32 = 0 To aItem.DropDownItems.Count - 1 If Not (TypeOf aItem.DropDownItems(i) Is ToolStripMenuItem) Then Continue For Dim currentItem As ToolStripMenuItem = aItem.DropDownItems(i) If str = currentItem.Tag.ToString Then currentItem.PerformClick() Exit Sub Else If currentItem.DropDownItems.Count > 0 Then For x As Int32 = 0 To currentItem.DropDownItems.Count 1 If Not (TypeOf currentItem.DropDownItems(x) Is ToolStripMenuItem) Then Continue For
82
Dim currentItem2 As ToolStripMenuItem = currentItem.DropDownItems(x) If str = currentItem2.Tag.ToString Then currentItem2.PerformClick() Exit Sub End If Next End If End If Next End If Next Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Dan jalankan program, pada Main Menu double click text Form Access, maka Form Access akan muncul seperti gambar dibawah ini.
Gambar 4.24 Selanjutnya buatlah procedure untuk mengaktifkan atau non aktifkan checkbox pada node, dengan sintaks seperti dibawah. Private Sub CheckedTreeNode(ByVal Checked As Boolean) Dim IEnum As IEnumerator = Me.tvUserRights.Nodes.GetEnumerator While IEnum.MoveNext Dim aNode As TreeNode = DirectCast(IEnum.Current, TreeNode) aNode.Checked = Checked AddRecursiveNode(aNode, Checked) End While End Sub
83
Private Sub AddRecursiveNode(ByVal NodeRef As TreeNode, ByVal Checked As Boolean) For Each aNode As TreeNode In NodeRef.Nodes aNode.Checked = Checked AddRecursiveNode(aNode, Checked) Next End Sub
Dan ketikkan sintaks berikut untuk menggunakan procedure diatas. Private Sub CheckhedRadioButton(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbUncheckedAll.CheckedChanged, rbCheckedAll.CheckedChanged Select Case sender.name.ToString.ToUpper Case "RBCHECKEDALL" CheckedTreeNode(True) Case "RBUNCHECKEDALL" CheckedTreeNode(False) End Select End Sub
Jalankan program lalu masuk kedalam Form Access, lalu coba klik Radio Button Checked dan UnChecked apakah berfungsi, jika di klik Radio Button checked maka seluruh check box pada Node akan aktif, dan sebaliknya untuk UnChecked. Selanjutnya adalah kita akan membuat proses dimana jika Role pada list di klik maka hak akses pada suatu role akan di tampilkan pada TreeView dengan tanda checkbox akan aktif. Pertamatama adalah dengan mengimports name space OleDB seperti dibawah. Imports System.Data.OleDb
Dan ketikkan procedure untuk mengambil data pada table T_MenuRole dengan criteria RoleID. Private Sub PopulateRoleDetails(ByVal RoleIDs As String) Dim mydata As New DataSet Using connect As New OleDbConnection(My.Settings.DVDConnection) Using ObjCommand As New OleDbCommand("usp_SelectMenuRole", connect) ObjCommand.CommandType = CommandType.StoredProcedure ObjCommand.Parameters.Add("@RoleID", OleDbType.Integer).Value = RoleIDs Using objDataAdapter As New OleDbDataAdapter objDataAdapter.SelectCommand = ObjCommand objDataAdapter.Fill(mydata, "data") End Using End Using End Using If mydata.Tables("data").Rows.Count = 0 Then For Each aNode As TreeNode In tvUserRights.Nodes aNode.Checked = False AddRecursiveNode(aNode, False) Next
84
Else PopulateItemCheckedToTheTree(mydata.Tables("data").DefaultView) End If End Sub Private Sub PopulateItemCheckedToTheTree(ByVal YourView As DataView) Dim IEnum As IEnumerator = Me.tvUserRights.Nodes.GetEnumerator Private Sub PopulateItemCheckedToTheTree(ByVal YourView As DataView) While IEnum.MoveNext Dim IEnum As IEnumerator = Me.tvUserRights.Nodes.GetEnumerator Dim aNode As TreeNode = DirectCast(IEnum.Current, TreeNode) While IEnum.MoveNext YourView.RowFilter = "MenuID = '" & aNode.Tag.ToString & "'" Dim aNode As TreeNode = DirectCast(IEnum.Current, TreeNode) If YourView.Count > 0 Then YourView.RowFilter = "MenuID = '" & aNode.Tag.ToString & "'" aNode.Checked = True If YourView.Count > 0 Then Else aNode.Checked = True aNode.Checked = False Else End If aNode.Checked = False AddRecursiveNodeTree(YourView, aNode) End If End While AddRecursiveNodeTree(YourView, aNode) End Sub End While End Sub Private Sub AddRecursiveNodeTree(ByVal YourView As DataView, ByVal NodeRef As TreeNode) Private Sub AddRecursiveNodeTree(ByVal YourView As DataView, ByVal NodeRef As For Each aNode As TreeNode In NodeRef.Nodes TreeNode) YourView.RowFilter = "MenuID = '" & aNode.Tag.ToString & "'" For Each aNode As TreeNode In NodeRef.Nodes If YourView.Count > 0 Then YourView.RowFilter = "MenuID = '" & aNode.Tag.ToString & "'" aNode.Checked = True If YourView.Count > 0 Then Else aNode.Checked = True aNode.Checked = False Else End If aNode.Checked = False AddRecursiveNodeTree(YourView, aNode) End If Next AddRecursiveNodeTree(YourView, aNode) End Sub Next End Sub
Lalu klik ganda LstRoles dan ketikkan sintaks dibawah. Try If lstRoles.SelectedIndex <> -1 Then Dim arrItems As String() = DVDModule.GetLeftRightItemFromControl(lstRoles.SelectedItem.ToString) PopulateRoleDetails(arrItems(0)) End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Sintaks diatas berfungsi untuk memanggil proses PopulateRoleDetails dengan kriteria Role yang di klik pada LstRoles, dengan menggunakan fungsi GetLeftRightItemFromControl yang telah kita buat sebelumnya pada DVDModule. Dan jalankan program, lalu pada Form Access klik Role pada LstRoles, jika pada saat pembaca klik Role Admin maka checkbox pada Node akan aktif semua, tapi jika Role yang lain maka tidak aktif, dikarenakan kita belum memasukkan data 85
kedalam table. Dan sekarang kita lanjutkan untuk menginput data pada table, dengan cara mengaktifkan Checkbox pada Node di TreeView. Ketikkan sintaks dibawah ini. Private Sub InsertItemCheckedOnTheTreeToDatabase(ByVal RoleID As String, ByVal RoleName As String) Dim IEnum As IEnumerator = Me.tvUserRights.Nodes.GetEnumerator While IEnum.MoveNext Dim aNode As TreeNode = DirectCast(IEnum.Current, TreeNode) '//insert ke tabel RoleDetails (RoleID, MenuName, FormAction, Tag) : If aNode.Checked Then Dim MenuRole As New Entity.MenuRole MenuRole.Role.RoleID = RoleID MenuRole.Menu.MenuID = aNode.Tag.ToString AccessUser.InsertRoleMenu(MenuRole) AddRecursiveTreeNode(RoleID, aNode) End If End While End Sub Private Sub AddRecursiveTreeNode(ByVal RoleID As String, ByVal NodeRef As TreeNode) For Each aNode As TreeNode In NodeRef.Nodes '//insert ke tabel RoleDetails (RoleID, MenuName, FormAction, Tag) : If aNode.Checked Then Dim MenuRole As New Entity.MenuRole MenuRole.Role.RoleID = RoleID MenuRole.Menu.MenuID = aNode.Tag.ToString AccessUser.InsertRoleMenu(MenuRole) End If AddRecursiveTreeNode(RoleID, aNode) Next End Sub
Klik ganda button Update dan ketikkan sintaks berikut : Try If lstRoles.SelectedIndex = -1 Then MsgBox("Pilih dahulu RoleID yang akan diupdate dari List Roles", MsgBoxStyle.Information, "DVD Rental") Exit Sub Else Dim arrItems As String() = DVDModule.GetLeftRightItemFromControl(lstRoles.SelectedItem.ToString) Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then Dim MenuRole As New Entity.MenuRole MenuRole.Role.RoleID = arrItems(0) AccessUser.DeleteRoleMenu(MenuRole) InsertItemCheckedOnTheTreeToDatabase(arrItems(0), arrItems(1)) lstRoles.SelectedIndex = -1 End If End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
86
Buka F_Main (Main Menu), lalu ketikkan sintaks berikut, yang berfungsi untuk menampilkan Menu Item sesuai dengan hak akses yang diberikan, pada Form Access. #Region "PopulateMenu" Private Sub PopulateRoleDetails() Dim mydata As New DataSet Using connect As New OleDbConnection(My.Settings.DVDConnection) Using ObjCommand As New OleDbCommand("usp_SelectMenuRole", connect) ObjCommand.CommandType = CommandType.StoredProcedure ObjCommand.Parameters.Add("@RoleID", OleDbType.Integer).Value = RoleID Using objDataAdapter As New OleDbDataAdapter objDataAdapter.SelectCommand = ObjCommand objDataAdapter.Fill(mydata, "data") End Using End Using End Using CreateMenu(mydata.Tables("data").DefaultView) End Sub Private Sub CreateMenu(ByVal dtView As DataView) Dim Num As IEnumerator = MenuStrip1.Items.GetEnumerator While Num.MoveNext Dim ToolMenu As ToolStripMenuItem = DirectCast(Num.Current, ToolStripMenuItem) dtView.RowFilter = "MenuID = '" & ToolMenu.Tag.ToString & "'" If dtView.Count > 0 Then ToolMenu.Visible = True Else ToolMenu.Visible = False End If CreateMenuItem(dtView, ToolMenu) End While End Sub Private Sub CreateMenuItem(ByVal dtView As DataView, ByVal ToolMenu As ToolStripMenuItem) For i As Integer = 0 To ToolMenu.DropDownItems.Count - 1 If Not (TypeOf ToolMenu.DropDownItems(i) Is ToolStripMenuItem) Then Continue For dtView.RowFilter = "MenuID = '" & ToolMenu.DropDownItems(i).Tag.ToString & "'" If dtView.Count > 0 Then ToolMenu.DropDownItems(i).Visible = True Else ToolMenu.DropDownItems(i).Visible = False ToolMenu.DropDownItems(i).Tag = "" End If CreateMenuItem(dtView, ToolMenu.DropDownItems(i)) Next End Sub #End Region
87
Lalu aktifkan F_Main dan pada event handler F_Main_Load tambahkan sintaks berikut PopulateRoleDetails()
Pada Ms Access (DVD.accdb) buka T_User, lalu masukkan data seperti dibawah. Username : anam, Password: 123, First Name : Khoirul, Last Name : Anam, RoleID : 4 dan Actived = True (Yes). Selanjutnya jalankan program (gunakan user administrator), lalu klik Role Kasir dan aktifkan checkbox pada TreeView seperti gambar dibawah, lalu klik button update. Lalu Logout dan login menggunakan username : anam (seperti diatas), maka tampilan pada Main Menu akan seperti gambar dibawah.
Gambar 4.25
88
Gambar 4.26 Pada setiap aplikasi umumnya selalu menyediakan fasilitas untuk mengubah password, untuk mengantisipasi jika password dari pengguna telah di ketahui oleh orang lain. Untuk aplikasi yang kita buat ini kita juga akan meneyediakan fasilitas ini. Ikuti langkah-langkah dibawah ini untuk membuat form ubah password. Tambahkan sebuah form pada project dan ubah properties nya seperti dibawah. Name
F_Change
ShowInTaksbar
False
Text
Form Access
StartPosition
CenterScreen
ControlBox
False
FormBorderStyle
FixedSingle
BackColor
White
Dan tambahkan 3 textbox, 3 label dan 2 button lalu ubah masing-masing control seperti dibawah. TextBox1 Name
txtOld
89
TextBox2 Name
txtNew
TextBox3 Name
txtConfirm
Button1 Text
Save
Name
btnSave
Button2 Text
Close
Name
btnCancel
Buka MS Access (DVD.accdb) lalu buat Query dengan namanya “usp_changepassword” dan dengan sintaks SQL nya seperti dibawah. UPDATE T_User SET T_User.[Password] = [@password]
WHERE (((T_User.UserName)=[@Username]));
Lalu pada project kita buka AccessUser dan ketikkan sintaks berikut untuk mengubah password pengguna. Public Function ChangePassword(ByVal User As Entity.Users) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_changepassword", connect) mycommand.CommandType = CommandType.StoredProcedure
Dim parameterPassword As OleDbParameter = New OleDbParameter("@Password", OleDbType.VarChar, 15) parameterPassword.Value = User.Password Dim parameterUserName As OleDbParameter = New OleDbParameter("@genre_id", OleDbType.VarChar, 15) parameterUserName.Value = User.Username With mycommand.Parameters .Add(parameterPassword) .Add(parameterUserName) End With
90
connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Kembali ke F_Change, klik ganda button Close dan ketikkan sintaks berikut :Me.Close, Lalu klik ganda button OK dan ketikkan sintaks berikut. Try Dim AccessUser As New AccessData.AccessUser If txtOld.Text = "" Or txtNew.Text = "" Or txtConfirm.Text = "" Then MsgBox("Isi seluruh data terlebih dahulu", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If If Password <> txtOld.Text Then MsgBox("Password lama salah", MsgBoxStyle.Information, "DVD Rental") Exit Sub ElseIf txtNew.Text <> txtConfirm.Text Then MsgBox("Password baru dan confirm password tidak sama", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim User As New Entity.Users With {.Password = txtNew.Text, .Username = UserName}
AccessUser.ChangePassword(User) txtOld.Text = "" txtNew.Text = "" txtConfirm.Text = "" MsgBox("Ganti password sukses", MsgBoxStyle.Information, "DVD Rental") Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Pada sintaks diatas sebelum mengubah password terlebih dahulu aplikasi ini mengecek apakah password lama yang kita masukkan benar atau salah, ini untuk menjaga jika yang mengganti password adalah benar-benar pengguna yang benar. Lalu mengecek password baru dan konfirmasi apakah sama, ini untuk memastikan bahwa password yang dimasukkan emang benar. Lalu setelah itu dengan menggunakan fungsi ChangePassword aplikasi mengubah password 91
lama dengan yang baru. Buka F_Main dan pada MenuItem Utility > Change Password , klik ganda dan ketikkan sintaks dibawah. Try Dim frm_access As New F_FormAccess frm_access.ShowDialog() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Jalankan program dan masuk ke Form Change Password lalu ganti passwordnya.
Gambar 4.27 Setelah selesai membuat Form Change Password, maka selanjutnya kita akan membuat form untuk pengolahan data pengguna. Form ini berguna untuk memasukkan data pengguna baik lama atau baru. Tambahkan sebuah form dan ganti properties nya seperti dibawah: Name
F_User
ShowInTaksbar
False
Text
Form Access
StartPosition
CenterScreen
MaximizeBox
False
MinimizeBox
False
FormBorderStyle
FixedSingle
BackColor
White
Dan tambahkan 1 GroupBox, 4 TextBox, 5 Label, 1 comboBox, 1 Checkbox dan 2 button selanjutnya ganti properties seperti dibawah. 92
GroupBox1 Text
User Detail
TextBox1 Name
txtUser
TextBox2 Name
txtPassword
TextBox3 Name
txtfirst
TextBox4 Name
txtLast
ComboBox1 Name
cbRole
CheckBox1 Name
cbStatus
Button1 Name
btnSave
Text
&Save
Button2 Name
btnCancel
Text
&Cancel
Dan atur posisi control seperti gambar dibawah.
Gambar 4.28 93
Lalu pada DVD.accdb buat Query dengan nama masing-masing seperti berikut : usp_SelectUserList, usp_InsertUser, usp_UpdateUser. Dan dengan sintkas SQL seperti dibawah. SELECT T_User.username, T_User.actived, T_User.First_Name, T_User.Last_Name, T_User.RoleID FROM T_User;
INSERT INTO T_User ( UserName, [Password], First_Name, Last_Name, RoleID, Actived )
VALUES ([@UserName], [@Password], [@First_Name], [@Last_Name], [@RoleID], 1); UPDATE T_User SET T_User.[Password] = [@Password], T_User.First_Name = [@First_Name], T_User.Last_Name = [@Last_Name], T_User.RoleID = [@RoleID], T_User.Actived = [@Actived] WHERE (((T_User.UserName)=[@UserName]));
Dan selanjutnya kita akan membuat 2 fungsi untuk insert dan update user. Buka AccessUser dan ketikkan sintaks dibawah ini. Public Function UserInsert(ByVal User As Entity.Users) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertUser", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterUserName As OleDbParameter = New OleDbParameter("@UserName", OleDbType.VarChar, 15) parameterUserName.Value = User.Username Dim parameterPassword As OleDbParameter = New OleDbParameter("@Password", OleDbType.VarChar, 15) parameterPassword.Value = User.Password Dim parameterFirstName As OleDbParameter = New OleDbParameter("@first_name", OleDbType.VarChar, 50) parameterFirstName.Value = User.First_Name Dim parameterLastName As OleDbParameter = New OleDbParameter("@last_name", OleDbType.VarChar, 50) parameterLastName.Value = User.Last_Name Dim parameterRoleID As OleDbParameter = New OleDbParameter("@RoleID", OleDbType.Integer) parameterRoleID.Value = User.Role.RoleID With mycommand.Parameters .Add(parameterUserName) .Add(parameterPassword) .Add(parameterFirstName) .Add(parameterLastName) .Add(parameterRoleID) End With
94
connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function UserUpdate(ByVal User As Entity.Users) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateUser", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterPassword As OleDbParameter = New OleDbParameter("@Password", OleDbType.VarChar, 15) parameterPassword.Value = User.Password Dim parameterFirstName As OleDbParameter = New OleDbParameter("@first_name", OleDbType.VarChar, 50) parameterFirstName.Value = User.First_Name Dim parameterLastName As OleDbParameter = New OleDbParameter("@last_name", OleDbType.VarChar, 50) parameterLastName.Value = User.Last_Name Dim parameterRoleID As OleDbParameter = New OleDbParameter("@RoleID", OleDbType.Integer) parameterRoleID.Value = User.Role.RoleID Dim parameterActived As OleDbParameter = New OleDbParameter("@Actived", OleDbType.Boolean) parameterActived.Value = User.Actived Dim parameterUserName As OleDbParameter = New OleDbParameter("@UserName", OleDbType.VarChar, 15) parameterUserName.Value = User.Username With mycommand.Parameters .Add(parameterPassword) .Add(parameterFirstName) .Add(parameterLastName) .Add(parameterRoleID) .Add(parameterActived) .Add(parameterUserName) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
95
Dan pada F_User tekan F7 untuk masuk ke jendela Code buat variable Class seperti dibawah. Dim AccessUser As New AccessData.AccessUser Dim columns As String() = {}
Selanjutnya kita akan membuat procedure untuk menampilkan data pada CbRole, seperti dibawah. Private Sub SortRole() Dim RoleList As New List(Of Entity.Role) From {{"0", "- Choice -"}} DVDModule.FillListWithoutParam(RoleList, columns, "usp_SelectRole", _ GetType(Entity.Role)) CbRole.DataSource = RoleList CbRole.DisplayMember = "RoleName" CbRole.ValueMember = "RoleID" End Sub
Dan sintaks dibawah ini berfungsi untuk merefresh form (meng- clearkan textbox, membalikkan posisi CbRole seperti semula). Private Sub Dim Dim For
Clear() C As Control T As TextBox Each C In Me.GbDetail.Controls If TypeOf C Is TextBox Then T = CType(C, TextBox) T.Text = "" End If
Next CbRole.SelectedIndex = 0 End Sub
Lalu ketikkan sintaks dibawah untuk menampilkan data user dengan menggunakan fungsi login yang telah kita buat sebelumnya pada Class AccessUser. Private Sub ViewUser() Dim list As List(Of Entity.Users) = AccessUser.Login(txtUser.Text) txtUser.Text = list.First.Username txtPassword.Text = list.First.Password txtFirst.Text = list.First.First_Name txtLast.Text = list.First.Last_Name CbRole.SelectedIndex = CbRole.FindStringExact(list.First.Role.RoleName) CbStatus.Checked = If(list.First.Actived = "True", True, False) End Sub
Lalu klik ganda F_User dan ketikkan sintaks berikut.
96
Try SortRole() If Operate = "Add" Then CbStatus.Checked = True CbStatus.Visible = False Else CbStatus.Visible = True ViewUser() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Pada sintaks diatas jika Operate (Global Variable) tidak sama dengan “Add” maka pada form ini akan menampilkan data user dengan menggunakan procedure ViewUser. Dan mengaktifkan CbStatus. Klik ganda button Cancel dan ketikkan sintaks dibawah. If Operate = "Add" Then Clear() Else Operate = Nothing Me.Close() End If
Sintaks diatas memiliki dua fungsi sama seperti pada F_Main_Load yaitu jika pada Operate=Add, maka proses yang dilakukan adalah hany merefresh form sedangkan Operate <> Add maka form akan di tutup. Lalu klik ganda button Save dan ketikkan sintaks dibawah ini, yang berfungsi untuk menyimpan data baru maupun mengubah data lama. Try If CbRole.SelectedIndex = 0 Then MsgBox("Pilih Role terlebih dahulu", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim User As New Entity.Users With {.Username = txtUser.Text, .Password = txtPassword.Text, .First_Name = txtFirst.Text, .Last_Name = txtLast.Text, .Role = New Entity.Role With {.RoleID = CbRole.SelectedValue}, .Actived = If(CbStatus.Checked = True, True, False)} Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then If Operate = "Add" Then AccessUser.UserInsert(User) Clear() Else AccessUser.UserUpdate(User) End If End If
97
Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Sekarang buka F_Main, pada menu Item Utility > Users > Add, ketikkan sintaks berikut. Try Operate = "Add" Dim frm_user As New F_User frm_user.ShowDialog() Operate = Nothing Catch ex As Exception MsgBox(ex.Message) End Try
Dan jalankan program dengan menekan F5, buka form Add user dan masukkan data user pada form, seperti dibawah.
Gambar 4.28 Lalu bagaimanakah cara mengubah data user?? Mungkin pertanyaan itu ada di benak para pembaca. Pada Form ini untuk mengubah data user sebelumnya adalah kita membutuhkan 2 buah form, yang pertama untuk mencari data user dan kedua menampilkan daftar user. Untuk lebih jelasnya ikuti langkah dibawah ini. Tambahkan sebuah form pada project dan ubah properties nya seperti dibawah.
98
Name
F_UserBox
ShowInTaksbar
False
Text
Form Access
StartPosition
CenterScreen
ControlBox
False
FormBorderStyle
FixedSingle
BackColor
White
Dan tambahkan 1 TextBox, 1 Label dan 3 button lalu ubah propertiesnya seperti dibawah. TextBox1 Name
txtUsername
Button1 Name
btnOK
Text
OK
Button2 Name
btnSearch
Text
Search
Button3 Name
btnCancel
Text
Cancel
Name
btnSave
Text
&Save
Button2 Name
btnCancel
Text
&Cancel
Dan atur posisinya seperti gambar dibawah.
Gambar 4.29 99
Selanjutnya tambahkan sebuah form lagi dan ubah properties seperti dibawah. Name
H_User
ShowInTaksbar
False
Text
User List
StartPosition
CenterScreen
MaximizeBox
False
MinimizeBox
False
FormBorderStyle
FixedSingle
BackColor
White
Dan tambahkan beberapa control 1 Groupbox, 1 TextBox, 1 GriView dan 1 Button. Dan ubah propertiesnya seperti dibawah. TextBox1 Name
txtSearch
Groupbox1 Text
Search Criteria by Username
Button1 Name
btnCancel
Text
Cancel
Button2 Name
btnSearch
Text
Search
Button3 Name
btnCancel
Text
Cancel
Name
btnSave
Text
&Save
Button2 Name
btnCancel
Text
&Cancel
100
DataGridView1 Name
DgView
Dan atur posisi control diatas seperti gambar dibawah.
Gambar 4.30 Tekan F7, pada jendela Code H_User buat variable Class seperti dibawah. Dim UserList As New List(Of Entity.Users)
Dan buat procedure untuk mengatur format DgView seperti dibawah. Private Sub FormatGridWithBothTableAndColumnStyles() Me.DgView.DefaultCellStyle.ForeColor = Color.Navy Me.DgView.RowsDefaultCellStyle.BackColor = Color.AliceBlue Me.DgView.GridColor = Color.Blue Me.DgView.BorderStyle = BorderStyle.Fixed3D Me.DgView.RowHeadersBorderStyle = BorderStyle.Fixed3D
DgView.AutoGenerateColumns = False Dim UserColumn As New DataGridViewTextBoxColumn() UserColumn.DataPropertyName = "Username" UserColumn.HeaderText = "Username" UserColumn.Width = 80 Dim FirstColumn As New DataGridViewTextBoxColumn() FirstColumn.DataPropertyName = "first_name" FirstColumn.HeaderText = "First Name" FirstColumn.Width = 100 Dim LastColumn As New DataGridViewTextBoxColumn() LastColumn.DataPropertyName = "last_name" LastColumn.HeaderText = "Last Name" LastColumn.Width = 100
101
Dim ActColumn As New DataGridViewTextBoxColumn() ActColumn.DataPropertyName = "actived" ActColumn.HeaderText = "Actived" ActColumn.Width = 150 DgView.Columns.Add(UserColumn) DgView.Columns.Add(FirstColumn) DgView.Columns.Add(LastColumn) DgView.Columns.Add(ActColumn) End Sub
Klik ganda button cancel dan ketikkan sintaks berikut ; me.close. selanjutnya buatlah Event Handler
H_User_FormClosing dan ketikkan sintaks berikut : Operate=Nothing. Lalu klik
ganda H_User (Event Handler H_User_Load), dan ketikkan sintaks dibawah ini. Try Dim columns As String() = {"username", "first_name", "last_name", "actived"} DVDModule.FillListWithoutParam(UserList, columns, "usp_SelectUserList", _ GetType(Entity.Users)) FormatGridWithBothTableAndColumnStyles() DgView.DataSource = UserList txtSearch.Focus() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Sintaks diatas berfungsi untuk menampilkan data kedalam DgView yang sebelumnya disimpan terlebih dahulu kedalam Generic List (of User). Lalu buatlah event Handler txtSearch_KeyUp dan ketikkan sintaks berikut : Try Dim query = (From a In UserList Where a.Username.Contains(txtSearch.Text) Select a).ToList DgView.DataSource = query Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Sintaks ini menggunakan LINQ to Object yang berfungsi untuk mencari data pada List (Of User), dan hasil perncarian tersebut akan ditampilkan pada DgView. Dan terakhir buat event handler DgView_CellDoubleClick dan ketikkan sintaks berikut.
102
If Operate <> Nothing Then Dim row As DataGridViewRow = DgView.Rows(e.RowIndex) txtSearch.Text = row.Cells(0).Value Operate = Nothing Me.Close() End If
Sintaks ini berfungsi jika user melakukan klik ganda pada cell di DgView maka, untuk baris yang di klik akan di ambil datanya untuk kolom pertama. Dan langsung menutup form ini. Selanjutnya aktifkan form F_USerBox, dan masuk ke jendela Code, klik ganda button Cancel dan ketikkan sintaks berikut : Operate = Nothing Me.Close()
Lalu klik ganda button Search dan ketikkan sintaks dibawah ini. Operate = "Edit" Dim frm_HUser As New H_User frm_HUser.ShowDialog() txtUsername.Text = frm_HUser.txtSearch.Text
Sintaks ini berfungsi untuk menampilkan Form H_User yang telah kita buat sebelumnya. Dan klik ganda button OK, lalu ketikkan sintaks berikut : Try If txtUsername.Text = "" Then MsgBox("Masukkan Username", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim RoleList As New List(Of Entity.Users) Dim Coltype As System.Data.OleDb.OleDbType() = {System.Data.OleDb.OleDbType.VarChar} Dim FieldName As String() = {"@username"} Dim Size As Integer() = {15} Dim Value As String() = {txtUsername.Text} Dim columns As String() = {"username"} DVDModule.FillListWithParam(RoleList, columns, "usp_selectlogin", _ GetType(Entity.Users), FieldName, _ Coltype, Size, Value) If RoleList.Count = 0 Then MsgBox("Username Salah") Exit Sub End If
103
Dim frm_User As New F_User frm_User.txtUser.Text = txtUsername.Text frm_User.ShowDialog() Me.Close() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Sintaks diatas berfungsi untuk memvalidasi username yang dimasukkan kedalam textbox, jika username tidak ada pada table maka akan ada pesan error. Jika username yang dimasukkan benar maka F_User akan ditampilkan berserta data-data user yang dicari. Lalu buka F_Main (Main Menu) pada Menu Item Utilty > Users > Edit ketikkan sintaks berikut : Try Dim frm_UserBox As New F_UserBox frm_UserBox.ShowDialog() Catch ex As Exception End Try
Utility > User > User List lalu klik ganda dan ketikkan sintaks berikut : Try Dim frm_HUser As New H_User frm_HUser.ShowDialog() Catch ex As Exception MsgBox(ex.Message) End Try
Jalankan program dan klik menu utility > User > Edit, lalu masukkan username, jika tidak mengetahui username yang dicari tekan tombol search, maka daftar pengguna akan tampil. Dan selanjutnya ubah data user pada form User.
Gambar 4.30
104
Gambar 4.31
Gambar
4.32
105
4.3 Membuat Form Group Setelah selesai membuat beberapa form untuk management user sekarang kita lanjutkan membuat form untuk pengolahan data Group. Penulis akan menjelaskan kegunaan dari table group ini. Table ini digunakan untuk pengelompokan DVD baik biaya Rental, biaya kelambatan atau jumlah hari Rental untuk suatu DVD, jadi idak kita atur semua itu pada data DVD. Terlebih dahulu buatlah table Group dengan nama T_Group dan strukturnya sebagai berikut : Field Name
Data Type
Field size
Primary Key
ids
AutoNumber
group_id
Text
4
PK (*)
Group_name
Text
25
days
Number
Integer
price
Currency
fee
Currency
Tambahkan sebuah form ubah properties nya seperti dibawah Name
F_Group
ShowInTaksbar
False
Text
Add/Edit Group
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
Selanjutnya tambahkan control 5 textbox, 5 label, 6 button dan 1groupbox dan ubah properties seperti dibawah.
106
Textbox1 Name
txtID
Enabled
False
Textbox2 Name
txtName
TextBox3 Name
txtDays
TextBox4 Name
txtPrice
TextBox5 Name
txtFee
GroupBox1 Name
GbDetail
Text
Item Detail
Button1 Name
btnSave
Text
&Save
Button2 Name
btnCancel
Text
&Cancel
Button3 Name
btnAdd
Text
&Add
Button4 Name
btnEdit
Text
&Edit
Button5 Name
btnDelete
Text
&Delete
Button6
107
Name
btnFind
Text
&Find
Dan atur posisi nya seperti gambar dibawah.
Gambar 4.33 Tambahkan Class pada folder entity dan ubah namanya menjadi Group, lalu ketikkan sintaks berikut pada Class Group. Namespace Entity Public Class Group Private m_groupid As String Public Property Group_ID() As String Get Return m_groupid End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan Group ID") End If m_groupid = value End Set End Property Private m_groupname As String Public Property Group_Name() As String Get Return m_groupname End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan Group Name") End If m_groupname = value End Set End Property
108
Lalu buka DVDModule dan ketikkan sintaks dibawah pada Region Extension Method yang kita buat sebelumnya. Sub Add(ByVal GroupList As List(Of Entity.Group), ByVal groupid As String, ByVal groupname As String, ByVal days As Int16, ByVal price As Decimal, ByVal fee As Decimal) GroupList.Add(New Entity.Group With {.Group_ID = groupid, .Group_Name = groupname, .Days = days, .Price = price, .Fee = fee}) End Sub
Lalu buatlah 5 buah query pada database dengan nama masing sebagai berikut : usp_SelectGroupTop1,
usp_selectgroup,
usp_InsertGroup,
usp_UpdateGroup,
usp_DeleteGroup Dengan masing-masing sintaks SQL seperti dibawah. SELECT TOP 1 t_group.* FROM t_group ORDER BY t_group.ids DESC; SELECT t_group.* FROM t_group ORDER BY t_group.ids; INSERT INTO T_Group ( group_id, group_name, days, price, fee ) VALUES ([@group_id], [@group_name], [@days], [@price], [@fee]); UPDATE t_group SET t_group.group_name = [@group_name], t_group.days = [@days], t_group.price = [@price], t_group.fee = [@fee] WHERE (((t_group.group_id)=[@group_id]));
DELETE * FROM t_group WHERE (((t_group.group_id)=[@grup_id]));
109
Serta tambahkan class pada folder AccessData dan ubah namanya menjadi AccessGroup, lalu import terlebih dahulu Name Space OleDB (Imports
System.Data.OleDb),
selanjutnya buat
NameSpace AccessData, dan ketikkan sintaks dibawah didalam NameSpace AccessData Public Function GroupInsert(ByVal Group As Entity.Group) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertGroup", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterGroupID As OleDbParameter = New OleDbParameter("@group_id", OleDbType.VarChar, 4) parameterGroupID.Value = Group.Group_ID Dim parameterGroupName As OleDbParameter = New OleDbParameter("@group_name", OleDbType.VarChar, 25) parameterGroupName.Value = Group.Group_Name Dim parameterDays As OleDbParameter = New OleDbParameter("@Days", OleDbType.Integer) parameterDays.Value = Group.Days
Dim parameterPrice As OleDbParameter = New OleDbParameter("@Price", OleDbType.Currency) parameterPrice.Value = Group.Price Dim parameterFee As OleDbParameter = New OleDbParameter("@fee", OleDbType.Currency) parameterFee.Value = Group.Fee With mycommand.Parameters .Add(parameterGroupID) .Add(parameterGroupName) .Add(parameterDays) .Add(parameterPrice) .Add(parameterFee) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
110
Fungsi diatas digunakan untuk menambah data group, dengan menggunakan query usp_InsertGroup. Selanjutnya ketikkan sintaks untuk mengubah data group seperti dibawah. Public Function GroupUpdate(ByVal Group As Entity.Group) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateGroup", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterGroupName As OleDbParameter = New OleDbParameter("@group_name", OleDbType.VarChar, 25) parameterGroupName.Value = Group.Group_Name Dim parameterDays As OleDbParameter = New OleDbParameter("@Days", OleDbType.Integer) parameterDays.Value = Group.Days Dim parameterPrice As OleDbParameter = New OleDbParameter("@Price", OleDbType.Currency) parameterPrice.Value = Group.Price Dim parameterFee As OleDbParameter = New OleDbParameter("@fee", OleDbType.Currency)
parameterFee.Value = Group.Fee
Dim parameterGroupID As OleDbParameter = New OleDbParameter("@group_id", OleDbType.VarChar, 4) parameterGroupID.Value = Group.Group_ID
With mycommand.Parameters .Add(parameterGroupName) .Add(parameterDays) .Add(parameterPrice) .Add(parameterFee) .Add(parameterGroupID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
111
Dan terakhir tambah kan sintaks untuk menghapus data group pada table. Public Function GroupDelete(ByVal Group As Entity.Group) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_DeleteGroup", connect) mycommand.CommandType = CommandType.StoredProcedure
Dim parameterGroupID As OleDbParameter = New OleDbParameter("@group_id", OleDbType.VarChar, 4) parameterGroupID.Value = Group.Group_ID
With mycommand.Parameters .Add(parameterGroupID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Kembali pada F_Group, buat variable class seperti dibawah #Region "Deklarasi" Public Proses As String Protected AccessGroup As New AccessData.AccessGroup Dim columns As String() = {} #End Region
Selanjutnya kita akan membuat procedure untuk mengahapus data pada form dan disable inputan pada form, seperti dibawah.
112
Private Sub Aktif_Inputan(ByVal Bol As Boolean, ByVal pros As String) Dim C As Control For Each C In Me.Controls If C.HasChildren Then For Each hChild As Control In C.Controls If TypeOf hChild Is TextBox AndAlso UCase(hChild.Name) <> UCase("txtID") Then hChild.Enabled = Bol If UCase(pros) = "ADD" AndAlso UCase(hChild.Name) <> UCase("txtname") Then hChild.Text = "0" End If End If If TypeOf hChild Is TextBox AndAlso UCase(pros) = UCase("clear") Then hChild.Text = "" End If Next ElseIf TypeOf C Is Button AndAlso UCase(C.Name) = UCase("btnsave") Then C.Enabled = Bol End If Next End Sub
Pada procedure ini kita telah membuat 1 prosedure untuk 3 keperluan, pertama untuk merefresh form, disable inputan dan terakhir adalah enabled inputan. Sesuai inputan yang kita masukkan pada procedure. Selanjutnya adalah membuat fungsi penomoran otomatis seperti dibawah. Private Function IDNo() As String Dim GroupList As New List(Of Entity.Group) DVDModule.FillListWithoutParam(GroupList, columns, "usp_SelectGroupTop1", GetType(Entity.Group)) If GroupList.Count = 0 Then txtID.Text = "GR01" Else txtID.Text = "GR" & Format(Val(CInt(Microsoft.VisualBasic.Right(GroupList.First.Group_ID, GroupList.First.Group_ID.Length - 2)) + 1), "00") End If Return txtID.Text End Function
Pada fungsi diatas, pertama-tama adalah mencari nilai record awal dengan menggunakan sorting descending pada query yang kita buat sebelumnya, dan disimpan didalam List. Jika list kosong (table kosong), maka secara otomatis nilai kembaliannya adalah “GR01” sedangkan jika ada maka akan dimabil nilai terakhir dengan menggunakan fungsi Right, lalu di tambah 1. Selanjutnya pada event handler txtPrice_Keypress ubah sintaks nya seperti berikut : 113
Private Sub txtPrice_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPrice.KeyPress, txtDays.KeyPress, txtFee.KeyPress Try If Not ((e.KeyChar >= "0" And e.KeyChar <= "9") Or e.KeyChar = vbBack) Then e.Handled() = True End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub
Fungsi diatas di maksudkan agar karakter yang diketikkan hanya boleh/bisa dari 0-9, selebihnya tidak bisa. Dan buat event handler txtFee_Keyup lalu ketikkan sintaks berikut : If e.KeyCode = Keys.Enter Then btnSave.PerformClick() ElseIf e.KeyCode = Keys.Escape Then btnCancel.PerformClick() End If
Sedangkan sintaks di atas berfungsi, jika pada txtFee (textbox terakhir dari form) pengguna menekan Enter maka, proses pada button save agar dijalankan, sedangkan jika Esc maka button cancel akan dijalankan, yang akan kita buat proses nya dibawah. Klik ganda F_Group dan ketikkan sintak dibawah, Try Aktif_Inputan(False, "") Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Klik ganda button Cancel dan ketikkan sintaks dibawah : Proses = Nothing Aktif_Inputan(False, "clear")
Button cancel berfungsi untuk merefresh form dan mendisabled seluruh textbox pada form, dimana menggunakan procedure “Aktif_Inputan”. Lalu klik Button Add, yang berfungsi untuk melakukan penambahan data dengan sintaks seperti dibawah.
114
Try Proses = "add" Aktif_Inputan(True, Proses) IDNo() txtName.Focus() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Pada saat button ini di klik maka, form akan mengaktifkan seluruh textbox, dan menampilkan GroupID secara otomatis dan kursor akan focus pada txtName. Dan selanjutnya adalah membuat proses simpan, klik ganda button Save lalu ketikkan sintaks berikut : Try Dim Group As New Entity.Group With {.Group_ID = txtID.Text, .Group_Name = txtName.Text, .Days = txtDays.Text, .Price = txtPrice.Text, .Fee = txtFee.Text} Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then If UCase(Proses) = "ADD" Then AccessGroup.GroupInsert(Group) ElseIf UCase(Proses) = "EDIT" Then AccessGroup.GroupUpdate(Group) End If btnCancel.PerformClick() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Pada button save ini menyimpan 2 proses yaitu Save dan Update tergantung pada variable “Process” yang ada, apakah “ADD” atau “EDIT”. Buka F_Main (Main Menu) pada menu strip Data > Group kemudian klik ganda ketikkan sintaks dibawah. Try Dim frm_group As New F_Group frm_group.ShowDialog() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
Dan jalankan program dan buka form Group, kemudian coba masukkan data pada form Group. Dengan cara menekan tombol Add terlebih dahulu setelah itu tekan tombol Save.
115
Gambar 4.34 Lalu bagaimana cara nya untuk mengubah dan menghapus data? Pada form ini untuk mengubah/menghapus data terlebih dahulu pengguna harus mencari data terlebih dahulu, dengan menekan tombol Find, dan akan tampil sebuah form (List dari data group). Dan pengguna dapat memilih group mana yang mau di ubah/hapus dengan klik ganda pada cell datagridview. Untuk lebih jelas nya ikuti langkah-langkah dibawah. Tambahkan sebuah form pada project kita dan tambahkan DataGridView lalu ganti properties nya seperti dibawah ; Name
H_Group
ShowInTaksbar
False
Text
Group List
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
DataGridView Name
DgView
116
Ketik variable Class pada form seperti dibawah Public ID As String Dim GroupList As New List(Of Entity.Group)
Selanjunya adalah membuat sebuah procedure untuk format DataGridView seperti dibawah : Private Sub FormatGridWithBothTableAndColumnStyles() Me.DgView.DefaultCellStyle.ForeColor = Color.Navy Me.DgView.RowsDefaultCellStyle.BackColor = Color.AliceBlue Me.DgView.GridColor = Color.Blue Me.DgView.BorderStyle = BorderStyle.Fixed3D Me.DgView.RowHeadersBorderStyle = BorderStyle.Fixed3D
DgView.AutoGenerateColumns = False Dim IDColumn As New DataGridViewTextBoxColumn() IDColumn.DataPropertyName = "group_id" IDColumn.HeaderText = "Group ID" IDColumn.Width = 80 Dim NameColumn As New DataGridViewTextBoxColumn() NameColumn.DataPropertyName = "group_name" NameColumn.HeaderText = "Name" NameColumn.Width = 180 Dim DayColumn As New DataGridViewTextBoxColumn() DayColumn.DataPropertyName = "days" DayColumn.HeaderText = "Days" DayColumn.Width = 80 Dim PriceColumn As New DataGridViewTextBoxColumn() PriceColumn.DataPropertyName = "price" PriceColumn.HeaderText = "Price" PriceColumn.Width = 80
Dim FeeColumn As New DataGridViewTextBoxColumn() FeeColumn.DataPropertyName = "fee" FeeColumn.HeaderText = "Fee" FeeColumn.Width = 150
DgView.Columns.Add(IDColumn) DgView.Columns.Add(NameColumn) DgView.Columns.Add(DayColumn) DgView.Columns.Add(PriceColumn) DgView.Columns.Add(FeeColumn) End Sub
Lalu klik ganda form, dan ketikkan sintaks seperti dibawah.
117
Try Dim columns As String() = {"group_id", "group_name", "days", "price", "fee"} DVDModule.FillListWithoutParam(GroupList, columns, "usp_SelectGroup", _ GetType(Entity.Group)) FormatGridWithBothTableAndColumnStyles() DgView.DataSource = GroupList Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try End Sub
Sintaks diatas befungsi untuk menampilkan data Group pada DgView dengan menggunakan Procedure yang kita buat pada module. Dan terakhir adalah dengan mengetikkan sintaks dibawah pada event handler DgView_CellDoubleClick dimana sintaks dibawah berfungsi untuk mengambil groupid pada DgView dan disimpan pada variable ID yang telah kita buat sebelumnya lalu menutup form ini. Dim row As DataGridViewRow = DgView.Rows(e.RowIndex) ID = row.Cells(0).Value Me.Close()
Kembali pada form F_Group klik ganda pada button Find. Try Proses = "find" Dim frm_HGroup As New H_Group frm_HGroup.ShowDialog() txtID.Text = frm_HGroup.ID If txtID.Text <> "" Then Dim GroupList As New List(Of Entity.Group) DVDModule.FillListWithoutParam(GroupList, columns, "usp_selectgroup", _ GetType(Entity.Group)) Dim group = (From grp In GroupList Where grp.Group_ID.Equals(txtID.Text) ).Single txtName.Text = group.Group_Name txtDays.Text = group.Days txtFee.Text = group.Fee txtPrice.Text = group.Price End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try
118
Button ini berfungsi untuk menampilkan form H_Group yang kita buat sebelumnya, selanjutnya dengan menggunakan variable ID pada form H_Group, program akan menampilkan data group dengan menggunakan criteria group_id. Lalu klik ganda button Edit dan ketikkan sintaks dibawah. If UCase(Proses) <> UCase("find") Then MsgBox("Cari data terlebih dahulu", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Proses = "edit" Aktif_Inputan(True, "")
Jika kita mengklik button edit sebelum mencari data terlebih dahulu maka akan ada pesan yang tampil, agar kita mencari data terlebih dahulu. Dan terakhir adalah dengan mengetik sintaks dibawah, pada event hander btnDelete_Click If UCase(Proses) <> UCase("find") Then MsgBox("Cari data terlebih dahulu", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim Group As New Entity.Group With {.Group_ID = txtID.Text} Dim mYes_No As String = MsgBox("Apakah kamu ingin menghapus data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then AccessGroup.GroupDelete(Group) btnCancel.PerformClick() End If
Setelah mencari data maka dengan menekan tombol Delete data pada table Group akan di hapus dengan kriteria Group_ID yang dipilih.
Gambar 4.35 119
4.4 Membuat Form Genre Selanjutnya adalah membuat form Genre. Untuk pertama kali adalah dengan membuat table Genre. Table ini digunakan sebagai jenis dari pada DVD yang disewakan. Contoh film Action, Drama, horror dan sebagainya. Terlebih dahulu buatlah table Genre dengan nama T_Genre dan strukturnya sebagai berikut Field Name
Data Type
Field size
Primary Key
ids
AutoNumber
genre_id
Text
4
PK (*)
Genre_name
Text
25
Tambahkan sebuah form ubah, dan ubah properties nya seperti dibawah Name
F_Genre
ShowInTaksbar
False
Text
Add/Edit Genre
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
Selanjutnya tambahkan control 2 textbox, 2 label, 6 button dan 1groupbox dan ubah properties seperti dibawah.
Textbox1 Name
txtID
Enabled
False
Textbox2 120
Name
txtName
GroupBox1 Name
GbDetail
Text
Item Detail
Button1 Name
btnSave
Text
&Save
Button2 Name
btnCancel
Text
&Cancel
Button3 Name
btnAdd
Text
&Add
Button4 Name
btnEdit
Text
&Edit
Button5 Name
btnDelete
Text
&Delete
Button6 Name
btnFind
Text
&Find
Dan atur posisi nya seperti gambar dibawah.
Gambar 4.36
121
Tambahkan Class pada folder entity dan ubah namanya menjadi Genre, lalu ketikkan sintaks berikut pada Class Genre. Namespace Entity Public Class Genre Private m_genreid As String
Public Property Genre_ID() As String Get Return m_genreid End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan Genre ID") End If m_genreid = value End Set End Property Public Property Genre_Name() As String
End Class End Namespace
Lalu buka DVDModule dan ketikkan sintaks dibawah pada Region Extension Method yang kita buat sebelumnya. Sub Add(ByVal GenreList As List(Of Entity.Genre), ByVal genreid As String, ByVal genrename As String) GenreList.Add(New Entity.Genre With {.Genre_ID = genreid, .Genre_Name = genrename}) End Sub
Lalu buatlah 5 buah query pada database dengan nama masing sebagai berikut : usp_SelectGenreTop1,
usp_selectgenre,
usp_InsertGenre,
usp_UpdateGenre,
usp_DeleteGenre Dengan masing-masing sintaks SQL seperti dibawah. SELECT TOP 1 t_genre.genre_id, t_genre.genre_name FROM t_genre ORDER BY t_genre.ids DESC;
122
SELECT t_genre.genre_id, t_genre.genre_name FROM t_genre ORDER BY t_genre.genre_id, t_genre.ids; INSERT INTO T_Genre ( genre_id, genre_name ) VALUES ([@genre_id], [@genre_name]); UPDATE t_genre SET t_genre.genre_name = [@genre_name] WHERE (((t_genre.genre_id)=[@genre_id])); DELETE * FROM t_genre WHERE (((t_genre.genre_id)=[@GenreID]));
Serta tambahkan class pada folder AccessData dan ubah namanya menjadi AccessGenre, lalu import terlebih dahulu Name Space OleDB (Imports
System.Data.OleDb),
selanjutnya buat
NameSpace AccessData, dan ketikkan sintaks dibawah didalam NameSpace AccessData
123
Public Function GenreInsert(ByVal Genre As Entity.Genre) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertGenre", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterGenreID As OleDbParameter = New OleDbParameter("@group_id", OleDbType.VarChar, 4) parameterGenreID.Value = Genre.Genre_ID Dim parameterGenreName As OleDbParameter = New OleDbParameter("@group_name", OleDbType.VarChar, 25) parameterGenreName.Value = Genre.Genre_Name With mycommand.Parameters .Add(parameterGenreID) .Add(parameterGenreName) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Fungsi diatas digunakan untuk menambah data genre, dengan menggunakan query usp_Insertgenre. Selanjutnya ketikkan sintaks untuk mengubah data genre seperti dibawah.
124
Public Function GenreUpdate(ByVal Genre As Entity.Genre) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateGenre", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterGenreName As OleDbParameter = New OleDbParameter("@group_name", OleDbType.VarChar, 25) parameterGenreName.Value = Genre.Genre_Name Dim parameterGenreID As OleDbParameter = New OleDbParameter("@group_id", OleDbType.VarChar, 4) parameterGenreID.Value = Genre.Genre_ID With mycommand.Parameters .Add(parameterGenreName) .Add(parameterGenreID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
125
Public Function GenreDelete(ByVal Genre As Entity.Genre) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_DeleteGenre", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterGenreID As OleDbParameter = New OleDbParameter("@group_id", OleDbType.VarChar, 4) parameterGenreID.Value = Genre.Genre_ID With mycommand.Parameters .Add(parameterGenreID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Dan terakhir tambah kan sintaks untuk menghapus data genre pada table. Untuk form ini penulis tidak akan menjelaskan secara detail sampai habis, penulis berharap para pembaca dapat melanjutkan untuk menyelesaikan form ini. Dikarenakan sintaks yang digunakan form ini dan form group hampir sama. Jika mengalami kesulitan dapat melihat contoh project yang disertakan pada buku ini.
Gambar 4.37
126
Gambar 4.38 4.5 Membuat Form Customer Form customer ini berfungsi untuk memanipulasi data customer, dimana digunakan untuk menyimpan data customer. Untuk bisa merental DVD kita harus meregistrasi peminjam/customer terlebih dahulu. Sebelumnya adalah dengan membuat table customer dengan nama T_Cust seperti dibawah. Field Name
Data Type
Field size
Primary Key
Id_cust
AutoNumber
refer_cust
Text
8
PK (*)
first_name
Text
50
last_name
Text
50
telp
Text
15
email
Text
50
join_date
Date/Time
address
Text
255
picture
Text
50
notes
Text
255
status
Yes/No 127
Tambahkan sebuah form lalu ganti properties seperti dibawah : Name
F_Customer
ShowInTaksbar
False
Text
Add/Edit Customer
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
Selanjutnya tambahkan 8 label, 8 textbox, 1 datetimepicker, 1 checkbox, 1 picturebox, 1 groupbox 1 buah panel, 1 OpenFileDialog dan 4 buah button. Lalu gantilah properties controlcontrol diatas seperti berikut : Textbox1 Name
txtReferCust
Enabled
False
Textbox2 Name
txtFirst
TextBox3 Name
txtLast
TextBox4 Name
txtPhone
TextBox5 Name
txtEmail
Textbox6 Name
txtAddress
MultiLine
True
TextBox7 Name
txtNotes
MultiLine
True
128
TextBox8 Name
txtPath
ReadOnly
True
GroupBox1 Name
GbDetail
Text
Item Detail
Button1 Name
btnSave
Text
&Save
Size
84, 38
Button2 Name
btnCancel
Text
&Cancel
Size
84, 38
Button3 Name
btnEdit
Text
Edit Picture
Button4 Name
btnCancelPic
Text
Cancel
DateTimePicker1 Name
DtDate
Custom
MM/dd/yyyy
Format
Custom
CheckBox1 Name
cbStatus
Text
Status
PictureBox1 Name
PbImage
OpenFileDialog1
129
Name
OFD
Dan atur posisi nya seperti gambar dibawah.
Gambar 4.39 Tambahkan Class pada folder entity dan ubah namanya menjadi Customer, lalu ketikkan sintaks berikut pada Class Customer. Namespace Entity Public Class Customer Private m_refercust As String Public Property Refer_Cust() As String Get Return m_refercust End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan reference Customer") End If m_refercust = value End Set End Property Private m_firstname As String Public Property First_Name() As String Get Return m_firstname End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan First Name") End If m_firstname = value End Set End Property
130
Public Property Last_Name() As String Public Property Telp() As String Public Property Email() As String Public Property Join_Date() As Date Public Property Address() As String Public Property Picture() As String Public Property Notes() As String Public Property Status() As Boolean End Class End Namespace
Lalu buka DVDModule dan ketikkan sintaks dibawah pada Region Extension Method yang kita buat sebelumnya. Sub Add(ByVal CustList As List(Of Entity.Customer), ByVal refer_cust As String, ByVal firstname As String, ByVal lastname As String, ByVal telp As String, ByVal email As String, ByVal joindate As Date, ByVal address As String, ByVal picture As String, ByVal notes As String, ByVal status As String) CustList.Add(New Entity.Customer With {.Refer_Cust = refer_cust, .First_Name = firstname, .Last_Name = lastname, .Telp = telp, .Email = email, .Join_Date = joindate, .Address = address, .Picture = picture, .Notes = notes, .Status = status}) End Sub
Lalu buatlah 5 buah query pada database dengan nama masing sebagai berikut : usp_SelectCustTop1, usp_selectCustbyRefer, usp_SelectCustList, usp_InsertCustomer, usp_UpdateCustomer SELECT TOP 1 t_cust.* FROM t_cust ORDER BY t_cust.ID_Cus DESC;
131
SELECT t_cust.* FROM t_cust WHERE (((t_cust.refer_cust)=[@refer_cust]))
SELECT t_cust.refer_cust, t_cust.address, t_cust.telp, t_cust.email, t_cust.status, t_cust.first_name, t_cust.last_name FROM t_cust ORDER BY t_cust.ID_Cus;ORDER BY t_cust.ID_Cus; INSERT INTO t_cust ( refer_cust, first_name, last_name, telp, email, join_date, address, picture, notes, status ) VALUES ([@refer_cust], [@first_name], [@last_name], [@telp], [@email], [@join_date], [@address], [@picture], [@notes], [@status]);ORDER BY t_cust.ID_Cus;ORDER BY t_cust.ID_Cus; UPDATE t_cust SET t_cust.first_name = [@first_name], t_cust.last_name = [@last_name], t_cust.telp = [@telp], t_cust.email = [@email], t_cust.join_date = [@join_date], t_cust.address = [@address], t_cust.picture = [@picture], t_cust.notes = [@notes], t_cust.status = [@status] WHERE (((t_cust.refer_cust)=[@refer_cust]));
Serta tambahkan class pada folder AccessData dan ubah namanya menjadi AccessCustomer, lalu import terlebih dahulu Name Space OleDB (Imports
System.Data.OleDb),
selanjutnya buat
NameSpace AccessData, dan ketikkan sintaks dibawah didalam NameSpace AccessData Public Function CustomerInsert(ByVal Customer As Entity.Customer) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertCustomer", connect) mycommand.CommandType = CommandType.StoredProcedure DVDModule.AddParameter("@refer_cust", OleDbType.VarChar, 8, Customer.Refer_Cust, mycommand) DVDModule.AddParameter("@first_name", OleDbType.VarChar, 50, Customer.First_Name, mycommand) DVDModule.AddParameter("@last_name", OleDbType.VarChar, 50, Customer.Last_Name, mycommand) DVDModule.AddParameter("@telp", OleDbType.VarChar, 15, Customer.Telp, mycommand) DVDModule.AddParameter("@email", OleDbType.VarChar, 50, Customer.Email, mycommand)
132
DVDModule.AddParameter("@join_date", OleDbType.Date, 0, Customer.Join_Date, mycommand) DVDModule.AddParameter("@address", OleDbType.VarChar, 255, Customer.Address, mycommand) DVDModule.AddParameter("@picture", OleDbType.VarChar, 50, Customer.Picture, mycommand) DVDModule.AddParameter("@notes", OleDbType.VarChar, 255, Customer.Notes, mycommand) DVDModule.AddParameter("@status", OleDbType.Boolean, 0, Customer.Status, mycommand) connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Jika pembaca jeli pasti merasa ada perbedaan sintaks fungsi Insert ini dengan insert-inset sebelumnya. Untuk fungsi ini penulis menggunakan procedure AddParameter yang telah kita buat diawal pada module, seperti dibawah. Public Sub AddParameter(ByVal Name As String, ByVal Type As OleDbType, _ ByVal Size As Integer, ByVal Value As Object, ByVal myCommand As OleDbCommand) Try myCommand.Parameters.Add(Name, Type, Size).Value = Value Catch OleDbExceptionErr As OleDbException Throw New System.Exception(OleDbExceptionErr.Message, _ OleDbExceptionErr.InnerException) End Try End Sub
Selanjutnya kita akan membuat fungsi untuk mengubah data customer seperti dibawah.
133
Public Function CustomerUpdate(ByVal Customer As Entity.Customer) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateCustomer", connect) mycommand.CommandType = CommandType.StoredProcedure DVDModule.AddParameter("@first_name", OleDbType.VarChar, 50, Customer.First_Name, mycommand) DVDModule.AddParameter("@last_name", OleDbType.VarChar, 50, Customer.Last_Name, mycommand) DVDModule.AddParameter("@telp", OleDbType.VarChar, 15, Customer.Telp, mycommand) DVDModule.AddParameter("@email", OleDbType.VarChar, 50, Customer.Email, mycommand) DVDModule.AddParameter("@join_date", OleDbType.Date, 0, Customer.Join_Date, mycommand) DVDModule.AddParameter("@address", OleDbType.VarChar, 255, Customer.Address, mycommand) DVDModule.AddParameter("@picture", OleDbType.VarChar, 50, Customer.Picture, mycommand) DVDModule.AddParameter("@notes", OleDbType.VarChar, 255, Customer.Notes, mycommand) DVDModule.AddParameter("@status", OleDbType.Boolean, 0, Customer.Status, mycommand) DVDModule.AddParameter("@refer_cust", OleDbType.VarChar, 8, Customer.Refer_Cust, mycommand) connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Selanjutnya kembali pada form Customer, dan buat deklarasi variable class seperti dibawah #Region "Deklarasi" Protected AccessCustomer As New AccessData.AccessCustomer Dim filenaming As String Dim columns As String() = {} #End Region
134
Lalu kita akan membuat procedure CopyImage, yang berfungsi untuk meng-copy gambar customer kedalam folder aplikasi seperti dibawah : Private Sub CopyImage() If Trim(txtPath.Text) <> Application.StartupPath & "\" & filenaming Then Dim fFile As New IO.FileInfo(Trim(txtPath.Text)) fFile.CopyTo(Application.StartupPath & "\" & filenaming, True) End If End Sub
Dan ketikkan sintaks dibawah (procedure clear form) Private Sub Clear() Dim C As Control Dim T As TextBox For Each C In Me.GbDetail.Controls If TypeOf C Is TextBox Then T = CType(C, TextBox) If UCase(T.Name) <> UCase("txtReferCust") Then T.Text = "" End If End If Next txtPath.Text = "" DtDate.Text = Now PbImage.Image = Nothing End Sub
Untuk field Refer Customer pada aplikasi ini otomatis mengenerate nilai nya begitu kita membuka Form (Add), untuk membuat nomor otomatis ketikkan sintaks seperti dibawah : Private Function ReferNo() As String Dim CustList As New List(Of Entity.Customer) DVDModule.FillListWithoutParam(CustList, columns, "usp_SelectCustTop1", _ GetType(Entity.Customer)) If CustList.Count = 0 Then txtReferCust.Text = "C0000001" Else txtReferCust.Text = "C" & Format(Val(CInt(Microsoft.VisualBasic.Right(CustList.First.Refer_Cust, _ CustList.First.Refer_Cust.Length - 1)) + 1), "0000000") End If Return txtReferCust.Text
End Function
135
Dan selanjutnya adalah membuat procedure View Data Customer seperti dibawah Private Sub ViewCustomer() Dim CustList As New List(Of Entity.Customer) Dim Coltype As System.Data.OleDb.OleDbType() = {System.Data.OleDb.OleDbType.VarChar} Dim FieldName As String() = {"@refer_Cust"} Dim Size As Integer() = {8} Dim Value As String() = {txtReferCust.Text} DVDModule.FillListWithParam(CustList, columns, "usp_selectCustbyRefer", _ GetType(Entity.Customer), FieldName, _ Coltype, Size, Value) txtReferCust.Text = CustList.First.Refer_Cust txtFirst.Text = CustList.First.First_Name txtLast.Text = CustList.First.Last_Name DtDate.Text = CustList.First.Join_Date txtPhone.Text = CustList.First.Telp txtEmail.Text = CustList.First.Email txtAddress.Text = CustList.First.Address txtNotes.Text = CustList.First.Notes If CustList.First.Picture <> "" Then txtPath.Text = Application.StartupPath & "\" & CustList.First.Picture Dim fsImage As New System.IO.FileStream(txtPath.Text, IO.FileMode.Open, IO.FileAccess.Read) Dim MyImage As Image = Image.FromStream(fsImage) PbImage.Image = MyImage fsImage.Close() fsImage.Dispose() End If CbStatus.Checked = If(CustList.First.Status = "True", True, False) End Sub
Klik ganda button Cancel dan ketikkan sintaks dibawah. If Operate = "Add" Then Clear() Else Operate = Nothing Me.Close() End If
Selanjutnya klik ganda button CancelPicture, dimana berfungsi untuk menghapus gambar dari picture box. Ketikkan sintaks dibawah txtPath.Text = "" PbImage.Image = Nothing
136
Lalu klik ganda button Edit, dan ketikkan sintaks berikut : Try 'Filter file extension OFD.Filter = "Image Files (*.JPEG, *.jpg, *.bmp, *.gif, *.png)|*.JPEG; *.jpg; *.bmp; *.gif; *.png" If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then txtPath.Text = OFD.FileName Dim fsImage As New System.IO.FileStream(txtPath.Text, IO.FileMode.Open, IO.FileAccess.Read) Dim MyImage As Image = Image.FromStream(fsImage) PbImage.Image = MyImage fsImage.Close() fsImage.Dispose() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Sintaks diatas digunakan untuk menampilkan gambar pada Picture Box. Selanjutnya pada F_Customer_Load event handler ketikkan sintaks berikut : Try PbImage.SizeMode = PictureBoxSizeMode.StretchImage If Operate = "Add" Then ReferNo() CbStatus.Checked = True CbStatus.Visible = False Else CbStatus.Visible = True ViewCustomer() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Jika Operate = Add, maka secara otomatis aplikasi menggenerate field refer customer no. Selanjutnya pada event handler F_Customer_Closing ketikkan sintaks berikut
Operate =
Nothing
Dan terakhir klik ganda button Save lalu ketikkan sintaks dibawah ini : Try filenaming = "" If txtPath.Text <> "" Then filenaming = txtReferCust.Text & (Mid(txtPath.Text, InStrRev(txtPath.Text, "."), Len(txtPath.Text))) Dim Customer As New Entity.Customer With {.Refer_Cust = txtReferCust.Text, .First_Name = txtFirst.Text, .Last_Name = txtLast.Text, .Telp = txtPhone.Text, .Email = txtEmail.Text, .Join_Date = DtDate.Text, .Address = txtAddress.Text, .Picture = filenaming, .Notes = txtNotes.Text, .Status = If(CbStatus.Checked = True, True, False)}
137
Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then If Operate = "Add" Then AccessCustomer.CustomerInsert(Customer) If txtPath.Text <> "" Then CopyImage() Clear() ReferNo() Else AccessCustomer.CustomerUpdate(Customer) If txtPath.Text <> "" Then CopyImage() MsgBox("Update Selesai", MsgBoxStyle.Information, "DVD Rental") End If End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Selanjutnya buka F_Main (Main Menu), menu strip Data >Customer > Add, ketikkan sintaks dibawah. Operate = "Add" Dim frm_cust As New F_Customer frm_cust.ShowDialog() Operate = Nothing
Dan jalankan program, buka form customer dan masukkan data seperti pada gambar dibawah.
Gambar 4.40 138
Untuk mengubah data customer, penulis tidak akan menjelaskan nya lagi, para pembaca bisa melihat dari Form User, bagaimana logic untuk mengubah data. Yaitu dengan membuat form Customer Box dan Customer List. Untuk lebih jelasnya bisa melihat project yang disertakan pada buku ini.
Gambar 4.41
Gambar 4.42
139
4.6 Membuat Form DVD Form ini digunakan untuk memanipulasi data DVD yang ada pada rental, banyak table yang berelasi dengan table DVD, seperti table T_Group dan T_Genre. Oleh karena itu setelah membuat table DVD (T_DVD). Pertama-tama yang kita lakukan adalah dengan membuat table T_DVD. Field Name
Data Type
Field size
Primary Key
id_cust
AutoNumber
refer_no
Text
7
PK (*)
title
Text
25
genre_id
Text
4
director
Text
50
release_date
Date/Time
language
Text
15
runtime
Number
Integer
group_id
Text
4
synopsis
Memo
actors
Text
255
Picture
Text
50
status
Yes/No
FK
FK
Masih pada jendela MS Access, buka jendela Relationships (Database Tools > Relationships) lalu tambahkan table T_DVD, T_Genre dan T_Group. Selanjutnya Drag field genre_id (t_DVD) pada table t_genre (field genre_id), maka akan muncul tampilan Edit Relationships, dan klik OK. Lakukan hal yang sama pada field group_id pada table T_DVD dengan table T_Group (group_id). Maka kita akan memilki diagram relationships seperti dibawah.
140
Gambar 4.43 Tambahkan sebuah form lalu ganti properties seperti dibawah : Name
F_DVD
ShowInTaksbar
False
Text
Add/Edit DVD
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
Selanjutnya tambahkan 15 label, 11 textbox, 1 datetimepicker, 2 ComboBox, 1 picturebox, 1 groupbox 1 buah panel, 1 OpenFileDialog dan 4 buah button. Lalu gantilah properties controlcontrol diatas seperti berikut : Textbox1 Name
txtReferNo
Enabled
False
Textbox2 Name
txtTitle
TextBox3 141
Name
txtDirector
TextBox4 Name
txtActor
TextBox5 Name
txtLanguage
Textbox6 Name
txtRun
TextBox7 Name
txtRental
TextBox8 Name
txtPrice
TextBox9 Name
txtFee
TextBox10 Name
txtSinopsis
Multiline
True
TextBox10 Name
txtRental
TextBox11 Name
txtPath
ReadOnly
True
GroupBox1 Name
GbDetail
Text
Item Detail
Button1 Name
btnSave
Text
&Save
Size
84, 38
Button2 Name
btnCancel
142
Text
&Cancel
Size
84, 38
Button3 Name
btnEdit
Text
Edit Picture
Button4 Name
btnCancelPic
Text
Cancel
DateTimePicker1 Name
DtDate
Custom
MM/dd/yyyy
Format
Custom
ComboBox1 Name
CbGroup
DropDownStyle
DropDownList
ComboBox2 Name
CbGenre
DropDownStyle
DropDownList
PictureBox1 Name
PbImage
OpenFileDialog1 Name
OFD
Dan atur posisi nya seperti gambar dibawah.
143
Gambar 4.44 Tambahkan Class pada folder entity dan ubah namanya menjadi Customer, lalu ketikkan sintaks berikut pada Class Customer. Namespace Entity Public Class DVD
Private m_referno As String Public Property Refer_No() As String Get Return m_referno End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan reference no") End If m_referno = value End Set End Property
144
Private m_title As String Public Property Title() As String Get Return m_title End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan Title DVD") End If m_title = value End Set End Property Public Property Genre As New Entity.Genre Public Property Director() As String Public Property Release_Date() As Date Public Property Language() As String Private m_runtime As Int16 Public Property RunTime() As Int16 Get Return m_runtime End Get Set(ByVal value As Int16) If value.ToString = "" Then Throw New Exception("Masukkan Nilai Run Time DVD") End If m_runtime = value End Set End Property Private m_group As New Entity.Group Public Property Group() As New Entity.Group
Public Property Synopsis() As String Public Property Actors() As String Public Property Picture() As String Public Property Status() As Boolean End Class End Namespace
Lalu buka DVDModule dan ketikkan sintaks dibawah pada Region Extension Method yang kita buat sebelumnya.
145
_ Sub Add(ByVal LstDVD As List(Of Entity.DVD), ByVal Refer_No As String, ByVal Title As String, ByVal Genre_ID As String, ByVal Genre_Name As String, ByVal Director As String, ByVal Release_Date As Date, ByVal Language As String, ByVal RunTime As Int16, ByVal Group_ID As String, ByVal Group_Name As String, ByVal Days As Int16, ByVal Price As Decimal, ByVal Fee As Decimal, ByVal Synopsis As String, ByVal Actors As String, ByVal Picture As String, ByVal Status As Boolean) LstDVD.Add(New Entity.DVD With {.Refer_No = Refer_No, .Title = Title, .Genre = New Entity.Genre With {.Genre_ID = Genre_ID, .Genre_Name = Genre_Name}, .Director = Director, .Release_Date = Release_Date, .Language = Language, .RunTime = RunTime, .Group = New Entity.Group With {.Group_ID = Group_ID, .Group_Name = Group_Name, .Days = Days, .Price = Price, .Fee = Fee}, .Synopsis = Synopsis, .Actors = Actors, .Picture = Picture, .Status = Status}) End Sub
Lalu buatlah 5 buah query pada database dengan nama masing sebagai berikut : usp_selectDVDtop1,
usp_InsertDVD,
usp_UpdateDVD,
usp_UpdateDVDStatus,
usp_selectDVDbyRefer, usp_SelectDVDList SELECT TOP 1 t_dvd.* FROM t_dvd ORDER BY t_dvd.id DESC;
INSERT INTO t_dvd ( refer_no, title, genre_id, director, release_date, [language], runtime, group_id, synopsis, actors, picture, status ) VALUES ([@refer_no], [@title], [@genre_id], [@director], [@release_date], [@language], [@runtime], [@group_id], [@synopsis], [@actors], [@picture], [@status]); UPDATE t_dvd SET t_dvd.title = [@title], t_dvd.genre_id = [@genre_id], t_dvd.director = [@direcor], t_dvd.release_date = [@release_date], t_dvd.[language] = [@language], t_dvd.runtime = [@runtime], t_dvd.group_id = [@group_id], t_dvd.synopsis = [@synopsis], t_dvd.actors = [@actors], t_dvd.picture = [@picture] WHERE (((t_dvd.refer_no)=[@refer_no]));
146
UPDATE t_dvd SET t_dvd.status = [@status] WHERE (((t_dvd.refer_no)=[@refer_no])); SELECT t_dvd.*, t_group.group_name, t_group.days, t_group.price, t_group.fee, t_genre.genre_name FROM t_genre INNER JOIN (t_group INNER JOIN t_dvd ON t_group.group_id = t_dvd.group_id) ON t_genre.genre_id = t_dvd.genre_id
WHERE (((t_dvd.refer_no)=[@refer_no])); SELECT t_dvd.refer_no, t_dvd.title, t_dvd.actors, t_dvd.director, t_dvd.status, t_dvd.language, t_dvd.status FROM t_dvd ORDER BY t_dvd.refer_no;
Serta tambahkan class pada folder AccessData dan ubah namanya menjadi AccessCDVD, lalu import terlebih dahulu Name Space OleDB (Imports
System.Data.OleDb),
selanjutnya buat
NameSpace AccessData, dan ketikkan sintaks dibawah didalam NameSpace AccessData Public Function DVDInsert(ByVal DVD As Entity.DVD) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertDVD", connect) mycommand.CommandType = CommandType.StoredProcedure DVDModule.AddParameter("@refer_no", OleDbType.VarChar, 7,
DVD.Refer_No, mycommand) DVDModule.AddParameter("@Title", OleDbType.VarChar, 25, DVD.Title, mycommand) DVDModule.AddParameter("@genre_id", OleDbType.VarChar, 4, DVD.Genre.Genre_ID, mycommand) DVDModule.AddParameter("@director", OleDbType.VarChar, 50, DVD.Director, mycommand) DVDModule.AddParameter("@release_date", OleDbType.Date, 0, DVD.Release_Date, mycommand) DVDModule.AddParameter("@language", OleDbType.VarChar, 15, DVD.Language, mycommand) DVDModule.AddParameter("@runtime", OleDbType.Integer, 0, DVD.RunTime, mycommand) DVDModule.AddParameter("@group_id", OleDbType.VarChar, 4, DVD.Group.Group_ID, mycommand) DVDModule.AddParameter("@synopsis", OleDbType.VarChar, 1000, DVD.Synopsis, mycommand)
147
DVDModule.AddParameter("@actors", OleDbType.VarChar, 255, DVD.Actors, mycommand) DVDModule.AddParameter("@picture", OleDbType.VarChar, 50, DVD.Picture, mycommand) DVDModule.AddParameter("@status", OleDbType.Boolean, 0, DVD.Status, mycommand) connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function DVDUpdate(ByVal DVD As Entity.DVD) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateDVD", connect) mycommand.CommandType = CommandType.StoredProcedure
DVDModule.AddParameter("@Title", OleDbType.VarChar, 25, DVD.Title, mycommand) DVDModule.AddParameter("@genre_id", OleDbType.VarChar, 4, DVD.Genre.Genre_ID, mycommand) DVDModule.AddParameter("@director", OleDbType.VarChar, 50, DVD.Director, mycommand) DVDModule.AddParameter("@release_date", OleDbType.Date, 0, DVD.Release_Date, mycommand) DVDModule.AddParameter("@language", OleDbType.VarChar, 15, DVD.Language, mycommand) DVDModule.AddParameter("@runtime", OleDbType.Integer, 0, DVD.RunTime, mycommand) DVDModule.AddParameter("@group_id", OleDbType.VarChar, 4, DVD.Group.Group_ID, mycommand) DVDModule.AddParameter("@synopsis", OleDbType.VarChar, 1000, DVD.Synopsis, mycommand) DVDModule.AddParameter("@actors", OleDbType.VarChar, 255, DVD.Actors, mycommand) DVDModule.AddParameter("@picture", OleDbType.VarChar, 50, DVD.Picture, mycommand) DVDModule.AddParameter("@refer_no", OleDbType.VarChar, 7, DVD.Refer_No, mycommand)
148
connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function DVDStatusUpdate(ByVal DVD As Entity.DVD) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateDVDStatus", connect) mycommand.CommandType = CommandType.StoredProcedure DVDModule.AddParameter("@status", OleDbType.Boolean, 0, DVD.Status, mycommand)
DVDModule.AddParameter("@refer_no", OleDbType.VarChar, 7, DVD.Refer_No, mycommand) connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function FindDVDByRefer(ByVal ReferNo As String) As IEnumerable(Of Entity.DVD) Dim DVD As New List(Of Entity.DVD)() Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_selectDVDbyRefer", connect) mycommand.CommandType = CommandType.StoredProcedure mycommand.Parameters.Add("@refer_No", OleDbType.VarChar).Value = ReferNo connect.Open()
149
Using rdr As OleDbDataReader = mycommand.ExecuteReader While rdr.Read DVD.Add(rdr("refer_no").ToString(), _ rdr("title").ToString(), _ rdr("genre_id").ToString(), _ rdr("genre_name").ToString(), _ rdr("director").ToString(), rdr("release_date").ToString(), _ rdr("language").ToString(), rdr("runtime").ToString(), _ rdr("group_id").ToString(), _ rdr("group_name").ToString(), _ rdr("days").ToString(), rdr("price").ToString(), rdr("fee").ToString(), _ rdr("synopsis").ToString(), rdr("actors").ToString(), _ rdr("picture").ToString(), rdr("status").ToString()) End While End Using End Using End Using Catch sqlex As OleDbException Throw New Exception(sqlex.Message.ToString()) End Try Return DVD End Function
Dengan mengetikkan sintaks diatas kita telah membuat beberapa fungsi, seperti insert, update, update dvd status maupun view data DVD. Sekarang kembali pada form DVD, pertama-tama adalah buat variable class seperti dibawah. #Region "Deklarasi" Protected AccessDVD As New AccessData.AccessDVD Dim columns As String() = {} Dim filenaming As String #End Region
Selanjutnya buat procedure untuk menampilkan data Group dan Genre pada masing-masing ComboBox, seperti dibawah. Private Sub SortCbGenre() Dim GenreList As New List(Of Entity.Genre) From {{"G00", "- Choice -"}} DVDModule.FillListWithoutParam(GenreList, columns, "usp_SelectGenre", _ GetType(Entity.Genre)) CbGenre.DataSource = GenreList CbGenre.DisplayMember = "Genre_Name" CbGenre.ValueMember = "Genre_ID" End Sub
150
Private Sub SortCbGroup() Dim GroupList As New List(Of Entity.Group) From {{"GR00", "- Choice -", 0, 0, 0}} DVDModule.FillListWithoutParam(GroupList, columns, "usp_SelectGroup", _ GetType(Entity.Group)) CbGroup.DataSource = GroupList CbGroup.DisplayMember = "Group_Name" CbGroup.ValueMember = "Group_ID" End Sub
Lalu ketik sintaks untuk meng-copy gambar seperti dibawah Private Sub CopyImage() If Trim(txtPath.Text) <> Application.StartupPath & "\" & filenaming Then Dim fFile As New IO.FileInfo(Trim(txtPath.Text)) fFile.CopyTo(Application.StartupPath & "\" & filenaming, True) End If End Sub
Seperti pada form customer untuk form ini juga kita membuat auto number untuk field Refer No, sintaks nya seperti dibawah Private Function ReferNo() As String Dim DVDList As New List(Of Entity.DVD) DVDModule.FillListWithoutParam(DVDList, columns, "usp_selectDVDtop1", _ GetType(Entity.DVD)) If DVDList.Count = 0 Then txtReferNo.Text = "0000001" Else txtReferNo.Text = Format(Val(CInt(DVDList.First.Refer_No) + 1), "0000000") End If Return txtReferNo.Text End Function Private Sub Dim Dim For
Clear() C As Control T As TextBox Each C In Me.GbDetail.Controls If TypeOf C Is TextBox Then T = CType(C, TextBox) If UCase(T.Name) <> UCase("txtReferNo") Then T.Text = "" End If End If
Next lblStatus.Text = "" txtPath.Text = "" txtRun.Text = "0" DtDate.Text = Now CbGenre.SelectedIndex = 0 CbGroup.SelectedIndex = 0 PbImage.Image = Nothing End Sub
151
Dan terakhir adalah dengan membuat procedure untuk menampilkan data DVD pada form, dengan sintaks seperti dibawah. Private Sub ViewDVD() Dim i As Integer Dim DVDlist As List(Of Entity.DVD) = AccessDVD.FindDVDByRefer(txtReferNo.Text) txtReferNo.Text = DVDlist.First.Refer_No txtTitle.Text = DVDlist.First.Title txtDirector.Text = DVDlist.First.Director DtDate.Text = DVDlist.First.Release_Date txtActor.Text = DVDlist.First.Actors txtLanguage.Text = DVDlist.First.Language txtRun.Text = DVDlist.First.RunTime txtSinopsis.Text = DVDlist.First.Synopsis txtRental.Text = DVDlist.First.Group.Days txtPrice.Text = DVDlist.First.Group.Price txtfee.Text = DVDlist.First.Group.Fee i = CbGroup.FindStringExact(DVDlist.First.Group.Group_Name) CbGroup.SelectedIndex = i i = CbGenre.FindStringExact(DVDlist.First.Genre.Genre_Name) CbGenre.SelectedIndex = i If DVDlist.First.Picture <> "" Then txtPath.Text = Application.StartupPath & "\" & DVDlist.First.Picture Dim fsImage As New System.IO.FileStream(txtPath.Text, IO.FileMode.Open, IO.FileAccess.Read) Dim MyImage As Image = Image.FromStream(fsImage) PbImage.Image = MyImage fsImage.Close() fsImage.Dispose() End If lblStatus.Text = If(DVDlist.First.Status = "True", "Available", "Not Available") End Sub
Klik ganda pada form, dan ketikkan sintaks dibawah Try PbImage.SizeMode = PictureBoxSizeMode.StretchImage SortCbGroup() SortCbGenre() If Operate = "Add" Then ReferNo() Else ViewDVD() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
152
Lalu pada event handler CbGroup_SelectedIndexChanged ketikkan sintaks dibawah ini, sintaks berikut berfungsi jika pada saat pengguna memilih data pada CbGroup maka aplikasi menampilkan detail dari group, seperti Rental Days, Price. If CbGroup.SelectedIndex = 0 Then Exit Sub Try Dim GroupList As New List(Of Entity.Group) DVDModule.FillListWithoutParam(GroupList, columns, "usp_selectgroup", _ GetType(Entity.Group)) Dim group = (From grp In GroupList Where grp.Group_ID.Equals(CbGroup.SelectedValue) ).Single txtRental.Text = group.Days txtfee.Text = group.Fee txtPrice.Text = group.Price Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Klik ganda button cancel dan ketik seperti dibawah. If Operate = "Add" Then Clear() Else Operate = Nothing Me.Close() End If
Lalu untuk menampilkan gambar pada PictureBox kli ganda pada button Edit, dan ketikkan sintaks seperti dibawah. Try 'Filter file extension OFD.Filter = "Image Files (*.JPEG, *.jpg, *.bmp, *.gif, *.png)|*.JPEG; *.jpg; *.bmp; *.gif; *.png" If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then txtPath.Text = OFD.FileName Dim fsImage As New System.IO.FileStream(txtPath.Text, IO.FileMode.Open, IO.FileAccess.Read) Dim MyImage As Image = Image.FromStream(fsImage) PbImage.Image = MyImage fsImage.Close() fsImage.Dispose() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
153
Sedangkan untuk menghilangkan gambar pada PictureBox, klik ganda button Cancel, dan ketikkan sintaks seperti dibawah : txtPath.Text = "" PbImage.Image = Nothing
Pada event handler txtRun_Keypress ketikkan sintaks dibawah ini. Try If Not ((e.KeyChar >= "0" And e.KeyChar <= "9") Or e.KeyChar = vbBack) Then e.Handled() = True End If Catch ex As Exception MsgBox(ex.Message) End Try
Selanjutnya untuk klik ganda button Save untuk menyimpan data. Try If CbGenre.SelectedIndex = 0 OrElse CbGroup.SelectedIndex = 0 Then MsgBox("Pilih Group atau genre DVD terlebih dahulu", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If filenaming = "" If txtPath.Text <> "" Then filenaming = txtReferNo.Text & (Mid(txtPath.Text, InStrRev(txtPath.Text, "."), Len(txtPath.Text)))
Dim DVD As New Entity.DVD With {.Refer_No = txtReferNo.Text, .Title = txtTitle.Text, _ .Genre = New Entity.Genre With {.Genre_ID = CbGenre.SelectedValue}, _ .Director = txtDirector.Text, .Release_Date = DtDate.Text, _ .Language = txtLanguage.Text, .RunTime = txtRun.Text, _ .Group = New Entity.Group With {.Group_ID = CbGroup.SelectedValue}, _ .Synopsis = txtSinopsis.Text, .Actors = txtActor.Text, _ .Picture = filenaming, .Status = True} Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then If Operate = "Add" Then AccessDVD.DVDInsert(DVD) If txtPath.Text <> "" Then CopyImage() Clear() ReferNo() Else
154
Else AccessDVD.DVDUpdate(DVD) If txtPath.Text <> "" Then CopyImage() MsgBox("Update Selesai", MsgBoxStyle.Information, "DVD Rental") End If End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Selanjutnya pada event handler F_DVD_Closing ketikkan sintaks dibawah ini : Operate = Nothing
Buka F_Main (Main Menu) pada MenuStrip Data > DVD > Add , klik ganda dan ketikkan sintaks dibawah : Try Operate = "Add" Dim frm_dvd As New F_DVD frm_dvd.ShowDialog() Operate = Nothing Catch ex As Exception MsgBox(ex.Message) End Try
Jalankan program dan buka form DVD, lalu masukkan data-data yang ada pada form dan simpan, apakah berjalan dengan benar. Untuk proses update dan List DVD, bisa dilihat pada project yang disertakan pada buku, sebagai latihan para pembaca. Penulis harap para pembaca bisa menyelesaikan dengan baik.
155
Gambar 4.45
Gambar 4.46
Gambar 4.47 156
Jika sudah selesai dengan Form DVD selanjutnya buka F_Main (Main Menu), buka jendela Code, buat variable Class seperti dibawah : #Region "Deklarasi" Dim DVDList As New List(Of Entity.DVD) #End Region
Ketikkan 2 prosedure dibawah yang berfungsi untuk menampilkan data pada DgView. Private Sub ListDVD() Try Dim columns As String() = {"Refer_No", "Title", "Actors", "Director", "Language", "Status"} DVDModule.FillListWithoutParam(DVDList, columns, "usp_SelectDVDList", _ GetType(Entity.DVD)) FormatGridWithBothTableAndColumnStyles() DgView.DataSource = DVDList Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Information, "DVD Rental") End Try End Sub
Private Sub FormatGridWithBothTableAndColumnStyles() Me.DgView.DefaultCellStyle.ForeColor = Color.Navy Me.DgView.RowsDefaultCellStyle.BackColor = Color.AliceBlue Me.DgView.GridColor = Color.Blue Me.DgView.BorderStyle = BorderStyle.Fixed3D Me.DgView.RowHeadersBorderStyle = BorderStyle.Fixed3D DgView.AutoGenerateColumns = False Dim ReferColumn As New DataGridViewTextBoxColumn() ReferColumn.DataPropertyName = "Refer_no" ReferColumn.HeaderText = "Refer No" ReferColumn.Width = 80
Dim TitleColumn As New DataGridViewTextBoxColumn() TitleColumn.DataPropertyName = "Title" TitleColumn.HeaderText = "Title" TitleColumn.Width = 150 Dim ActColumn As New DataGridViewTextBoxColumn() ActColumn.DataPropertyName = "Actors" ActColumn.HeaderText = "Actors" ActColumn.Width = 150 Dim DirecColumn As New DataGridViewTextBoxColumn() DirecColumn.DataPropertyName = "Director" DirecColumn.HeaderText = "Director" DirecColumn.Width = 150 Dim LangColumn As New DataGridViewTextBoxColumn() LangColumn.DataPropertyName = "Language" LangColumn.HeaderText = "Language" LangColumn.Width = 150
157
Dim StatusColumn As New DataGridViewTextBoxColumn() StatusColumn.DataPropertyName = "status" StatusColumn.HeaderText = "Status" StatusColumn.Width = 80 DgView.Columns.Add(ReferColumn) DgView.Columns.Add(TitleColumn) DgView.Columns.Add(ActColumn) DgView.Columns.Add(DirecColumn) DgView.Columns.Add(LangColumn) DgView.Columns.Add(StatusColumn) End Sub
Dan tambahkan sintaks berikut pada event handler F_Main_Load ListDVD
Dan jalankan program, maka tampilan pada Main Menu akan seperti gambar dibawah.
Gambar 4.48
158
4.7 Membuat Form Rental DVD Form ini merupakan form dimana yang paling sering di gunakan, berfungsi untuk menyimpan data peminjaman DVD. Pada form ini kita membutuhkan 2 table untuk menyimpan data peminjaman, ikuti langkah-langah dibawah untuk membuat table-table yang dibutuhkan. Pertama adalah dengan membuat table t_totalrental dengan field-field seperti dibwah. Field Name
Data Type
Field size
Primary Key
R_ID
AutoNumber
Ren_ID
Text
14
PK (*)
Refer_cust
Text
8
FK
Ren_date
Date/Time
Tot_fee
Currency
Nor_cost
Currency
Tot_cost
Currency
Selanjutnya adalah membuat table t_detailrental, dimana satu Ren_ID (t_totalrental) bisa memiki banyak rental detail, dengan field-field seperti dibawah. Field Name
Data Type
Field size
Primary Key
Ren_ID
Text
14
PK (*)
Nos
Number
integer
FK
Refer_no
Text
7
Ret_date
Date/Time
Late
Number
Cost_fee
Currency
Cost_normal
Currency
return
Yes/No
Integer
159
Pada jendela MS Access, buka jendela Relationships (Database Tools > Relationships) lalu tambahkan table T_cust, T_totalrental dan T_detailrental. Selanjutnya Drag field refer_cust (t_totalrental) pada table t_cust (field refer_cust), maka akan muncul tampilan Edit Relationships, dan klik OK. Lakukan hal yang sama pada field refer_no pada table T_detailrental dengan table T_DVD (refer_no). Maka kita akan memilki diagram relationships seperti dibawah.
Gambar 4.49 Langkah berikutnya adalah membuat Query usp_SelectRenMasterTop1, usp_InsertTotal, usp_InsertDetail, usp_UpdateDVDStatus. Dengan sintaks SQL nya seperti dibawah. SELECT TOP 1 t_totalrental.* FROM t_totalrental WHERE (((t_totalrental.ren_date)=Date())) ORDER BY t_totalrental.R_ID DESC; INSERT INTO t_totalrental ( ren_id, refer_cust, ren_date, nor_cost, tot_cost, tot_fee ) VALUES ([@ren_id], [@refer_cust], [@ren_date], [@nor_cost], [@tot_cost], 0); INSERT INTO t_totalrental ( ren_id, refer_cust, ren_date, nor_cost, tot_cost, tot_fee ) VALUES ([@ren_id], [@refer_cust], [@ren_date], [@nor_cost], [@tot_cost], 0); 160
INSERT INTO t_detailrental ( ren_id, nos, refer_no, cost_normal, cost_fee ) VALUES ([@ren_id], [@nos], [@refer_no], [@cost_normal], 0); UPDATE t_dvd SET t_dvd.status = [@status] WHERE (((t_dvd.refer_no)=[@refer_no]));
Selanjutnya pada project kita (DVD Rental), tambahkan sebuah form dan ubah properties nya seperti dibawah. Name
F_Rental
ShowInTaksbar
False
Text
Add Rental
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
Selanjutnya tambahkan control-control seperti dibawah: 6 textbox, 4 button, 1 PictureBox, 1 GroupBox, 1ListView, 1 Tooltip dan 6 Label. Lalu susun control seperti dibawah dan ubah properties seperti dibawah :
Gambar 4.50 161
Textbox1 Name
txtReferCust
Enabled
False
Textbox2 Name
txtFirst
Enabled
False
TextBox3 Name
txtLast
Enabled
False
TextBox4 Name
txtPhone
Enabled
False
TextBox5 Name
txtrefer_no
TextBox6 Name
txtTotal
BackColor
Black
ForeColor
Chartreuse
GroupBox1 Name
GbCustomer
Text
Customer Detail
Button1 Name
btnAdd
Text
Add
Button2 Name
btnRemove
Text
Remove
Button3 Name
btnSave
Text
&Save 162
Button4 Name
btnCancel
Text
&Cancel
PictureBox1 Name
Pbmage
SizeMode
StretchImage
ListView1 Name
LsvDVD
FullrowSelect
True
GridLines
True
View
Details
Lalu pada LsvDVD pada properties “Columns” klik tand “…” lalu akan muncul form seperti dibawah.
Gambar 4.51 Selanjutnya klik button “Add” dan ubah properties “Text” menjadi Refer No, lakukan hal diatas untuk menambah kolom (Title, Price dan Days). Masuk pada jendel code lalu buat variable seperti dibawah 163
#Region "Deklarasi" Dim AccessDVD As New AccessData.AccessDVD Dim AccessRenMaster As New AccessData.AccessRentalMaster Dim AccessRenDetail As New AccessData.AccessRentalDetail Dim columns As String() = {} #End Region
Lalu buat procedure untuk menampilkan data customer seperti dibawah. Private Sub Dim Dim Dim Dim Dim
ViewCustomer() CustList As New List(Of Entity.Customer) Coltype As System.Data.OleDb.OleDbType() = {System.Data.OleDb.OleDbType.VarChar} FieldName As String() = {"@refer_Cust"} Size As Integer() = {8} Value As String() = {txtReferCust.Text}
DVDModule.FillListWithParam(CustList, columns, "usp_selectCustbyRefer", _ GetType(Entity.Customer), FieldName, _ Coltype, Size, Value) If CustList.Count = 0 Then MsgBox("Reference No yang dicari salah atau tidak ada") Exit Sub End If txtReferCust.Text = CustList.First.Refer_Cust txtFirst.Text = CustList.First.First_Name txtLast.Text = CustList.First.Last_Name txtPhone.Text = CustList.First.Telp If CustList.First.Picture <> "" Then PbImage.Image = Image.FromFile(Application.StartupPath & "\" & CustList.First.Picture) End If End Sub
Selanjutnya adalah membuat procedure untuk menampilkan data DVD dan di masukkan kedalam LsvDVD seperti dibawah Private Sub ViewDVD() Dim list As List(Of Entity.DVD) = AccessDVD.FindDVDByRefer(txtrefer_no.Text) If list.First.Status = "False" Then MsgBox("Status DVD lagi keluar", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim lSingleItem As ListViewItem lSingleItem = LsvDVD.Items.Add(txtrefer_no.Text) lSingleItem.SubItems.Add(list.First.Title) lSingleItem.SubItems.Add(list.First.Group.Price) lSingleItem.SubItems.Add(list.First.Group.Days) txtTotal.Text = CDbl(txtTotal.Text) + list.First.Group.Price End Sub
164
Prosedure kita gunakan pada saat user akan memasukkan data peminjaman kedalam LsvDVD, dan secara otomatis harga sewa DVD akan tampil pada txtTotal. Sedangkan procedure dibawah ini untuk membuat Rental ID dengan format nomor urut dan tanggal penginputan, dengan cara mencari data pada terakhir pada tanggal penginputan lalu ditambah 1. Private Function RentalID() As String
Dim RenList As New List(Of Entity.RentalMaster) columns = {"ren_id"} DVDModule.FillListWithoutParam(RenList, columns, "usp_SelectRenMasterTop1", _ GetType(Entity.RentalMaster)) If RenList.Count = 0 Then RentalID = "001-" & Format(Now.Date, "MM/dd/yyyy") Else
RentalID = Format(Val(CInt(Microsoft.VisualBasic.Left(RenList.First.Ren_ID, RenList.First.Ren_ID.Length - 11)) + 1), "000") & "-" & Format(Now.Date, "MM/dd/yyyy") End If Return RentalID End Function
Selanjutnya adalah klik ganda form Rental yang berfungsi untuk menampilkan form awal dengan menampilkan data Customer yang akan meminjam DVD, dan ketikkan sintaks dibawah Try txtTotal.Text = "0" ViewCustomer() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Buat event handler txtrefer_no_DoubleClick dan ketikkan sintaks dibawah, sintak ini berfungsi untuk memanpilkan form tambahan (List DVD) hal ini untuk memudahkan jika user tidak tau id DVD. Operate = "Edit" Dim frm_HDVD As New H_DVD frm_HDVD.ShowDialog() txtrefer_no.Text = frm_HDVD.txtSearch.Text Operate = Nothing
165
Selanjutnya buat event hander txtRefer_no_Keyup, dan ketikkan sintaks dibawah, sedangkan sintaks ini berfungsi untuk memanggil proses pada event handler txtrefer_no_DoubleClick pada saat user menekan F8 If e.KeyCode = Shortcut.F8 Then txtrefer_no_DoubleClick(sender, e) End If
Untuk memberi informasi bahwa cara menampilkan form dengan menekan F8 dan double click adalah dengan membuat hint, caranya adalah dengan membuat event handler txtrefer_no_MouseHover dan ketikkan sintaks berikut : ToolTip1.SetToolTip(txtrefer_no, "Silahkan klik ganda atau menekan F8 untuk menampil List") ToolTip1.Active = True
Lalu klik ganda button “Add” dan ketikkan sintaks dibawah ini : Try If txtrefer_no.Text = "" Then MsgBox("Masukkan DVD refer no", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim DVDList As New List(Of Entity.DVD) Dim Coltype As System.Data.OleDb.OleDbType() = {System.Data.OleDb.OleDbType.VarChar} Dim FieldName As String() = {"@refer_No"} Dim Size As Integer() = {7} Dim Value As String() = {txtrefer_no.Text} columns = {"refer_no"} DVDModule.FillListWithParam(DVDList, columns, "usp_selectDVDbyRefer", _ GetType(Entity.DVD), FieldName, _ Coltype, Size, Value)
If DVDList.Count = 0 Then MsgBox("Reference No yang dicari salah atau tidak ada") txtrefer_no.Focus() txtrefer_no.SelectAll() Exit Sub End If For i = 0 To (LsvDVD.Items.Count - 1) If txtrefer_no.Text = LsvDVD.Items(i).Text Then MsgBox("DVD sudah ada pada list pemesanan", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Next
166
ViewDVD() txtrefer_no.Text = "" Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Sintaks diatas ini berfungsi untuk memasukkan data peminjaman DVd kedalam LsvDVD, dengan mengecek apakah Status DVD keluar atau tidak, jika keluar maka akan ada pesan yang muncul. Lalu kita akan membuat fungsi untuk menghapus data pada LsvDVD, jika user salah dalam menginput data (Sebelum penyimpanan), dengan cara klik ganda button Remove dan ketikkan sintaks dibawah. Try If LsvDVD.SelectedItems.Count = 0 Then Exit Sub Dim Price As Double Dim intIndex As Integer With LsvDVD intIndex = .SelectedIndices(0) Price = .Items(intIndex).SubItems(2).Text End With txtTotal.Text = CDbl(txtTotal.Text) - Price For Each lvItem As ListViewItem In LsvDVD.SelectedItems lvItem.Remove() Next LsvDVD.SelectedItems.Clear() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Klik ganda button Cancel dan ketikkan sintaks dibawah ini. Try txtrefer_no.Text = "" LsvDVD.Items.Clear() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Selanjutnya adalah membuat fungsi untuk penyimpanan data Rental. Seperti halnya diatas untuk rental ini kita memerlukan 2 buah table pertama TotalRental yang kedua Detail Rental, dalam 1 table TotalRental bisa memiliki beberapa baris DetailRental. Dan pada saat kita memasukkan
167
data Rental maka secara otomatis status dari DVD menjadi False (Keluar). Ketikkan sintaks dibawah untuk membuat fungsi-fungsi berikut. Pertama-tama
tambahkan
Class
pada
folder
Entity
dan
ganti
namanya
menjadi
“RentalMaster.vb” lalu ketikkan seperti dibawah. Namespace Entity Public Class RentalMaster
Private m_renid As String Public Property Ren_ID() As String Get Return m_renid End Get Set(ByVal value As String) If value = "" Then Throw New Exception("Masukkan Rental ID") End If m_renid = value End Set End Property Public Property Customer As New Entity.Customer Public Property Ren_Date() As Date Public Property Total_Fee() As Double Public Property Normal_Cost() As Double Public Property Total_Cost() As Double End Class End Namespace
Dan tambah sebuah Class lagi pada folder Entity dengan nama “RentalDetail.vb” dan ketikkan sintaks dibawah ini. Namespace Entity Public Class RentalDetail Public Property RenMaster() As New Entity.RentalMaster
Public Property Nos As New Int16 Public Property DVD() As New Entity.DVD Public Property Ret_Date() As Date
168
Public Property Late() As Int16 Public Property Cost_Fee() As Double Public Property Cost_Normal() As Double Public Property Returns As Boolean End Class End Namespace
Setelah selesai membuat Class Entity seperti dibawah selanjutnya adalah membuat fungsi untuk menyimpan data Rental. Tambahkan Class baru pada Folder “AccessData” dan ganti menjadi “AccessRental.vb” , lalu ketikkan sintaks dibawah. Imports System.Data Imports System.Data.OleDb Namespace AccessData Public Class AccessRental Public Function RenMasterInsert(ByVal RenMaster As Entity.RentalMaster) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertTotal", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterRen_ID As OleDbParameter = New OleDbParameter("@ren_id", OleDbType.VarChar, 14) parameterRen_ID.Value = RenMaster.Ren_ID Dim parameterRefer_Cust As OleDbParameter = New OleDbParameter("@refer_cust", OleDbType.VarChar, 8) parameterRefer_Cust.Value = RenMaster.Customer.Refer_Cust Dim parameterRen_Date As OleDbParameter = New OleDbParameter("@ren_date", OleDbType.Date) parameterRen_Date.Value = RenMaster.Ren_Date Dim parameterNor_Cost As OleDbParameter = New OleDbParameter("@nor_cost", OleDbType.Currency) parameterNor_Cost.Value = RenMaster.Normal_Cost Dim parameterTot_Cost As OleDbParameter = New OleDbParameter("@tot_cost", OleDbType.Currency) parameterTot_Cost.Value = RenMaster.Total_Cost With mycommand.Parameters .Add(parameterRen_ID) .Add(parameterRefer_Cust) .Add(parameterRen_Date) .Add(parameterNor_Cost) .Add(parameterTot_Cost) End With
169
With mycommand.Parameters .Add(parameterRen_ID) .Add(parameterRefer_Cust) .Add(parameterRen_Date) .Add(parameterNor_Cost) .Add(parameterTot_Cost) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function RenDetailInsert(ByVal RenDetail As Entity.RentalDetail) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_InsertDetail", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterRen_ID As OleDbParameter = New OleDbParameter("@ren_id", OleDbType.VarChar, 14) parameterRen_ID.Value = RenDetail.RenMaster.Ren_ID Dim parameterNos As OleDbParameter = New OleDbParameter("@nos", OleDbType.Integer) parameterNos.Value = RenDetail.Nos Dim parameterRefer_No As OleDbParameter = New OleDbParameter("@refer_no", OleDbType.VarChar, 7) parameterRefer_No.Value = RenDetail.DVD.Refer_No Dim parameterCost_Normal As OleDbParameter = New OleDbParameter("@cost_normal", OleDbType.Currency) parameterCost_Normal.Value = RenDetail.Cost_Normal With mycommand.Parameters .Add(parameterRen_ID) .Add(parameterNos) .Add(parameterRefer_No) .Add(parameterCost_Normal) End With Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
170
Dan buka Class AccessDVD lalu ketikan sintaks untuk mengubah status DVD Public Function DVDStatusUpdate(ByVal DVD As Entity.DVD) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateDVDStatus", connect) mycommand.CommandType = CommandType.StoredProcedure DVDModule.AddParameter("@status", OleDbType.Boolean, 0, DVD.Status, mycommand) DVDModule.AddParameter("@refer_no", OleDbType.VarChar, 7,
DVD.Refer_No, mycommand) connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Kembali ke Form Rental lalu Klik ganda button Save dan ketikkan sintaks dibawah. Try If LsvDVD.Items.Count = 0 Then MsgBox("Masukkan DVD yang mau di Rental") Exit Sub End If Dim RenId As String = RentalID() Dim RenMaster As New Entity.RentalMaster With {.Ren_ID = RenId, .Customer = New Entity.Customer With {.Refer_Cust = txtReferCust.Text}, .Ren_Date = Now.Date, .Normal_Cost = txtTotal.Text, .Total_Cost = txtTotal.Text}
Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then AccessRenMaster.RenMasterInsert(RenMaster) For i = 0 To (LsvDVD.Items.Count - 1) Dim RenDetail As New Entity.RentalDetail With {.RenMaster = New Entity.RentalMaster With {.Ren_ID = RenId}, .Nos = i + 1, .DVD = New Entity.DVD With {.Refer_No = LsvDVD.Items(i).Text}, .Cost_Normal = LsvDVD.Items(i).SubItems(2).Text}
171
AccessRenMaster.RenDetailInsert(RenDetail) Dim DVD As New Entity.DVD With {.Refer_No = LsvDVD.Items(i).Text, .Status = False} AccessDVD.DVDStatusUpdate(DVD) Next btnCancel.PerformClick() MsgBox("Data telah disimpan", MsgBoxStyle.Information, "DVD Rental") End If
Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Untuk saat ini kita masih belum bias mengoperasikan form Rental ini, karena pada form Rental kita menampilkan data Customer, oleh karena itu sebelum menampilkan form rental kita memerlukan sebuah form untuk menampilkan data customer. Ikuti langkah-langkah dibawah. Tambahkan sebuah Form dan tambahkan 1 TextBox, 1 Label dan 3 Button. Ubah propertiesnya seperti dibawah. Name
F_RenBox
ShowInTaksbar
False
Text
Type Reference Customer
StartPosition
CenterScreen
ControlBox
False
FormBorderStyle
FixedSingle
TextBox1 Name
txtReferNo
Button1 Name
btnOK
Text
OK
Button2 Name
btnSearch
172
Text
Search
Button3 Name
btnCancel
Text
Cancel
Name
btnSave
Text
&Save
Button2 Name
btnCancel
Text
&Cancel
Lalu atur posisi nya seperti gambar dibawah.
Gambar 3.52 Klik ganda button Cancel dan ketikkan sintaks berikut : Me.Close() Selanjutnya klik ganda button Search dan ketikkan sintaks dibawah, yang berfungsi untuk menampilkan form Customer List. Operate = "Edit" Dim frm_HCust As New H_Cust frm_HCust.ShowDialog() txtReferNo.Text = frm_HCust.txtSearch.Text
Dan terakhir adalah klik ganda button OK lalu ketikkan sintaks dibawah, yang berfungsi untuk menvalidasi apakah customer id benar, jika benar maka akan menampilkan form Rental dengan data customer yang dicari.
173
Try If txtReferNo.Text = "" Then MsgBox("Masukkan reference No", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If Dim CustList As New List(Of Entity.Customer) Dim Coltype As System.Data.OleDb.OleDbType() = {System.Data.OleDb.OleDbType.VarChar} Dim FieldName As String() = {"@refer_Cust"} Dim Size As Integer() = {8} Dim Value As String() = {txtReferNo.Text} Dim columns As String() = {"refer_cust"} DVDModule.FillListWithParam(CustList, columns, "usp_selectCustbyRefer", _ GetType(Entity.Customer), FieldName, _ Coltype, Size, Value) If CustList.Count = 0 Then MsgBox("Reference No yang dicari salah atau tidak ada") Exit Sub End If If FormShow = "Rental" Then FormShow = Nothing Dim frm_ren As New F_Rental frm_ren.txtReferCust.Text = txtReferNo.Text frm_ren.ShowDialog() Me.Close() ElseIf FormShow = "Return" Then FormShow = Nothing Dim frm_ret As New F_Return frm_ret.txtReferCust.Text = txtReferNo.Text frm_ret.ShowDialog() Me.Close() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Buka Form Utama (Main Menu), pada menu item Tools > Rental (klik ganda) ketikkan sintaks dibawah (untuk menampilkan form Rental Box). Try FormShow = "Rental" Dim frm_renBox As New F_RenBox frm_renBox.ShowDialog() FormShow = Nothing Catch ex As Exception MsgBox(ex.Message) End Try
174
Jalankan program dan pada Menu Utama klik Tools > Rental, selanjutnya cari customer, dan klik OK. Masukkan data DVD pada form Rental.
Gambar 3.53
Gambar 3.54 4.7 Membuat Form Return DVD Setelah selesai membuat form peminjaman (Rental) maka selanjutnya adalah membuat form Return (Pengembalian) DVD oleh customer. Tambahkan sebuah Form dalam project dan ubah propertiesnya seperti dibawah. Name
F_Return
ShowInTaksbar
False
Text
Return DVD 175
StartPosition
CenterScreen
MaximizedBox
False
MinimizedBox
False
FormBorderStyle
FixedSingle
BackColor
White
Dan tambahkan beberapa control seperti berikut 5 textbox, 5 label, 1 GroupBox, 1 PictureBox, 4 button dan 2 ListView. Dan ubah properties seperti dibawah. Textbox1 Name
txtReferCust
Enabled
False
Textbox2 Name
txtFirst
Enabled
False
TextBox3 Name
txtLast
Enabled
False
TextBox4 Name
txtPhone
Enabled
False
TextBox5 Name
txtTotal
BackColor
Black
ForeColor
Chartreuse
GroupBox1 Name
GbCustomer
Text
Customer Detail
Button1 Name
btnReturn 176
Text
Return
Button2 Name
btnRemove
Text
Remove
Button3 Name
btnSave
Text
&Save
Button4 Name
btnCancel
Text
&Cancel
PictureBox1 Name
Pbmage
SizeMode
StretchImage
ListView1 Name
LsvDVD
FullrowSelect
True
GridLines
True
View
Details
ListView2 Name
LsvReturn
FullrowSelect
True
GridLines
True
View
Details
Tambahkan kolom pada LsvDVD seperti berikut : Rental ID, Refer No, Title, Price, Days, Date dan Fee. Sedangkan untuk LsvReturn tambahkan kolom seperti berikut : Rental ID, Refer No, Due Date, Late Days, Total Fee. Dan susun seperti gambar dibawah ini.
177
Gambar 3.55 Lalu
pada
MS
Access
buat
lah
query
seperti
berikut
:
usp_selectRental,
usp_UpdateRenMaster, usp_UpdateRenDetail. Dengan sintaks SQL sebagai berikut : SELECT t_totalrental.Ren_ID, t_detailrental.Nos, t_group.days, t_group.price, t_group.fee, t_totalrental.Ren_Date, t_dvd.title, t_cust.refer_cust, t_cust.first_name, t_cust.last_name, t_cust.telp, t_detailrental.refer_no FROM t_cust INNER JOIN (t_group INNER JOIN (t_dvd INNER JOIN (t_totalrental INNER JOIN t_detailrental ON t_totalrental.Ren_ID = t_detailrental.Ren_ID) ON t_dvd.refer_no = t_detailrental.refer_no) ON t_group.group_id = t_dvd.group_id) ON t_cust.refer_cust = t_totalrental.refer_cust WHERE (((t_cust.refer_cust)=[@refer_cust]) AND ((t_detailrental.return)=0)); UPDATE t_totalrental SET t_totalrental.Tot_Fee = t_totalrental.Tot_Fee+[@Tot_Fee], t_totalrental.Tot_Cost = t_totalrental.Tot_cost+[@Tot_Cost] WHERE (((t_totalrental.Ren_ID)=[@Ren_ID]));
UPDATE t_detailrental SET t_detailrental.Ret_Date = [@Ret_Date], t_detailrental.late = [@late], t_detailrental.cost_fee = [@cost_fee], t_detailrental.return = [@return] WHERE (((t_detailrental.Ren_ID)=[@Ren_ID]) AND ((t_detailrental.Nos)=[@Nos])); 178
Lalu buka Class AccessRental dan ketikkan fungsi-fungsi dibawah ini. Public Function RenMasterUpdate(ByVal RenMaster As Entity.RentalMaster) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateRenMaster", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterTotal_Fee As OleDbParameter = New OleDbParameter("@Tot_Fee", OleDbType.Currency) parameterTotal_Fee.Value = RenMaster.Total_Fee Dim parameterTot_Cost As OleDbParameter = New OleDbParameter("@Tot_Cost", OleDbType.Currency) parameterTot_Cost.Value = RenMaster.Total_Cost Dim parameterRen_ID As OleDbParameter = New OleDbParameter("@ren_id", OleDbType.VarChar, 14) parameterRen_ID.Value = RenMaster.Ren_ID With mycommand.Parameters .Add(parameterTotal_Fee) .Add(parameterTot_Cost) .Add(parameterRen_ID) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function RenDetailUpdate(ByVal RenDetail As Entity.RentalDetail) As OleDbDataReader Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_UpdateRenDetail", connect) mycommand.CommandType = CommandType.StoredProcedure Dim parameterReturnDate As OleDbParameter = New OleDbParameter("@ret_date", OleDbType.VarChar, 7) parameterReturnDate.Value = RenDetail.Ret_Date Dim parameterLate As OleDbParameter = New OleDbParameter("@late", OleDbType.Integer) parameterLate.Value = RenDetail.Late
179
Dim parameterLate As OleDbParameter = New OleDbParameter("@late", OleDbType.Integer) parameterLate.Value = RenDetail.Late Dim parameterCostFee As OleDbParameter = New OleDbParameter("@cost_fee", OleDbType.Currency) parameterCostFee.Value = RenDetail.Cost_Fee Dim parameterReturn As OleDbParameter = New OleDbParameter("@return", OleDbType.Boolean) parameterReturn.Value = RenDetail.Returns Dim parameterRen_ID As OleDbParameter = New OleDbParameter("@ren_id", OleDbType.VarChar, 14) parameterRen_ID.Value = RenDetail.RenMaster.Ren_ID Dim parameterNos As OleDbParameter = New OleDbParameter("@nos", OleDbType.Integer) parameterNos.Value = RenDetail.Nos With mycommand.Parameters .Add(parameterReturnDate) .Add(parameterLate) .Add(parameterCostFee) .Add(parameterReturn) .Add(parameterRen_ID) .Add(parameterNos) End With connect.Open() Using result As OleDbDataReader = mycommand.ExecuteReader(CommandBehavior.CloseConnection) Return result End Using End Using End Using Catch SqlEx As OleDbException Throw New Exception(SqlEx.Message.ToString()) End Try End Function
Public Function FindRenByReferCust(ByVal Refer_cust As String) As List(Of Entity.RentalDetail) Dim RenDetail As New List(Of Entity.RentalDetail)() Try Using connect As New OleDbConnection(My.Settings.DVDConnection) Using mycommand As OleDbCommand = New OleDbCommand("usp_selectRental", connect) mycommand.CommandType = CommandType.StoredProcedure mycommand.Parameters.Add("@refer_cust", OleDbType.VarChar).Value = Refer_cust connect.Open() Using rdr As OleDbDataReader = mycommand.ExecuteReader
180
Using rdr As OleDbDataReader = mycommand.ExecuteReader
While rdr.Read Dim RentalDetails As New Entity.RentalDetail RentalDetails.RenMaster.Ren_ID = rdr("Ren_ID").ToString() RentalDetails.Nos = rdr("Nos").ToString() RentalDetails.DVD.Group.Days = rdr("days").ToString() RentalDetails.DVD.Group.Price = rdr("price").ToString() RentalDetails.DVD.Group.Fee = rdr("fee").ToString() RentalDetails.RenMaster.Ren_Date =
rdr("ren_date").ToString() RentalDetails.DVD.Title = rdr("title").ToString() RentalDetails.RenMaster.Customer.Refer_Cust = rdr("refer_cust").ToString() RentalDetails.RenMaster.Customer.First_Name = rdr("first_name").ToString() RentalDetails.RenMaster.Customer.Last_Name = rdr("last_name").ToString() RentalDetails.RenMaster.Customer.Telp = rdr("telp").ToString() RentalDetails.DVD.Refer_No = rdr("refer_no").ToString() RenDetail.Add(RentalDetails) End While
End Using End Using End Using Catch sqlex As OleDbException Throw New Exception(sqlex.Message.ToString()) End Try Return RenDetail End Function
Kembali ke form Return buat deklarasi seperti dibawah. #Region "Deklarasi" Protected AccessDVD As New AccessData.AccessDVD Protected AccessRenMaster As New AccessData.AccessRental Dim columns As String() = {} #End Region
Dan seperti pada form Rental kita juga akan menampilkan data customer pada form ini, ketikkan procedure dibawah ini.
181
Private Sub ViewCustomer() Dim CustList As New List(Of Entity.Customer) Dim Coltype As System.Data.OleDb.OleDbType() = {System.Data.OleDb.OleDbType.VarChar} Dim FieldName As String() = {"@refer_Cust"} Dim Size As Integer() = {8} Dim Value As String() = {txtReferCust.Text} DVDModule.FillListWithParam(CustList, columns, "usp_selectCustbyRefer", _ GetType(Entity.Customer), FieldName, _ Coltype, Size, Value)
If CustList.Count = 0 Then MsgBox("Reference No yang dicari salah atau tidak ada") Exit Sub End If txtReferCust.Text = CustList.First.Refer_Cust txtFirst.Text = CustList.First.First_Name txtLast.Text = CustList.First.Last_Name txtPhone.Text = CustList.First.Telp If CustList.First.Picture <> "" Then PbImage.Image = Image.FromFile(Application.StartupPath & "\" & CustList.First.Picture) End If
End Sub
Lalu buat procedure untuk menampilkan data Rental. Private Sub ViewRental() Dim list As List(Of Entity.RentalDetail) = AccessRenMaster.FindRenByReferCust(txtReferCust.Text) Dim lSingleItem As ListViewItem For Each rental In list lSingleItem = LsvDVD.Items.Add(rental.RenMaster.Ren_ID) lSingleItem.SubItems.Add(rental.DVD.Refer_No) lSingleItem.SubItems.Add(rental.DVD.Title) lSingleItem.SubItems.Add(rental.DVD.Group.Price) lSingleItem.SubItems.Add(rental.DVD.Group.Days) lSingleItem.SubItems.Add(rental.RenMaster.Ren_Date) lSingleItem.SubItems.Add(rental.DVD.Group.Fee) lSingleItem.SubItems.Add(rental.Nos) Next End Sub
182
Klik ganda form return dan ketikkan sintaks dibawah : Try txtTotal.Text = "0" ViewCustomer() ViewRental() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Pada sintaks diatas berfungsi untuk menampilkan data Customer dan data peminjaman customer yang dipilih. Lalu klik ganda button Return dan ketikkan sintaks dibawah ini. Try If LsvDVD.SelectedItems.Count = 0 Then Exit Sub Dim intIndex, late As Integer Dim tot_price As Double With LsvDVD intIndex = .SelectedIndices(0) Dim lSingleItem As ListViewItem Dim Lsv As ListViewItem = LsvReturn.FindItemWithText(.Items(intIndex).SubItems(1).Text) If Not (Lsv Is Nothing) Then MsgBox("Data sudah ada pada List DVD Return", MsgBoxStyle.Information, "DVD Rental") Exit Sub End If lSingleItem = LsvReturn.Items.Add(.Items(intIndex).Text) lSingleItem.SubItems.Add(.Items(intIndex).SubItems(1).Text) lSingleItem.SubItems.Add(CDate(.Items(intIndex).SubItems(5).Text).AddDays(CInt(.Items(int Index).SubItems(4).Text))) late = DateDiff(DateInterval.Day,
CDate(.Items(intIndex).SubItems(5).Text).AddDays(CInt(.Items(intIndex).SubItems(4).Text)) , Now.Date) lSingleItem.SubItems.Add(If(late < 0, 0, late)) tot_price = If(late < 0, 0, late) * CInt(.Items(intIndex).SubItems(6).Text) lSingleItem.SubItems.Add(tot_price) lSingleItem.SubItems.Add(.Items(intIndex).SubItems(7).Text) txtTotal.Text = Format(CDbl(txtTotal.Text) + tot_price, "##,###.00") End With Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
183
Pada sintaks ini berfungsi untuk memindahkan data dari LsvDVD ke LsvReturn, jika pengembalian melewati batas waktu yang ditentukan maka secara otomatis nilai nominal yang didenda akan ditampilkan. Klik ganda button Remove dan ketikkan sintaks dibawah: Try Dim intIndex As Integer If LsvReturn.SelectedItems.Count = 0 Then Exit Sub With LsvReturn intIndex = .SelectedIndices(0) txtTotal.Text = Format(CDbl(txtTotal.Text) CDbl(.Items(intIndex).SubItems(4).Text), "##,###.00") End With For Each lvItem As ListViewItem In LsvReturn.SelectedItems lvItem.Remove() Next LsvReturn.SelectedItems.Clear() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Lalu klik ganda button Cancel dan ketikkan sintaks dibawah : Try LsvReturn.Items.Clear() txtTotal.Text = "0" Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Dan terakhir klik ganda button Save dan ketikkan sintaks dibawah. Try Dim mYes_No As String = MsgBox("Apakah kamu ingin menyimpan data ?", vbYesNo, "DVD Rental") If mYes_No = vbYes Then For a = 0 To LsvReturn.Items.Count - 1 Dim RenMaster As New Entity.RentalMaster With {.Ren_ID = LsvReturn.Items(a).Text, .Total_Fee = LsvReturn.Items(a).SubItems(4).Text, .Total_Cost = LsvReturn.Items(a).SubItems(4).Text} AccessRenMaster.RenMasterUpdate(RenMaster) Next For i = 0 To (LsvReturn.Items.Count - 1) Dim RenDetail As New Entity.RentalDetail With {.RenMaster = New Entity.RentalMaster With {.Ren_ID = LsvReturn.Items(i).Text}, .Nos =
184
LsvReturn.Items(i).SubItems(5).Text, .Ret_Date = Now.Date, .Late = LsvReturn.Items(i).SubItems(3).Text, .Cost_Fee = LsvReturn.Items(i).SubItems(4).Text, .Returns = True}
AccessRenMaster.RenDetailUpdate(RenDetail) Dim DVD As New Entity.DVD With {.Refer_No = LsvReturn.Items(i).SubItems(1).Text, .Status = True} AccessDVD.DVDStatusUpdate(DVD) Dim Lsv As ListViewItem = LsvDVD.FindItemWithText(LsvReturn.Items(i).SubItems(1).Text) If Not (Lsv Is Nothing) Then LsvDVD.Items.RemoveAt(Lsv.Index) End If Next btnCancel.PerformClick() MsgBox("Data telah disimpan", MsgBoxStyle.Information, "DVD Rental") End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "DVD Rental") End Try
Lalu buka form Menu Utama ke main menu (Tools > Return) klik ganda dan ketikkan sintaks dibawah. Try FormShow = "Return" Dim frm_renBox As New F_RenBox frm_renBox.ShowDialog() FormShow = Nothing Catch ex As Exception MsgBox(ex.Message) End Try
Jalankan program dan masuk kedalam form Return. Selamat mencoba dan selamat bercoding ria…………
185
Gambar 3.56
186