Home > Visual Basic > Mereset menu program

Mereset menu program

May 25, 2010

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 ?😀 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😀.

Oke untuk menyelesaikan masalah ini, kita akan membuat sebuah prosedur kecil di frmLogin. Misal dengan nama resetMenu.

Tugas prosedur ini sangat sederhana yaitu :

  1. 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
  2. Jika terjadi perubahan menu, update ulang data hak akses khusus user ADMIN

Berikut cuplikan prosedur resetMenu

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

Selamat MENCOBA😀

Categories: Visual Basic Tags: ,
  1. June 9, 2010 at 2:51 am

    Great post! Thank you so much for this useful sample project.

  2. June 9, 2010 at 3:58 am

    You are welcome🙂

  3. December 15, 2011 at 5:14 pm

    mas bisa untuk dot.net nggak yah, bisa di convert dong mas.

  4. Irfan
    April 19, 2012 at 12:31 am

    Maaf mas admin, Slm kenal sebelum nya. mau tanya, pas program nya di bikin Exe. pas dijalankan>login nya keluar perintah “Operator nya belum terdaftar” padahal sudah ada didatabasenya. Gmn tu mas. Makasi sebelumnya.

    • April 19, 2012 at 5:11 pm

      Masa’, sy udah coba compile enggak ada masalah tuh om

  5. Andris
    November 20, 2013 at 11:26 am

    Kang mau tanya, kalo mau reset menu pake vbaccelerator command bar control gimana ya? Kasusnya saat login awal di menubar ga muncul apa2 tapi pas sudah login baru buat menu dari user yang bersangkutan. Dan pas di logout tampilan menubarnya bersih lagi kayak awal.

  6. rizzan
    November 26, 2013 at 3:52 pm

    mas bro klo menu yang gak aktifnya hilang gak muncul sama sekali gimana caranya yach???

  7. December 11, 2013 at 7:06 pm

    sebelumnya thanks bgt om atas manfaat tambahan inspirasinya , cuma mo nanya: 1.) levelnya sampe 2(menu) saja ya??… 2.) pertimbangan kontrol yg tll banyak untuk root check hirarkinya (kbetulan ane tll make banyak pake sourcenya vbal).. kira2 vsflex bisa mewakili (diakali) gak sgb pengganti vbal.ocx?

  1. April 16, 2014 at 9:13 am
Comments are closed.
%d bloggers like this: