none
Consulta en visual studio y sql

    Pregunta

  • Hola soy nuevo en esto de programar aplicaciones en Visual Studio 2010 

    Mi duda es la siguiente 

    Tengo una base de datos con una tabla Productos que tiene los campos de Codigo, precio 1, precio2,precio3

    Tengo un form con los textbox de codigo,precio 1 2 y 3

    Lo que quiero es que cada vez que escriba un codigo en el textbox y encuentre una coincidencia, me devuelva en los textbox de precio los respectivos valores 

    viernes, 30 de septiembre de 2016 18:17

Respuestas

  • Hola El_vena,

    Puedes usar el evento Leave del TextBox del código, para que cuando salga del control se ejecute la búsqueda.

    El método necesitaría un parámetro, que será el código a consultar.

    Public Sub showPricesByCode(ByVal codigo As Integer)
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
    
                    Dim query As String = "Select precio1, precio2, precio3 From Productos" &
                                          " Where codigo = @cod"
                    Dim cmd As New SqlCommand(query, con)
                    cmd.Parameters.AddWithValue("@cod", codigo)
    
                    Dim dr As SqlDataReader = cmd.ExecuteReader
    
                    If dr.HasRows Then
                        If dr.Read() Then
                            txtPrecio1.Text = CStr(dr("precio1"))
                            txtPrecio2.Text = CStr(dr("precio2"))
                            txtPrecio3.Text = CStr(dr("precio3"))
                        End If
                    End If
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    

    Y al llamarlo :

     Private Sub txtCodigo_Leave(sender As Object, e As EventArgs) Handles txtCodigo.Leave
        Dim cod As Integer = CInt(txtCodigo.Text)
        showPricesByCode(cod)
     End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 18:44

