none
Como asignar permisos de acuerdo con el nivel usuarios en vb.net RRS feed

  • Pregunta

  • Hola a todos.

    estoy trabajando actualmente con vb.net y base de datos mysql, he intentado hacer un modulo que me permita asignar 
    los permisos a niveles de usuario cuando registre uno nuevo o uno ya registrado, si estar colocando condicionales 
    "IF" porque tendría que hacerlo por programación y quiero hacerlo es por el sistema

    Manejo 10 tipos de niveles de usuarios y alrededor de 20 módulos, pero a ciertos usuarios quiero que vean algunos 
    módulos o otros no y así con cada nivel de usuario.

    Que podría hacer? Crear una base de datos? como le asignaría los permisos para que algunos usuarios visualicen 3 módulos, otros 2 y así sucesivamente? necesito de mucha ayuda porque no tengo mucho conocimiento y he investigado bastante pero no he logrado conseguir algo concreto.

    Ejemplo:

    3 niveles:

    - Gerencia
    - Inventario
    - Supervisor

    5 módulos:

    - Inventario
    - Productos
    - Rotación
    - Compras
    - Estadísticas

    Permisos:

    Gerencia (Todos los módulos)
    Inventario (Inventario,Productos,Rotación)
    Supervisor (Compras,Estadísticas)

    Algo así, espero me hayan entendido. 
    Agradezco grandemente la ayuda y gracias de antemano.

    martes, 7 de mayo de 2019 14:37

