none
Asignar parámetro de tipo Form en un procedimiento - Visual Studio 2010 RRS feed

  • Pregunta

  • Hola a todos:

    Tengo dos formularios con los mismos controles y sus nombres. Por lo tanto, lo que deseo saber es que tipo de parámetro de "Tipo Form" le puedo colocar a ese procedimiento y reutilizarlo con tan solo poner el nombre del formulario, por ejemplo, quiero trabajar con solo dos formularios de nombres: "Venta" y "VentasBoletaModificar". Como ven, lo intenté pero me salé este error:


    Les agradezco de antemano.

    Saludos.


    • Editado Miguel_Antonio sábado, 5 de diciembre de 2015 18:38 Volvi a mejorar la imagen
    sábado, 5 de diciembre de 2015 18:30

Respuestas

  • Hola Miguel OsPaCh,

    ¿Estas desarrollando con alguna arquitectura que te permita separar responsabilidades, reutilizar código y facilitar el mantenimiento? 

    Tus métodos están acoplando los parámetros, no tiene sentido que definas un método si sólo lo utilizarás para un caso en común. No es incorrecto que tengas dos métodos distintos, recuerda que cada método debería ocuparse de una responsabilidad única (ese principio apoya a la legibilidad del código y al mantenimiento), lo que es incorrecto es que los métodos que muestras tengan objetos que le pertenecen a un formulario.

    El método debería recibir los valores a través de parámetros - sin  importar de donde los obtiene -, el método sólo se encarga de persistir los valores que recibe:

    Public Sub GuardarClienteVenta(RucDni As String, NombreCliente As String)
            'Procedimiento Almacenado.
            Dim cmdCliente As New SqlCommand("Sp_GuardarClienteVenta")
            cmdCliente.CommandType = CommandType.StoredProcedure
            cmdCliente.Connection = BaseDeDatos
    
            cmdCliente.Parameters.Add("@RucDni", SqlDbType.NVarChar, 11).Value = RucDni
            cmdCliente.Parameters.Add("@NombreCliente", SqlDbType.NVarChar, 100).Value = NombreCliente
            'Demás parámetros
    
            BaseDeDatos.Open()
            cmdCliente.ExecuteNonQuery()
            BaseDeDatos.Close()
        End Sub


    ¿Qué sentido tiene declarar el objeto da de tipo SqlDataAdapter? Lo veo innecesario.

    El método que te comparto puedes utilizarlo desde el lugar que desees:

    GuardarCliente(txtRucDni.Text, txtNombreCliente.text)

    • Marcado como respuesta Miguel_Antonio domingo, 6 de diciembre de 2015 4:53
    domingo, 6 de diciembre de 2015 3:48