Todas las respuestas

  • Hola El_vena,

    Puedes usar el evento Leave del TextBox del código, para que cuando salga del control se ejecute la búsqueda.

    El método necesitaría un parámetro, que será el código a consultar.

    Public Sub showPricesByCode(ByVal codigo As Integer)
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
    
                    Dim query As String = "Select precio1, precio2, precio3 From Productos" &
                                          " Where codigo = @cod"
                    Dim cmd As New SqlCommand(query, con)
                    cmd.Parameters.AddWithValue("@cod", codigo)
    
                    Dim dr As SqlDataReader = cmd.ExecuteReader
    
                    If dr.HasRows Then
                        If dr.Read() Then
                            txtPrecio1.Text = CStr(dr("precio1"))
                            txtPrecio2.Text = CStr(dr("precio2"))
                            txtPrecio3.Text = CStr(dr("precio3"))
                        End If
                    End If
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    

    Y al llamarlo :

     Private Sub txtCodigo_Leave(sender As Object, e As EventArgs) Handles txtCodigo.Leave
        Dim cod As Integer = CInt(txtCodigo.Text)
        showPricesByCode(cod)
     End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 18:44
  • Hola, muchas gracias por tu respuesta fue de mucha ayuda
    domingo, 2 de octubre de 2016 20:27
  • Es buena sugerencia la de Joel, pero creo que andas buscando algo mas con cada letra tecleada que vaya poniendo el usuario, si es así seria mejor que investigaras el evento "TextChange" y en la búsqueda SQL, la haces con un "Like".

    lunes, 3 de octubre de 2016 15:16
  • Es buena sugerencia la de Joel, pero creo que andas buscando algo mas con cada letra tecleada que vaya poniendo el usuario, si es así seria mejor que investigaras el evento "TextChange" y en la búsqueda SQL, la haces con un "Like".

    Como podría hacer eso ? 
    martes, 4 de octubre de 2016 20:00
  • Hola Roberto C Rodríguez U y El_vena,

    También lo había pensado, usar TextChanged (se ejecuta el evento cuando se cambia la propiedad Text del control) o KeyPress (se ejecuta cuando el usuario presiona cualquier tecla, con el control activo).

    El problema es que si tienes un código con una estructura "X" como : P001, P002, P003, etc ... No tendría sentido consultar cuando no tengas escrito el código completo :

    Los eventos mencionados realizarían una búsqueda en cada caso :

    P
    P0
    P00
    P001 <-- Aquí recién encontraría

    [-] ... en la búsqueda SQL, la haces con un "Like"

    Pero si buscas por código, se asume que este es un campo único (a menos que tengas varios códigos iguales). Con el ejemplo de los códigos mostrados anteriormente, si usas LIKE cuando escribe "P0" obtendrá todos los códigos.

    Por lo que opté por usar el evento Leave que se ejecuta cuando el textbox deja de ser control activo, también pudo usar el KeyPress.

     Private Sub txtCodigo_KeyPress(sender As Object, e As KeyPressEventArgs) .....
            'Cuando el usuario presionar Enter inicia la búsqueda
            If e.KeyChar = Convert.ToChar(Keys.Enter) Then
                Dim cod As Integer = CInt(txtCodigo.Text)
                showPricesByCode(cod)
            End If
        End Sub

    En fin todo depende de como lo desees implementar.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 4 de octubre de 2016 20:40
  • Tengo la siguiente estructura 

     

    Public Class Producto
            Public Property DESCRIPCION As String
            Public Property UNITARIO As Double
        End Class
        Public Function obtenerDatos(ByVal CODIGO As String) As Producto
            Dim sql As String = String.Empty
            Dim product As Producto = Nothing

            Try
                Using con As New SqlConnection("data source=(local);initial catalog=DatosInventario;integrated security=true")
                    con.Open()

                    sql = "Select DESCRIPCION, UNITARIO from Productos where CODIGO = @CODIGO"
                    Dim cmd As New SqlCommand(sql, con)
                    cmd.Parameters.AddWithValue("@CODIGO", CODIGO)

                    Dim dr = cmd.ExecuteReader

                    'Si hay resultado
                    If dr.HasRows Then
                        If dr.Read() Then
                            'Crea un nuevo objeto y asigna los valores
                            product = New Producto() _
                            With {.UNITARIO = Convert.ToDouble(dr("UNITARIO")),
                                  .DESCRIPCION = Convert.ToString(dr("DESCRIPCION"))}
                        End If
                    End If

                    Return product
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Return product
            End Try
        End Function

        Private Sub TXTCODIGO_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TXTCODIGO.Leave
            Dim p As Producto = obtenerDatos(TXTCODIGO.Text)
            'Si p no es nulo, es porque encontró
            If TXTCODIGO.Text = "" Then
                MsgBox("Ingrese un Codigo")
            End If

            For Each fila As DataGridViewRow In Listado_Ventas.Rows
                If CStr(fila.Cells("CODIGO").Value) = TXTCODIGO.Text Then
                    fila.Cells("CANTIDAD").Value = CInt(fila.Cells("CANTIDAD").Value) + 1
                    fila.Cells("TOTAL").Value = (fila.Cells("PRECIO").Value) * (fila.Cells("CANTIDAD").Value)
                    Exit Sub 'Actualiza la fila y sale del evento
                End If
            Next

            'Si no encuentra agrega la fila
            Listado_Ventas.Rows.Add(TXTCODIGO.Text, (p.DESCRIPCION), 1, (p.UNITARIO.ToString), (p.UNITARIO.ToString))

        End Sub

    lo que hace esto es que al ingresar el código en el textbox código y ejecutarse el evento leave, me almacena internamente  el producto y el precio asociado a ese código, luego me  agrega esos datos a un gridview con una cantidad de 1, luego si vuelvo a ingresar el mismo código en el textbox,en el gridview se modifica 

    la cantidad sumándole 1, hasta ahi todo bien, pero resulta que si por accidente pongo el cursor en el textbox del código y luego salgo de el sin escribir nada, se ejecuta la acción del leave y me agrega los datos sin ninguna referencia ya que el textbox estaba vació, como puedo solucionar eso?



    • Editado El_vena miércoles, 5 de octubre de 2016 5:58
    miércoles, 5 de octubre de 2016 5:56