Mereset menu program

Posted by Kamarudin • 3 minute read • Comments

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 ? :grin: 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 :grin:.

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 :grin:

Comments