Todas las respuestas

  • Hola Miguel OsPaCh,

    No, no es la forma. Lo que intentas hacer se llama acoplamiento y es una pésima idea trabajar de esa manera. Lo que tienes que hacer es encapsular el problema a resolver en un método y reutilizarlo tantas veces lo requieras, para ello el método deberá ser un miembro de una clase pública que permita visibilidad en todos tus formularios

    Public Function MostrarDNI(PersonaID As String) As String
    	Dim DNI As String = "1056235656"
    	'Codigo
    
    	Return DNI
    End Function

    Dicho método puede ser usado en cualquier formulario creando un objeto (instancia) de la clase que lo contiene.

    Dim objeto = New MiClase()
    
    txtRucDni.text = objeto.MostrarDNI("P-232")


    sábado, 5 de diciembre de 2015 18:48
  • Hola  Willams Morales gracias por tu respuesta. Si entiendo lo que quieres decir, pero en este caso seré mas explicado lo que deseo hacer y si en caso se puede mejorar, ¡sería mejor!   :)

    En los dos procedimientos almacenados uso los mismos controles a ingresar pero son de dos formularios diferentes.

        Public Sub GuardarClienteVenta()
            'Procedimiento Almacenado.
            Dim cmdCliente As New SqlCommand("Sp_GuardarClienteVenta")
            cmdCliente.CommandType = CommandType.StoredProcedure
            cmdCliente.Connection = BaseDeDatos
    
            Dim da As New SqlDataAdapter(cmdCliente)
            da.SelectCommand.Parameters.Clear()
    
            With Venta ' ---------- AQUI USO EL FORMULARIO VENTA -------------------------------------------------------
    
                da.SelectCommand.Parameters.Add("@RucDni", SqlDbType.NVarChar, 11).Value = Trim(.txtRucDni.Text)
                da.SelectCommand.Parameters.Add("@NombreCliente", SqlDbType.NVarChar, 100).Value = .txtNombreCliente.Text
                da.SelectCommand.Parameters.Add("@Direccion", SqlDbType.NVarChar, 300).Value = .txtDireccion.Text
                da.SelectCommand.Parameters.Add("@Telefono", SqlDbType.VarChar, 15).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Fax", SqlDbType.VarChar, 15).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Celular", SqlDbType.VarChar, 15).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Otros", SqlDbType.NVarChar, 50).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Estado", SqlDbType.Char, 1).Value = "1"
                da.SelectCommand.Parameters.Add("@IdDistrito", SqlDbType.VarChar, 10).Value = .cbDistrito.SelectedValue
                da.SelectCommand.Parameters.Add("@Imagen", SqlDbType.NVarChar, 200).Value = String.Empty
            End With
    
            BaseDeDatos.Open()
            cmdCliente.ExecuteNonQuery()
            BaseDeDatos.Close()
        End Sub

        Public Sub ActualizarClienteVentaBoleta()
            'Procedimiento Almacenado.
            Dim cmdCliente As New SqlCommand("Sp_ActualizarClienteVenta")
            cmdCliente.CommandType = CommandType.StoredProcedure
            cmdCliente.Connection = BaseDeDatos
    
            Dim da As New SqlDataAdapter(cmdCliente)
            da.SelectCommand.Parameters.Clear()
    
            With VentaBoletaModificar '------------ AQUI USO EL FORMULARIO VENTABOLETAMODIFICAR  -----------------------
    
                da.SelectCommand.Parameters.Add("@RucDni", SqlDbType.NVarChar, 11).Value = Trim(.txtRucDni.Text)
                da.SelectCommand.Parameters.Add("@NombreCliente", SqlDbType.NVarChar, 100).Value = .txtNombreCliente.Text
                da.SelectCommand.Parameters.Add("@Direccion", SqlDbType.NVarChar, 300).Value = .txtDireccion.Text
                da.SelectCommand.Parameters.Add("@Telefono", SqlDbType.VarChar, 15).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Fax", SqlDbType.VarChar, 15).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Celular", SqlDbType.VarChar, 15).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Otros", SqlDbType.NVarChar, 50).Value = String.Empty
                da.SelectCommand.Parameters.Add("@Estado", SqlDbType.Char, 1).Value = "1"
                da.SelectCommand.Parameters.Add("@IdDistrito", SqlDbType.VarChar, 10).Value = .cbDistrito.SelectedValue
                da.SelectCommand.Parameters.Add("@Imagen", SqlDbType.NVarChar, 200).Value = String.Empty
            End With
    
            BaseDeDatos.Open()
            cmdCliente.ExecuteNonQuery()
            BaseDeDatos.Close()
        End Sub
    Estos codigos los uso cuando voy a registrar y modificar una venta, quiero decir si es NUEVO cliente que va a comprar, lo ingreso, si es EXISTE solo actualizo. Eso es todo.

    Por eso para no estar repitiendo el codigo, solo queria que en un procedimiento agregar un parámetro de tipo formulario y solo poner el nombre del formulario. ¿Como podría hacer?.

    Gracias.



    • Editado Miguel_Antonio domingo, 6 de diciembre de 2015 3:35 me olvide otro nombre
    domingo, 6 de diciembre de 2015 3:32
  • Hola Miguel OsPaCh,

    ¿Estas desarrollando con alguna arquitectura que te permita separar responsabilidades, reutilizar código y facilitar el mantenimiento? 

    Tus métodos están acoplando los parámetros, no tiene sentido que definas un método si sólo lo utilizarás para un caso en común. No es incorrecto que tengas dos métodos distintos, recuerda que cada método debería ocuparse de una responsabilidad única (ese principio apoya a la legibilidad del código y al mantenimiento), lo que es incorrecto es que los métodos que muestras tengan objetos que le pertenecen a un formulario.

    El método debería recibir los valores a través de parámetros - sin  importar de donde los obtiene -, el método sólo se encarga de persistir los valores que recibe:

    Public Sub GuardarClienteVenta(RucDni As String, NombreCliente As String)
            'Procedimiento Almacenado.
            Dim cmdCliente As New SqlCommand("Sp_GuardarClienteVenta")
            cmdCliente.CommandType = CommandType.StoredProcedure
            cmdCliente.Connection = BaseDeDatos
    
            cmdCliente.Parameters.Add("@RucDni", SqlDbType.NVarChar, 11).Value = RucDni
            cmdCliente.Parameters.Add("@NombreCliente", SqlDbType.NVarChar, 100).Value = NombreCliente
            'Demás parámetros
    
            BaseDeDatos.Open()
            cmdCliente.ExecuteNonQuery()
            BaseDeDatos.Close()
        End Sub


    ¿Qué sentido tiene declarar el objeto da de tipo SqlDataAdapter? Lo veo innecesario.

    El método que te comparto puedes utilizarlo desde el lugar que desees:

    GuardarCliente(txtRucDni.Text, txtNombreCliente.text)

    • Marcado como respuesta Miguel_Antonio domingo, 6 de diciembre de 2015 4:53
    domingo, 6 de diciembre de 2015 3:48
  • Hola Willams Morales 

    Gracias por tu orientación y corrección, me ayudo mucho y es más, el método que estoy utilizando, le adicioné un parámetro donde pongo el procedimiento almacenado, si es para Guardar al Cliente o si es para Actualizarlo y después van los controles como se muestra:

        Public Sub GuardarActualizarClienteVenta(ByVal StoredProcedure As String, _
                                                 ByVal RucDni As String, _
                                                 ByVal NomCliente As String, _
                                                 ByVal Direccion As String, _
                                                 ByVal Telefono As String, _
                                                 ByVal Fax As String, _
                                                 ByVal Celular As String, _
                                                 ByVal Email As String, _
                                                 ByVal Otros As String, _
                                                 ByVal Estado As String, _
                                                 ByVal IdDistrito As String, _
                                                 ByVal Imagen As String)
            Try
                Dim cmdCliente As New SqlCommand(StoredProcedure)
                cmdCliente.CommandType = CommandType.StoredProcedure
                cmdCliente.Connection = BaseDeDatos
                '
                cmdCliente.Parameters.Clear()
                cmdCliente.Parameters.Add("@RucDni", SqlDbType.NVarChar, 11).Value = Trim(RucDni)
                cmdCliente.Parameters.Add("@NombreCliente", SqlDbType.NVarChar, 100).Value = NomCliente
                cmdCliente.Parameters.Add("@Direccion", SqlDbType.NVarChar, 300).Value = Direccion
                cmdCliente.Parameters.Add("@Telefono", SqlDbType.VarChar, 15).Value = Telefono
                cmdCliente.Parameters.Add("@Fax", SqlDbType.VarChar, 15).Value = Fax
                cmdCliente.Parameters.Add("@Celular", SqlDbType.VarChar, 15).Value = Celular
                cmdCliente.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = Email
                cmdCliente.Parameters.Add("@Otros", SqlDbType.NVarChar, 50).Value = Otros
                cmdCliente.Parameters.Add("@Estado", SqlDbType.Char, 1).Value = Estado
                cmdCliente.Parameters.Add("@IdDistrito", SqlDbType.VarChar, 10).Value = IdDistrito
                cmdCliente.Parameters.Add("@Imagen", SqlDbType.NVarChar, 200).Value = Imagen
                '
                BaseDeDatos.Open()
                cmdCliente.ExecuteNonQuery()
                BaseDeDatos.Close()
            Catch ex As Exception
                BaseDeDatos.Close()
                MsgBox(ex.Message)
            End Try
        End Sub
    Porque, como dije en un comienzo, tienen los mismos controles. Muchas gracias Willams Morales.

    domingo, 6 de diciembre de 2015 4:56