Respuestas

  • Hola:
    En este ejemplo se usa como base de datos Access llamada Menu.accdb.
    Tiene 3 tablas con la siguiente estructura

    MENU
    ===========
    ID        Numero
    NOMBRE    Texto
    PADRE     Numero
    HIJO      Si/No

    USUARIO
    ===========
    ID        Numero
    NOMBRE    Texto
    PASSWORD  Texto


    USUARIO_MENU
    =============
    USUARIO    Numero
    MENU       Numero

    La imagen del proyecto es la siguiente

    La imagen de las propiedades proyecto es la siguiente

    El codigo es el siguiente

    Module Inicio
        Public msCodigo As String
        Public Sub Main()
            Dim Resultado As DialogResult
            Using loForm As New FrmLogin
                loForm.ShowDialog()
                Resultado = loForm.DialogResult
            End Using
            If Resultado = Windows.Forms.DialogResult.OK Then
                Dim loPrincipal As New FrmDinamico
                Application.Run(loPrincipal)
            End If
        End Sub
    End Module


    Option Explicit On
    Option Strict On
    Imports System.Data.OleDb
    Public Class FrmLogin
        Private Sub btnMostrar_Click(sender As System.Object, e As System.EventArgs) Handles btnMostrar.Click
            If lF_bUsuario() = False Then
                MessageBox.Show("Usuario y/ó Password incorrecto(s)")
            Else
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()
            End If
        End Sub

        Private Function lF_bUsuario() As Boolean
            Dim loPassword As Object = Nothing
            Dim loDataTable As New DataTable
            Dim lsQuery As String = "Select ID, PASSWORD From USUARIO Where NOMBRE=@Nombre And PASSWORD=@Password"
            Dim lsConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Menu.accdb"
            Try
                Using loConexion As New OleDbConnection(lsConexion)
                    ' crear comando
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New OleDbParameter("@Nombre", OleDbType.VarChar, 35))
                        loComando.Parameters("@Nombre").Value = Me.txtUsuario.Text
                        loComando.Parameters.Add(New OleDbParameter("@Password", OleDbType.VarChar, 15))
                        loComando.Parameters("@Password").Value = Me.txtPassWord.Text
                        loConexion.Open()   ' abrir conexión
                        Using loDataReader As OleDbDataReader = loComando.ExecuteReader()
                            Do While loDataReader.Read()
                                loPassword = loDataReader.Item("PASSWORD").ToString()
                                msCodigo = loDataReader.Item("ID").ToString()
                            Loop
                        End Using
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bUsuario", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return False
            End Try
            '
            If IsNothing(loPassword) = True Then
                Return False
            Else
                If loPassword.ToString = Me.txtPassWord.Text Then
                    Return True
                Else
                    Return False
                End If
            End If
        End Function
    End Class


    Option Explicit On
    Option Strict On
    Imports System.Data.OleDb
    Public Class FrmDinamico
        Private msConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=menu.accdb"
        'Menu actual
        Private msMenu As String
        Private Sub FrmDinamico_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            lP_CargaMenu()
        End Sub
        Private Sub lP_CargaMenu()
            Dim loDataTable As New DataTable
            Dim mnuOpcion As ToolStripMenuItem
            'cargar todos los permisos de usuario al conjunto de datos
            Dim lsQuery As String = "Select * From MENU Inner Join USUARIO_MENU On USUARIO_MENU.MENU = MENU.ID Where USUARIO_MENU.USUARIO=" & msCodigo & " And MENU.PADRE IS NULL Order By MENU.ID"
            Try
                Using loConexion As New OleDbConnection(msConexion)
                    Dim loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bCargaMenu", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            ' recorrer las filas e ir creando la estructura de menú
            For Each drFila As DataRow In loDataTable.Rows
                mnuOpcion = New ToolStripMenuItem(drFila("NOMBRE").ToString())
                mnuOpcion.Tag = CInt(drFila("ID"))
                ' añadir este menú desplegable a la barra de menú
                Me.mnuPrincipal.Items.Add(mnuOpcion)
                If CBool(drFila("HIJO")) = True Then
                    ' recorrer si hubiera las opciones dependientes de este menú
                    msMenu = drFila("ID").ToString
                    Me.lP_CrearSubopciones(mnuOpcion)
                End If
            Next
        End Sub
        ' crear las opciones de un menú desplegable
        Private Sub lP_CrearSubopciones(ByVal mnuOpcion As ToolStripMenuItem)
            Dim mnuSubOpcion As ToolStripMenuItem = Nothing
            Dim lsQuery As String = "Select * From MENU  Inner Join USUARIO_MENU On USUARIO_MENU.MENU=MENU.ID Where USUARIO_MENU.USUARIO=" & msCodigo & " And MENU.PADRE=" & msMenu & " Order By MENU.ID"
            Try
                Using loConexion As New OleDbConnection(msConexion)
                    Dim ldtDataTable As New DataTable
                    Dim daAdaptador As New OleDbDataAdapter(lsQuery, loConexion)
                    daAdaptador.Fill(ldtDataTable)
                    For Each drFila As DataRow In ldtDataTable.Rows
                        mnuSubOpcion = New ToolStripMenuItem(drFila("NOMBRE").ToString())
                        mnuSubOpcion.Tag = CInt(drFila("ID"))
                        mnuOpcion.DropDownItems.Add(mnuSubOpcion)
                        If CBool(drFila("HIJO")) = True Then
                            msMenu = drFila("ID").ToString
                            Me.lP_CrearSubopciones(mnuSubOpcion)
                        Else
                            AddHandler mnuSubOpcion.Click, AddressOf lP_mnuSubOpcionClick
                        End If
                    Next
                End Using
            Catch Exp As OleDbException
                MessageBox.Show(Exp.Message, "lP_CrearSubopciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_CrearSubopciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Sub lP_mnuSubOpcionClick(ByVal sender As Object, ByVal e As EventArgs)
            Dim OpcionMenu As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
            Dim liIdMenu As Integer = CInt(OpcionMenu.Tag)
            Select Case liIdMenu
                Case 3
                    MessageBox.Show("Guardar", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 4
                    MessageBox.Show("Projecto", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 5
                    MessageBox.Show("Solucion", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 7
                    MessageBox.Show("Ayuda", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 8
                    MessageBox.Show("Acerca de", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Select
        End Sub
    End Class

    P.D.

    Puebalo y ojala te sirva


    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M martes, 7 de mayo de 2019 19:08
    • Marcado como respuesta BogBer21 miércoles, 8 de mayo de 2019 14:10
    martes, 7 de mayo de 2019 18:29
  • Hola:
    Si Tienes (Habilitar marco de trabajo de la aplicacion) marcada, tienes que iniciar el proyecto desde un Form.
    Si lo inicias desde el Sub Main (como es el caso del ejemplo) lo tienes que tener desmarcada. (Yo los proyectos siempre los inicio desde el Sub Main)

    > ese código me va agregando un menú de acuerdo a los registros que hay en la tabla MENÚ y los permisos asignados en la tabla USUARIO_MENÚ, en principio el MenuStrip esta en blanco  <
    > como hago para adaptarlo al sistema que tengo cuando ya hay un menu registrado? <
    Tienes que quitar todos los  ToolStripMenuItem del mnuPrincipal y añadir tantos registros a la tabla menu como ToolStripMenuItem (con el mismo nombre) has quitado
    Cuando un usuario entra en la aplicacion, solo debe de ver los menus a los que tiene acceso, Para que quiere ver un menu al que NO puede acceder.
    En cuanto al aspecto, en los ejemplos es el que Visual Studio pone por defecto.

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta BogBer21 lunes, 13 de mayo de 2019 14:21
    miércoles, 8 de mayo de 2019 19:06

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://social.msdn.microsoft.com/Forums/es-ES/a7f7c6d6-5adc-425f-b55f-5708c070b626/privilegios-de-usuarios-que-accesan-al-programa-en-visual-basic-y-sql?forum=vbes

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 7 de mayo de 2019 15:56
  • Hola:

    A un programa acceden usuarios lo que implica una tabla de usuarios.
    Un programa tiene menus lo que implica una tabla de menus.
    Una tabla con los datos de las 2 anteriores llamada usuario_menu.

    Al inicio del programa se presenta un Form para identificar al usuario, si la identificacion es correcta, se memoriza el usuario y se llama a el Form principal.
    A este Form principal se le cargan los menus que el usuario tiene en la tabla usuario_menu,
    Esto es el proceso (muy basicamente)


    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M martes, 7 de mayo de 2019 19:08
    martes, 7 de mayo de 2019 17:19
  • Hola:

    tengo la tabla de usuarios lista y cada quien tiene su nivel asignado.

    aquí la imagen:

    lo que no se hacer es como crear esa tabla menú y usuarios_menú, y como hacer cuando esté en el form principal carguen los menús asignados a ese nivel que posee ese usuario. se que para usted es sencillo y básico pero para mi sinceramente es complicado porque no entiendo. espero pueda comprenderme.

    martes, 7 de mayo de 2019 17:58
  • Hola:
    En este ejemplo se usa como base de datos Access llamada Menu.accdb.
    Tiene 3 tablas con la siguiente estructura

    MENU
    ===========
    ID        Numero
    NOMBRE    Texto
    PADRE     Numero
    HIJO      Si/No

    USUARIO
    ===========
    ID        Numero
    NOMBRE    Texto
    PASSWORD  Texto


    USUARIO_MENU
    =============
    USUARIO    Numero
    MENU       Numero

    La imagen del proyecto es la siguiente

    La imagen de las propiedades proyecto es la siguiente

    El codigo es el siguiente

    Module Inicio
        Public msCodigo As String
        Public Sub Main()
            Dim Resultado As DialogResult
            Using loForm As New FrmLogin
                loForm.ShowDialog()
                Resultado = loForm.DialogResult
            End Using
            If Resultado = Windows.Forms.DialogResult.OK Then
                Dim loPrincipal As New FrmDinamico
                Application.Run(loPrincipal)
            End If
        End Sub
    End Module


    Option Explicit On
    Option Strict On
    Imports System.Data.OleDb
    Public Class FrmLogin
        Private Sub btnMostrar_Click(sender As System.Object, e As System.EventArgs) Handles btnMostrar.Click
            If lF_bUsuario() = False Then
                MessageBox.Show("Usuario y/ó Password incorrecto(s)")
            Else
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()
            End If
        End Sub

        Private Function lF_bUsuario() As Boolean
            Dim loPassword As Object = Nothing
            Dim loDataTable As New DataTable
            Dim lsQuery As String = "Select ID, PASSWORD From USUARIO Where NOMBRE=@Nombre And PASSWORD=@Password"
            Dim lsConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Menu.accdb"
            Try
                Using loConexion As New OleDbConnection(lsConexion)
                    ' crear comando
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New OleDbParameter("@Nombre", OleDbType.VarChar, 35))
                        loComando.Parameters("@Nombre").Value = Me.txtUsuario.Text
                        loComando.Parameters.Add(New OleDbParameter("@Password", OleDbType.VarChar, 15))
                        loComando.Parameters("@Password").Value = Me.txtPassWord.Text
                        loConexion.Open()   ' abrir conexión
                        Using loDataReader As OleDbDataReader = loComando.ExecuteReader()
                            Do While loDataReader.Read()
                                loPassword = loDataReader.Item("PASSWORD").ToString()
                                msCodigo = loDataReader.Item("ID").ToString()
                            Loop
                        End Using
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bUsuario", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return False
            End Try
            '
            If IsNothing(loPassword) = True Then
                Return False
            Else
                If loPassword.ToString = Me.txtPassWord.Text Then
                    Return True
                Else
                    Return False
                End If
            End If
        End Function
    End Class


    Option Explicit On
    Option Strict On
    Imports System.Data.OleDb
    Public Class FrmDinamico
        Private msConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=menu.accdb"
        'Menu actual
        Private msMenu As String
        Private Sub FrmDinamico_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            lP_CargaMenu()
        End Sub
        Private Sub lP_CargaMenu()
            Dim loDataTable As New DataTable
            Dim mnuOpcion As ToolStripMenuItem
            'cargar todos los permisos de usuario al conjunto de datos
            Dim lsQuery As String = "Select * From MENU Inner Join USUARIO_MENU On USUARIO_MENU.MENU = MENU.ID Where USUARIO_MENU.USUARIO=" & msCodigo & " And MENU.PADRE IS NULL Order By MENU.ID"
            Try
                Using loConexion As New OleDbConnection(msConexion)
                    Dim loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bCargaMenu", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            ' recorrer las filas e ir creando la estructura de menú
            For Each drFila As DataRow In loDataTable.Rows
                mnuOpcion = New ToolStripMenuItem(drFila("NOMBRE").ToString())
                mnuOpcion.Tag = CInt(drFila("ID"))
                ' añadir este menú desplegable a la barra de menú
                Me.mnuPrincipal.Items.Add(mnuOpcion)
                If CBool(drFila("HIJO")) = True Then
                    ' recorrer si hubiera las opciones dependientes de este menú
                    msMenu = drFila("ID").ToString
                    Me.lP_CrearSubopciones(mnuOpcion)
                End If
            Next
        End Sub
        ' crear las opciones de un menú desplegable
        Private Sub lP_CrearSubopciones(ByVal mnuOpcion As ToolStripMenuItem)
            Dim mnuSubOpcion As ToolStripMenuItem = Nothing
            Dim lsQuery As String = "Select * From MENU  Inner Join USUARIO_MENU On USUARIO_MENU.MENU=MENU.ID Where USUARIO_MENU.USUARIO=" & msCodigo & " And MENU.PADRE=" & msMenu & " Order By MENU.ID"
            Try
                Using loConexion As New OleDbConnection(msConexion)
                    Dim ldtDataTable As New DataTable
                    Dim daAdaptador As New OleDbDataAdapter(lsQuery, loConexion)
                    daAdaptador.Fill(ldtDataTable)
                    For Each drFila As DataRow In ldtDataTable.Rows
                        mnuSubOpcion = New ToolStripMenuItem(drFila("NOMBRE").ToString())
                        mnuSubOpcion.Tag = CInt(drFila("ID"))
                        mnuOpcion.DropDownItems.Add(mnuSubOpcion)
                        If CBool(drFila("HIJO")) = True Then
                            msMenu = drFila("ID").ToString
                            Me.lP_CrearSubopciones(mnuSubOpcion)
                        Else
                            AddHandler mnuSubOpcion.Click, AddressOf lP_mnuSubOpcionClick
                        End If
                    Next
                End Using
            Catch Exp As OleDbException
                MessageBox.Show(Exp.Message, "lP_CrearSubopciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_CrearSubopciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Sub lP_mnuSubOpcionClick(ByVal sender As Object, ByVal e As EventArgs)
            Dim OpcionMenu As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
            Dim liIdMenu As Integer = CInt(OpcionMenu.Tag)
            Select Case liIdMenu
                Case 3
                    MessageBox.Show("Guardar", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 4
                    MessageBox.Show("Projecto", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 5
                    MessageBox.Show("Solucion", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 7
                    MessageBox.Show("Ayuda", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 8
                    MessageBox.Show("Acerca de", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Select
        End Sub
    End Class

    P.D.

    Puebalo y ojala te sirva


    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M martes, 7 de mayo de 2019 19:08
    • Marcado como respuesta BogBer21 miércoles, 8 de mayo de 2019 14:10
    martes, 7 de mayo de 2019 18:29
  • Hola:

    el código me funciono a la perfección, toca adaptarlo al sistema que tengo.

    tengo es este detalle:

    y esta es la estructura de las tablas:

    MENU

    en esta de menú cambio la el tipo de dato a bool y después que guardo se cambia a tinyint no se porque.

    USUARIO

    y USUARIO_MENU

    miércoles, 8 de mayo de 2019 14:14
  • Hola nuevamente,

    me di cuenta de algo en esta imagen que el marco trabajo de la aplicación esta deshabilita

    y cambia el aspecto visual de form

    yo tengo los form con esta forma visual

    este es el de inicio de sesión

    y este el del menú principal

    afecta esa opción a mi sistema? ya que la opción de habilitada marco de trabajo la tengo activada.

    esta es la configuración de mi sistema

    miércoles, 8 de mayo de 2019 14:38
  • Hola:

    el código me funciono a la perfección, toca adaptarlo al sistema que tengo.

    tengo es este detalle:

    y esta es la estructura de las tablas:

    MENU

    en esta de menú cambio la el tipo de dato a bool y después que guardo se cambia a tinyint no se porque.

    USUARIO

    y USUARIO_MENU

    ya solvente este problema era esto:

    miércoles, 8 de mayo de 2019 15:43
  • Hola:
    En este ejemplo se usa como base de datos Access llamada Menu.accdb.
    Tiene 3 tablas con la siguiente estructura

    MENU
    ===========
    ID        Numero
    NOMBRE    Texto
    PADRE     Numero
    HIJO      Si/No

    USUARIO
    ===========
    ID        Numero
    NOMBRE    Texto
    PASSWORD  Texto


    USUARIO_MENU
    =============
    USUARIO    Numero
    MENU       Numero

    La imagen del proyecto es la siguiente

    La imagen de las propiedades proyecto es la siguiente

    El codigo es el siguiente

    Module Inicio
        Public msCodigo As String
        Public Sub Main()
            Dim Resultado As DialogResult
            Using loForm As New FrmLogin
                loForm.ShowDialog()
                Resultado = loForm.DialogResult
            End Using
            If Resultado = Windows.Forms.DialogResult.OK Then
                Dim loPrincipal As New FrmDinamico
                Application.Run(loPrincipal)
            End If
        End Sub
    End Module


    Option Explicit On
    Option Strict On
    Imports System.Data.OleDb
    Public Class FrmLogin
        Private Sub btnMostrar_Click(sender As System.Object, e As System.EventArgs) Handles btnMostrar.Click
            If lF_bUsuario() = False Then
                MessageBox.Show("Usuario y/ó Password incorrecto(s)")
            Else
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()
            End If
        End Sub

        Private Function lF_bUsuario() As Boolean
            Dim loPassword As Object = Nothing
            Dim loDataTable As New DataTable
            Dim lsQuery As String = "Select ID, PASSWORD From USUARIO Where NOMBRE=@Nombre And PASSWORD=@Password"
            Dim lsConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Menu.accdb"
            Try
                Using loConexion As New OleDbConnection(lsConexion)
                    ' crear comando
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New OleDbParameter("@Nombre", OleDbType.VarChar, 35))
                        loComando.Parameters("@Nombre").Value = Me.txtUsuario.Text
                        loComando.Parameters.Add(New OleDbParameter("@Password", OleDbType.VarChar, 15))
                        loComando.Parameters("@Password").Value = Me.txtPassWord.Text
                        loConexion.Open()   ' abrir conexión
                        Using loDataReader As OleDbDataReader = loComando.ExecuteReader()
                            Do While loDataReader.Read()
                                loPassword = loDataReader.Item("PASSWORD").ToString()
                                msCodigo = loDataReader.Item("ID").ToString()
                            Loop
                        End Using
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bUsuario", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return False
            End Try
            '
            If IsNothing(loPassword) = True Then
                Return False
            Else
                If loPassword.ToString = Me.txtPassWord.Text Then
                    Return True
                Else
                    Return False
                End If
            End If
        End Function
    End Class


    Option Explicit On
    Option Strict On
    Imports System.Data.OleDb
    Public Class FrmDinamico
        Private msConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=menu.accdb"
        'Menu actual
        Private msMenu As String
        Private Sub FrmDinamico_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            lP_CargaMenu()
        End Sub
        Private Sub lP_CargaMenu()
            Dim loDataTable As New DataTable
            Dim mnuOpcion As ToolStripMenuItem
            'cargar todos los permisos de usuario al conjunto de datos
            Dim lsQuery As String = "Select * From MENU Inner Join USUARIO_MENU On USUARIO_MENU.MENU = MENU.ID Where USUARIO_MENU.USUARIO=" & msCodigo & " And MENU.PADRE IS NULL Order By MENU.ID"
            Try
                Using loConexion As New OleDbConnection(msConexion)
                    Dim loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bCargaMenu", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            ' recorrer las filas e ir creando la estructura de menú
            For Each drFila As DataRow In loDataTable.Rows
                mnuOpcion = New ToolStripMenuItem(drFila("NOMBRE").ToString())
                mnuOpcion.Tag = CInt(drFila("ID"))
                ' añadir este menú desplegable a la barra de menú
                Me.mnuPrincipal.Items.Add(mnuOpcion)
                If CBool(drFila("HIJO")) = True Then
                    ' recorrer si hubiera las opciones dependientes de este menú
                    msMenu = drFila("ID").ToString
                    Me.lP_CrearSubopciones(mnuOpcion)
                End If
            Next
        End Sub
        ' crear las opciones de un menú desplegable
        Private Sub lP_CrearSubopciones(ByVal mnuOpcion As ToolStripMenuItem)
            Dim mnuSubOpcion As ToolStripMenuItem = Nothing
            Dim lsQuery As String = "Select * From MENU  Inner Join USUARIO_MENU On USUARIO_MENU.MENU=MENU.ID Where USUARIO_MENU.USUARIO=" & msCodigo & " And MENU.PADRE=" & msMenu & " Order By MENU.ID"
            Try
                Using loConexion As New OleDbConnection(msConexion)
                    Dim ldtDataTable As New DataTable
                    Dim daAdaptador As New OleDbDataAdapter(lsQuery, loConexion)
                    daAdaptador.Fill(ldtDataTable)
                    For Each drFila As DataRow In ldtDataTable.Rows
                        mnuSubOpcion = New ToolStripMenuItem(drFila("NOMBRE").ToString())
                        mnuSubOpcion.Tag = CInt(drFila("ID"))
                        mnuOpcion.DropDownItems.Add(mnuSubOpcion)
                        If CBool(drFila("HIJO")) = True Then
                            msMenu = drFila("ID").ToString
                            Me.lP_CrearSubopciones(mnuSubOpcion)
                        Else
                            AddHandler mnuSubOpcion.Click, AddressOf lP_mnuSubOpcionClick
                        End If
                    Next
                End Using
            Catch Exp As OleDbException
                MessageBox.Show(Exp.Message, "lP_CrearSubopciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_CrearSubopciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Sub lP_mnuSubOpcionClick(ByVal sender As Object, ByVal e As EventArgs)
            Dim OpcionMenu As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
            Dim liIdMenu As Integer = CInt(OpcionMenu.Tag)
            Select Case liIdMenu
                Case 3
                    MessageBox.Show("Guardar", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 4
                    MessageBox.Show("Projecto", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 5
                    MessageBox.Show("Solucion", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 7
                    MessageBox.Show("Ayuda", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Case 8
                    MessageBox.Show("Acerca de", "Opciones", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Select
        End Sub
    End Class

    P.D.

    Puebalo y ojala te sirva


    Un saludo desde Bilbo
    Carlos

    Hola.

    lo estoy adaptando al sistema, pero no entiendo algo...

    ese código me va agregando un menú de acuerdo a los registros que hay en la tabla MENÚ y los permisos asignados en la tabla USUARIO_MENÚ, en principio el MenuStrip esta en blanco así:

    como hago para adaptarlo al sistema que tengo cuando ya hay un menu registrado?

    asi:

    gracias nuevamente por toda la ayuda!!!

    miércoles, 8 de mayo de 2019 18:04
  • Hola:
    Si Tienes (Habilitar marco de trabajo de la aplicacion) marcada, tienes que iniciar el proyecto desde un Form.
    Si lo inicias desde el Sub Main (como es el caso del ejemplo) lo tienes que tener desmarcada. (Yo los proyectos siempre los inicio desde el Sub Main)

    > ese código me va agregando un menú de acuerdo a los registros que hay en la tabla MENÚ y los permisos asignados en la tabla USUARIO_MENÚ, en principio el MenuStrip esta en blanco  <
    > como hago para adaptarlo al sistema que tengo cuando ya hay un menu registrado? <
    Tienes que quitar todos los  ToolStripMenuItem del mnuPrincipal y añadir tantos registros a la tabla menu como ToolStripMenuItem (con el mismo nombre) has quitado
    Cuando un usuario entra en la aplicacion, solo debe de ver los menus a los que tiene acceso, Para que quiere ver un menu al que NO puede acceder.
    En cuanto al aspecto, en los ejemplos es el que Visual Studio pone por defecto.

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta BogBer21 lunes, 13 de mayo de 2019 14:21
    miércoles, 8 de mayo de 2019 19:06
  • Hola:
    Si Tienes (Habilitar marco de trabajo de la aplicacion) marcada, tienes que iniciar el proyecto desde un Form.
    Si lo inicias desde el Sub Main (como es el caso del ejemplo) lo tienes que tener desmarcada. (Yo los proyectos siempre los inicio desde el Sub Main)

    > ese código me va agregando un menú de acuerdo a los registros que hay en la tabla MENÚ y los permisos asignados en la tabla USUARIO_MENÚ, en principio el MenuStrip esta en blanco  <
    > como hago para adaptarlo al sistema que tengo cuando ya hay un menu registrado? <
    Tienes que quitar todos los  ToolStripMenuItem del mnuPrincipal y añadir tantos registros a la tabla menu como ToolStripMenuItem (con el mismo nombre) has quitado
    Cuando un usuario entra en la aplicacion, solo debe de ver los menus a los que tiene acceso, Para que quiere ver un menu al que NO puede acceder.
    En cuanto al aspecto, en los ejemplos es el que Visual Studio pone por defecto.

    Un saludo desde Bilbo
    Carlos

    Hola Carlos,

    amigo me has sido de muchísima ayuda nuevamente muchas gracias por todo!!!

    tengo esta duda es esta imagen:

    ya arme todo el modulo para la asignación de permisos, gracias a código fuente que me mandaste, pero no se  como hacer para que me muestre en cada usuario que edite lo siguiente:

    en el DGV izquierdo muestra los módulos asignados, ya eso lo tengo listo; pero en el DGV derecho no he logrado colocar los módulos que falta por asignar sin que muestre los que ya tiene asignado.

    en la imagen de ejemplo ese usuario tiene asignado los módulos 3 y 4 (los que si visualizan en el DGV izquierdo) por ende en el DGV derecho tiene que mostrar los módulos 1,2,4,5,6 etc. pero no me muestra el 1 y 2, y así me pasa con todos los usuarios. porque sera eso?

    nuevamente gracias por todo.

    lunes, 13 de mayo de 2019 14:37
  • Hola:
    Si no me muestras las estructuras de las tablas implicadas y la consulta con la que cargas los DGV, no te puedo decir nada porque no se lo que estas haciendo.

    P.D.
    Con respecto a los campos Si/No estos NO existen en MySql, se usa un campo tinyint(1) donde el 0 es False y cualquier otro valor es True

    Un saludo desde Bilbo
    Carlos

    lunes, 13 de mayo de 2019 18:18
  • Hola: 

    esta es la consulta que uso para mostrar que modulos tiene asignado ese usuario

    SELECT
      id_menu AS ID,
      nom_menu AS MODULO,
      registrado AS REGISTRADO
    FROM
      usuario_menu
    WHERE id_usuario = '17'
    ORDER BY id_menu ASC

    ese es el resultado. pero como hago para que en otro datagridview me muestro los otros modulos que no tiene asignados, lei que se podia obtener las id de esa consulta y crear otra consulta donde concatene esos ids en un NOT IN, pero no logro dar con eso.

    viernes, 17 de mayo de 2019 12:27
  • Hola:

    La consulta la tienes en el ejemplo y es la siguiente

    SELECT * FROM menu INNER JOIN usuario_menu ON usuario_menu.menu = menu.id WHERE usuario_menu.usuario=" & msCodigo & " AND menu.padre IS NULL ORDER BY menu.id.

    NO tienes que mostrarla en ningún DGV.

    ¿Para que quieres saber los menus a los que NO tiene acceso, solo debes conocer los menus alos que SI tiene acceso?

    P.D.

    La tendrás que adaptar a los nombres de tus campos

    Un saludo desde Bilbo

    Carlos

    viernes, 17 de mayo de 2019 14:19