Artikel ini dikhususkan bagi Anda yang sudah membaca artikel sebelumnya, mendownload sample program dan mencobanya, jika belum silahkan main-main dulu ke sini.
Coba tambahkan beberapa sub menu di menu laporan, misal kita akan menambahkan sub menu Laporan Rekap Pembelian, Rekap Penjualan dan Grafik Penjualan.
Jika sudah coba jalankan sample programnya kemudian bandingkan menu program dengan menu program yang tampil pada form pengaturan hak akses operator.
Terlihat bahwa menu baru yang kita tambahkan tidak tampil di form pengaturan hak akses. Agar menu baru tersebut tampil kita harus menambahkan data menu baru tersebut ke tabel menu_anak.
Klo sudah coba jalankan lagi sample programnya
Gimana ? :D hasilnya masih kurang memuaskan ya? Karena posisi menu di form pengaturan hak akses tidak sama dengan menu program.
Untuk menyelesaikan masalah ini kita harus mengurutkan ulang field ID di tabel menu_anak
Sekarang kita coba lagi jalankan sample programnya
Hasilnya sudah memuaskan tetapi sampai disini kita bisa menyimpulkan bahwa menambah/menghapus menu program adalah sesuatu yang mengerikan :D.
Oke untuk menyelesaikan masalah ini, kita akan membuat sebuah prosedur kecil di frmLogin. Misal dengan nama resetMenu.
Tugas prosedur ini sangat sederhana yaitu :
Membandingkan menu program dengan data menu yang tersimpan di tabel menu_anak, jika tidak sama hapus data menu di table menu_anak kemudian insert ulang
Jika terjadi perubahan menu, update ulang data hak akses khusus user ADMIN
Private Sub resetMenu(ByVal frm As Form, ByRef hakAksesBaru As String)
Dim ctl As Control
Dim parentMenuID As Long
Dim childMenuID As Long
Dim ret As Long
Dim aksesMenuAdmin As String
For Each ctl In frm.Controls
If TypeName(ctl) = "Menu" Then
If Not (InStr(ctl.Name, "mnuSpr") > 0) Then 'abaikan menu separtor
If ctl.Visible = True Then
Select Case ctl.Name
Case "mnuMaster", "mnuTransaksi", "mnuBiaya", "mnuLaporan", "mnuPengaturan"
'abaikan menu induk
Case Else 'yang diproses hanya menu anak
If ctl.Enabled Then childMenuID = childMenuID + 1
End Select
End If
End If
End If
Next
strSql = "SELECT COUNT(*) FROM menu_anak"
ret = CLng(dbGetValue(strSql, 0))
If ret = childMenuID Then Exit Sub 'tidak ada penambah/pengurangan menu
'jika ada perubahan reset data menu_anak
strSql = "DELETE FROM menu_anak"
conn.Execute strSql
DoEvents
childMenuID = 1
For Each ctl In frm.Controls
If TypeName(ctl) = "Menu" Then
If Not (InStr(ctl.Name, "mnuSpr") > 0) Then
If ctl.Visible = True Then
Select Case ctl.Name
Case "mnuMaster": parentMenuID = 1
Case "mnuTransaksi": parentMenuID = 2
Case "mnuBiaya": parentMenuID = 3
Case "mnuLaporan": parentMenuID = 4
Case "mnuPengaturan": parentMenuID = 5
End Select
Select Case ctl.Name
Case "mnuMaster", "mnuTransaksi", "mnuBiaya", "mnuLaporan", "mnuPengaturan"
'abaikan menu induk
Case Else
If ctl.Enabled Then
strSql = "INSERT INTO menu_anak (menu_induk_id, id, menu_name, menu_caption) VALUES (" & _
parentMenuID & ", " & childMenuID & ", '" & ctl.Name & "', '" & ctl.Caption & "')"
conn.Execute strSql
aksesMenuAdmin = aksesMenuAdmin & childMenuID & ","
childMenuID = childMenuID + 1
End If
End Select
End If
End If
End If
Next
If Len(aksesMenuAdmin) > 0 Then aksesMenuAdmin = Left(aksesMenuAdmin, Len(aksesMenuAdmin) - 1)
hakAksesBaru = aksesMenuAdmin
'reset ulang hak akses khusus user admin
strSql = "UPDATE operator SET hak_akses = '" & hakAksesBaru & "' WHERE operator = 'ADMIN'"
conn.Execute strSql
End Sub
Selanjutnya tinggal panggil prosedur tersebut di event cmdLogin_Click
Private Sub cmdLogin_Click()
Dim objOperator As clsOperator
Dim statusOperator As STATUS_OPERATOR
Dim hakAkses As String
If isEmptyText(txtOperator, "Operator") Then Exit Sub
If isEmptyText(txtPassword, "Password") Then Exit Sub
Set objOperator = New clsOperator
With objOperator
.operator = txtOperator.Text
.password = txtPassword.Text
statusOperator = .isValidUser
hakAkses = .hakAkses
End With
Set objOperator = Nothing
Select Case statusOperator
Case OP_TDK_DITEMUKAN
Call msgWarning("Operator belum terdaftar !!!")
txtOperator.SetFocus
Case OP_PASS_SALAH
Call msgWarning("Password salah")
txtPassword.SetFocus
Case OP_PASS_OK
Call resetMenu(frmMain, hakAkses) 'pemanggilan prosedur resetMenu
Call disableMenu(frmMain, hakAkses)
frmMain.Show
Unload Me
End Select
End Sub