none
Tengo redundancia de código al usar dos formularios y un procedimiento. RRS feed

  • Pregunta

  • Hola.

    Bueno pues como lo dice el título de la nota, se me presenta una redundancia de código al emplear dos formularios y un procedimiento.

    El objetivo es el siguiente: emplear el procedimiento en los dos formularios sin tener que recurrir a la redundancia de código, es  decir, tener que repetir todo el procedimiento y hacer una ligera modificación en el mismo (cambiar el nombre del procedimiento y una línea de código dentro de él).

    ¿Qué es lo que espero?: poder mostrar un combobox con información en dos formularios distintos.

    El resultado actual: De momento solo puedo emplear el procedimiento en un solo formulario, ya que no encuentro la manera de llamar el procedimiento desde el segundo formulario, la única idea que se me ocurre ya la comenté, repetir código.

    Entorno: estoy usando VB.NET 2012 y una BD en Access 2013

    A continuación les muestro el código original para que lo analicen:

    En el procedimiento se muestra en un combobox las ciudades/municipios de un estado; mando llamar al procedimiento y le mando como parámetro uno de los formularios principales (frmCliReg) y éste mismo procedimiento lo necesito en un formulario secundario (frmColonias), el detalle aquí es como logro hacer para que el procedimiento me reconozca un formulario u otro.

        Public Sub MostrarMunicipios(ByVal Frm As Form)
            Dim Conexion = New OleDbConnection(CadCon) : Dim Comando As OleDbCommand = New OleDbCommand
            Dim Adaptador As OleDbDataAdapter = New OleDbDataAdapter : Dim GpoDatos As DataSet = New DataSet
    
            Try
    
                With CType(Frm, frmCliReg)
                    Comando.Connection = Conexion
                    Comando.CommandText = "SELECT Municipio FROM tblMunicipios ORDER BY Municipio"
                    Adaptador.SelectCommand = Comando
                    Adaptador.Fill(GpoDatos, "Tabla")
    
                    .cboMunicipio.Items.Clear()
                    Dim Tabla As DataTable
                    Dim Fila As DataRow
                    Tabla = GpoDatos.Tables("Tabla")
                    For Each Fila In Tabla.Rows
                        .cboMunicipio.Items.Add(Fila.Item("Municipio"))
                    Next
                End With
            Catch ex As OleDbException
                MsgBox(ex.Message)
            Finally
                Conexion = Nothing : Comando = Nothing : Adaptador = Nothing : GpoDatos = Nothing
            End Try
        End Sub
    • Intente con un Select Case y la variable "tmp" de tipo Form donde se guarda el nombre (Name) del formulario pero me marcó el siguiente error: Un valor de tipo 'String' no se puede convertir en 'System.Windows.Forms.Form'.
    • Lo intente declarando "tmp" de tipo String y me marcó: Un valor de tipo 'System.Windows.Forms.Form' no se puede convertir en 'String'.

    "No hay pregunta tonta, lo que hay son tontos que no preguntan"

    sábado, 3 de agosto de 2013 15:26

Todas las respuestas

  • Yo personalmente lo que haria es separar este procedimiento de acceso a datos de la capa de interfaz de usuario.

    Crea una clase que acceda a los datos y luego desde tu form la llamas y asocias la tabla obtenida al combo que quieres de cada formulario.

    un ejemplo... Mas o menos te muestro mi idea

    Public Class Municipio
    
    	Public Function MostrarMunicipios() As DataTable
           
            Using Conexion As OleDbConnection = New OleDbConnection(CadCon) 
    			Using Comando As OleDbCommand = New OleDbCommand
    				Comando.Connection = Conexion
    				Comando.CommandText = "SELECT IdMunicipio, Municipio FROM tblMunicipios ORDER BY Municipio"
    				Adaptador.SelectCommand = Comando
    				Adaptador.Fill(GpoDatos, "Tabla")
    
    				Return GpoDatos.Tables("Tabla")
    							
    			End Using
    		End Using
        End Sub
    
    End Class
    
    
    'En tu formulario
    Dim m As Municipio = New Municipio()
    
    cboMunicipio.DataSource = Municipio.MostrarMunicipios()
    cboMunicipio.ValueMembeer = "IdMunicipio"     'No se como se llama tu campo clave
    cboMunicipio.DisplayMember = "Municipio"


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 3 de agosto de 2013 16:01
  • No me resulto tu sugerencia mi estimado Sergio.

    Implemente el código que me pusiste de ejemplo y vi como el VS me estaba mostrando errores sintácticos y los fui corrigiendo y me quedo de esta manera.

    En la llamada a la clase queda así:

        Private Sub cboMunicipio_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboMunicipio.SelectedIndexChanged
            Dim Municipio As clsCliReg = New clsCliReg
            cboMunicipio.DataSource = Municipio.MostrarMunicipios
            cboMunicipio.ValueMember = "IdMpio"
            cboMunicipio.DisplayMember = "Municipio"
        End Sub

    Y la clase queda así:

    Public Class clsCliReg
    
        Public Function MostrarMunicipios() As DataTable
            Using Conexion As OleDbConnection = New OleDbConnection(CadCon)
                Using Comando As OleDbCommand = New OleDbCommand
                    Dim Adaptador As OleDbDataAdapter = New OleDbDataAdapter
                    Dim GpoDatos As DataSet = New DataSet
    
                    Comando.Connection = Conexion
                    Comando.CommandText = "SELECT IdMunicipio, Municipio FROM tblMunicipios ORDER BY Municipio"
    
                    Adaptador.SelectCommand = Comando
                    Adaptador.Fill(GpoDatos, "Tabla")
    
                    Return GpoDatos.Tables("Tabla")
    
                End Using
            End Using
        End Function
    End Class

    En la línea de Adaptador.Fill(GpoDatos, "Tabla") me marca el siguiente error:

    "No se controlo OleDbExcetion. No No se han especificado valores para algunos de los parámetros requeridos."


    "No hay pregunta tonta, lo que hay son tontos que no preguntan"

    sábado, 3 de agosto de 2013 21:47