none
Llenar Textbox de Visual Studio con el resultado de una consulta SQL a 2 Tablas RRS feed

  • Pregunta

  • Hola buen dia.

    Espero y me puedan ayudar con este caso:

    Tengo una Consulta SQL realizada en SQL Server 2012 la cual me arroja los datos correctos y funciona muy bien, la consulta la genero tomando datos de 2 tablas (tabla X, tabla Y).

    El detalle esta cuando la programo en un Boton de Visual .net no me da los resultados.

    Hice un Form en el cual debe buscar por clave de producto. En un Textbox inserto la clave y al oprimir el Boton debe mostrarme en otros 4 Textbox el nombre del producto, precio1, precio2, precio3 y precio4 y no lo hace, mi consulta esta bien pero no funciona.

    cambio la consulta por un SELECT * FROM TABLAX y si me arroja el resultado, pero de la consuta que realice a 2 tablas no muestra nada. Aqui les muestro mi consulta para ver en que me pueden corregir.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim dt As New DataTable
    Dim con As New SqlConnection("Data Source=xxx;Initial Catalog=02TBLANCA;User ID=xxxx;Password=xxxx")
    Dim Consulta As String = "SELECT DISTINCT INVE02.CVE_ART, INVE02.DESCR, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=1) AS PUBLICO, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=4) AS DOS, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=5) AS TRES, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=2) AS MINIMO FROM INVE02 WHERE INVE02.CVE_ART = ' " & TextBox1.Text & " ' "
            Dim Comando As New SqlCommand(Consulta, con)
            Dim drd As SqlDataReader
            con.Open()
            drd = Comando.ExecuteReader()
            If drd.Read() Then
                Me.TextBox2.Text() = drd.Item("DESCR").ToString()
                Me.TextBox3.Text() = drd.Item("PUBLICO").ToString()
                Me.TextBox4.Text() = drd.Item("DOS").ToString()
                Me.TextBox5.Text() = drd.Item("TRES").ToString()
                Me.TextBox6.Text() = drd.Item("MINIMO").ToString()
            End If

    end sub

    Les agradecere mucho su apoyo

    • Cambiado Enrique M. Montejo miércoles, 4 de febrero de 2015 7:34 Pregunta relacionada con el acceso a datos con SQL Server.
    sábado, 31 de enero de 2015 1:17

Todas las respuestas

  • hola, por lo que veo estas haciendo algo un poco rústico...

    sabías que puedes hacer eso de una manera un poquito mas elegante: alli estas concatenando (mal) el texto de tu textbox con el string de la consulta, te recomiendo que cuando sean este tipo de consultas utilices parametros. te muestro un ejemplo

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
    Dim dt As New DataTable
    Dim con As New SqlConnection("Data Source=xxx;Initial Catalog=02TBLANCA;User ID=xxxx;Password=xxxx")
    Dim Consulta As String = "SELECT DISTINCT INVE02.CVE_ART, INVE02.DESCR, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=1) AS PUBLICO, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=4) AS DOS, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=5) AS TRES, (SELECT PRECIO_X_PROD02.PRECIO FROM PRECIO_X_PROD02 WHERE INVE02.CVE_ART = PRECIO_X_PROD02.CVE_ART AND PRECIO_X_PROD02.CVE_PRECIO=2) AS MINIMO FROM INVE02 WHERE INVE02.CVE_ART = @param"
            Dim Comando As New SqlCommand(Consulta, con)
    'suponiendo que ese campo en tu base de datos sql server lo declaraste como varchar lo haces asi, sino cambias el varchar por nvarchar, text o lo que sea que hayas puesto        
    Comando.Parameters.Add("@param", SqlDbType.VarChar).Value = TextBox1.Text
            Dim drd As SqlDataReader
            con.Open()
            drd = Comando.ExecuteReader()
            If drd.Read() Then
                Me.TextBox2.Text() = drd.Item("DESCR").ToString()
                Me.TextBox3.Text() = drd.Item("PUBLICO").ToString()
                Me.TextBox4.Text() = drd.Item("DOS").ToString()
                Me.TextBox5.Text() = drd.Item("TRES").ToString()
                Me.TextBox6.Text() = drd.Item("MINIMO").ToString()
            End If
    
    End Sub
    no se si tu consulta funcione, solo vi que no usas parametros y te los recomiendo. saludos


    sábado, 31 de enero de 2015 1:34
  • Hola,

    La primera recomendación que te haría es que cuando ya veas que tu consulta SQL es amplia, implementes un stored procedure. La segunda recomendación es la misma que te comentaron anteriormente: usa parámetros.

    La consulta en SQL Server sería la siguiente. Te sugiero la ejecutes en SQL Server Managment Studio para probar que devuelve los resultados esperados

    CREATE PROCEDURE PreciosProducto
    	@CVE_ART nvarchar(100)
    AS
    BEGIN
    	SELECT 	
    		A.CVE_ART,
    		MAX(A.DESCR) [DESCR],
    		MAX(CASE WHEN B.CVE_PRECIO = 1 THEN B.PRECIO END) PUBLICO,
    		MAX(CASE WHEN B.CVE_PRECIO = 4 THEN B.PRECIO END) DOS,
    		MAX(CASE WHEN B.CVE_PRECIO = 5 THEN B.PRECIO END) TRES,
    		MAX(CASE WHEN B.CVE_PRECIO = 2 THEN B.PRECIO END) MINIMO
    	FROM 
    		INVE02 A
    		INNER JOIN PRECIO_X_PROD02 B ON (B.CVE_ART = A.CVE_ART)
    	WHERE 
    		(A.CVE_ART = @CVE_ART)
    	GROUP BY
    		A.CVE_ART;
    END


    Luego haces referencia al procedimiento almacenado

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
    
    Dim con As New SqlConnection("Data Source=xxx;Initial Catalog=02TBLANCA;User ID=xxxx;Password=xxxx")
    
    Dim Comando As New SqlCommand("PreciosProducto", con)
    
    Comando.CommandType = CommandType.StoredProcedure;
    Comando.Parameters.Add("@param", SqlDbType.VarChar).Value = TextBox1.Text
    
    con.Open()
    
    Dim drd As SqlDataReader = Comando.ExecuteReader()
    
    If drd.Read() Then
      Me.TextBox2.Text() = drd.Item("DESCR").ToString()
      Me.TextBox3.Text() = drd.Item("PUBLICO").ToString()
      Me.TextBox4.Text() = drd.Item("DOS").ToString()
      Me.TextBox5.Text() = drd.Item("TRES").ToString()
      Me.TextBox6.Text() = drd.Item("MINIMO").ToString()
    End If
    
    End Sub

    Coméntanos como te fue.

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales P.
    Arequipa - Perú

    sábado, 31 de enero de 2015 2:00