none
Insertar Registros UNO A UNO en datagridview a partir de una consulta Mysql RRS feed

  • Pregunta

  • Buen día compañeros del foro, en este momento pido ayuda para resolver un inconveniente. Antes que nada los contextualizo para poder preguntar y posteriormente recibir las posibles soluciones.

    Contexto: Tengo una aplicación en visual basic 2010, la cual deberá llamar el detalle de un producto existente en la base de datos (COLOR, TEXTURA, MATERIAL, NUMERO DE SERIE, ETC ETC) y listar todas sus propiedades, cabe destacar que NO SON CAMPOS en la base de datos, son filas intertadas en una tabla llamada "productos_detalle" cuyas caracteristicas son las siguientes (DETPRO(Int),IDPRO(Int),VARIABLE(Char),VALOR(Char)).

    Operatividad: El usuario al seleccionar el producto a través de un combo y picar en un botón para AGREGAR sus propiedades, estas se deberán mostrar en un datagridview(Grid1), a lo cual hago referencia que; NO TODOS los productos tendran el mismo número de propiedades asociadas. 

    Al buscar OTRO producto y dar click en el mismo boton, NO se deberán borrar las propiedades del anterior producto, sino que deberán ser vinculadas al final de la tabla.

    Esto porsteriormente se guardará en otra tabla totalmente distinta a la de "productos_detalle".(ESTO YA LO PUEDO HACER)

    ¿Que se ha realizado?:

    1. Pude asociar los productos al combo

    2. Pude tomar el id del producto (IDPRO) para posteriormente utilizarlo tan pronto lo selecciona del combo

    3. Pude crear la consulta que verifica si hay registros y aparentemente inserta las propiedades. Ver Siguiente Código

    VCOMBOSP = ComboBox1.SelectedValue


            CONSULTASQL = "SELECT productos_detalle.detpro,productos_detalle.variable,productos_detalle.valor FROM productos_detalle WHERE idpro = " & VCOMBOSP & " ORDER BY productos_detalle.variable"
            Dim Comandov As New MySqlCommand(CONSULTASQL, conexionbd)
            Dim dav As New MySqlDataAdapter(Comandov)
            Dim dtv As New DataTable
            dav.Fill(dtv)

            If dtv.Rows.Count > 0 Then
                Dim row As DataRow = dtv.Rows(0)

                For Each rowv As DataRow In dtv.Rows
                   ITEMCOMBO = ITEMCOMBO + 1
                        Me.GridCOMBO.Rows.Add(ITEMCOMBO, VCOMBOSP, row("detpro"), row("variable"), (row("valor"))
                    Next
                Next


              End if

    Preguntas : 

    1. ¿Existe una manera sencilla pero efectiva de realizar dicha operación?

    2. ¿Debo estudiar algo previamente antes de realizar esta correción?

    Agradezco la ayuda que me puedan proporcionar.

    Jairo Garzón Forero


    Jairo Garzón Forero - MSDN.COM/ES-CO

    miércoles, 28 de enero de 2015 21:53

Respuestas

  • Te voy a decir la forma en que yo lo solucione por que tengo una aplicacion de punto de ventas y hago exactamente lo mismo, el problema que estas teniendo es que debes utilizer un datatable que anada datarow

    ESTO LO PONES EN EL FORM LOAD

    Private Sub Formulario_Tesoreria_POS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Using cnn As New SqlConnection(Cadenaconexion) Dim cmd As SqlCommand = cnn.CreateCommand() cmd.CommandText = "SELECT Codigo, Descripcion, Precio1 FROM Articulos_y_Servicios_Tabla WHERE 1=0" Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) DatagridArticulos.DataSource = dt End Using Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

    LUEGO USAS ESTE CODIGO PARA BUSCAR LOS DATOS EN LA TABLA

     'Funcion que devuelve el row con los datos del articulo
        Private Function ObtenerFilas(ByVal codigo As String) As DataRow()
            Using cnn As New SqlConnection(Cadenaconexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = _
                    "SELECT Codigo, Descripcion, Precio1 " & _
                    "FROM Articulos_y_Servicios_Tabla " & _
                    "WHERE Codigo = @codigo "
                cmd.Parameters.AddWithValue("@codigo", codigo)
                Dim da As New SqlDataAdapter(cmd)
                Dim dt As New DataTable("Articulos_y_Servicios_Tabla")
                da.Fill(dt)
                Dim rows(dt.Rows.Count - 1) As DataRow  ' Creamos la matriz.
                If rows.Length = 0 Then 'Validamos si el articulo en la base de datos
                    MessageBox.Show("Articulo no existe en la base de datos")
                    txtcodigoBarra.Clear()
                    txtcodigoBarra.Focus()
                Else
                    dt.Rows.CopyTo(rows, 0)  ' Copiamos las filas a la matriz creada.
                End If
                Return rows ' Devolvemos la matriz.
            End Using
        End Function

    LUEGO DE ESO UTILIZO EL SIGUIENTE CODIGO

    Private Sub Txtcodigobarras_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtcodigoBarra.KeyPress If txtcodigoBarra.Text = "" Then Return 'si el control esta vacio retorna 0 If e.KeyChar = Convert.ToChar(Keys.Return) Then 'verifica el ENTER dim lineas As DataRow() = ObtenerFilas(txtcodigoBarra.Text) ' Obtenemos el array de objetos DataRow

    End Sub

    Jairo este codigo no es el mas corto pero te aseguro que tiene un poder extraordinaro

    de hecho hago mucho mas con el, anado columnas al datagridview donde hago calculus de

    impuestos a las ventas, sumo columnas, hago split que es si por ejemplo son dos productos

    y pongo en el mismo textbox 2* y scaneo el product me sale que estoy comprando dos, bueno

    amigo tu dime y yo te envoi el codigo.. miralo y analizalo

    • Marcado como respuesta Jairo Garzón jueves, 29 de enero de 2015 1:30
    jueves, 29 de enero de 2015 0:18

Todas las respuestas

  • Hola,

    Creo que lo mejor es que uses un DataReader

    miércoles, 28 de enero de 2015 22:04
  • Te voy a decir la forma en que yo lo solucione por que tengo una aplicacion de punto de ventas y hago exactamente lo mismo, el problema que estas teniendo es que debes utilizer un datatable que anada datarow

    ESTO LO PONES EN EL FORM LOAD

    Private Sub Formulario_Tesoreria_POS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Using cnn As New SqlConnection(Cadenaconexion) Dim cmd As SqlCommand = cnn.CreateCommand() cmd.CommandText = "SELECT Codigo, Descripcion, Precio1 FROM Articulos_y_Servicios_Tabla WHERE 1=0" Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) DatagridArticulos.DataSource = dt End Using Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

    LUEGO USAS ESTE CODIGO PARA BUSCAR LOS DATOS EN LA TABLA

     'Funcion que devuelve el row con los datos del articulo
        Private Function ObtenerFilas(ByVal codigo As String) As DataRow()
            Using cnn As New SqlConnection(Cadenaconexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = _
                    "SELECT Codigo, Descripcion, Precio1 " & _
                    "FROM Articulos_y_Servicios_Tabla " & _
                    "WHERE Codigo = @codigo "
                cmd.Parameters.AddWithValue("@codigo", codigo)
                Dim da As New SqlDataAdapter(cmd)
                Dim dt As New DataTable("Articulos_y_Servicios_Tabla")
                da.Fill(dt)
                Dim rows(dt.Rows.Count - 1) As DataRow  ' Creamos la matriz.
                If rows.Length = 0 Then 'Validamos si el articulo en la base de datos
                    MessageBox.Show("Articulo no existe en la base de datos")
                    txtcodigoBarra.Clear()
                    txtcodigoBarra.Focus()
                Else
                    dt.Rows.CopyTo(rows, 0)  ' Copiamos las filas a la matriz creada.
                End If
                Return rows ' Devolvemos la matriz.
            End Using
        End Function

    LUEGO DE ESO UTILIZO EL SIGUIENTE CODIGO

    Private Sub Txtcodigobarras_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtcodigoBarra.KeyPress If txtcodigoBarra.Text = "" Then Return 'si el control esta vacio retorna 0 If e.KeyChar = Convert.ToChar(Keys.Return) Then 'verifica el ENTER dim lineas As DataRow() = ObtenerFilas(txtcodigoBarra.Text) ' Obtenemos el array de objetos DataRow

    End Sub

    Jairo este codigo no es el mas corto pero te aseguro que tiene un poder extraordinaro

    de hecho hago mucho mas con el, anado columnas al datagridview donde hago calculus de

    impuestos a las ventas, sumo columnas, hago split que es si por ejemplo son dos productos

    y pongo en el mismo textbox 2* y scaneo el product me sale que estoy comprando dos, bueno

    amigo tu dime y yo te envoi el codigo.. miralo y analizalo

    • Marcado como respuesta Jairo Garzón jueves, 29 de enero de 2015 1:30
    jueves, 29 de enero de 2015 0:18
  • Oye Efraín gracias por al ayuda... me sirvió inicialmente... en este momento voy a editarlo como lo necesito y veré como funciona en mi aplicación.

    Un saludo Dios te guarde...


    Jairo Garzón Forero - MSDN.COM/ES-CO

    jueves, 29 de enero de 2015 1:31