lunes, 24 de octubre de 2011

Actualizar datos desde un DataGridView

En esta entrega trataré de manera simple una forma de actualizar datos de una tabla en una Base de Datos SQL Server 2005, es que muchas veces resulta tedioso tener que realizar estos pasos cuando solamente se trata de cambiar los datos de ciertas columnas desde un DataGridView.
El ejemplo se plantea de la siguiente manera:
Creamos un proyecto nuevo,  con un formulario Prueba puede asignarle el nombre que mejor le parece al ejemplo y añadiremos los controles siguientes:

- Una etiqueta: lblTitulo
- Una caja de texto : TxtPedido
- Un botón: btnMostrar
- Un DataGridView: DataGridView1
- 4 botones: btnInicio, btnAnterior, btnSiguiente, btnFinal
- Un botón: btnGuardar
- Un botón: btnSalir

El formulario debería quedar como la imágen de muestra.

En el formulario pedimos la entrada del Número de Pedido a consultar y modificar, si no existe le mostrará un mensaje de advertencia, si el Pedido existe en la tabla PedidosDetalles entonces llenará el DataGridView para su modificación de la columna que desee a excepción de las columnas que son llaves, han como requisito para este tipo de UPDATE es que la tabla debe tener una llave primaria, hechos los cambios Click en el botón guardar y listo.

Lo demás es programar un poco pero que es bastante didáctico y que con pequeñas modificaciones pueden adaptarlo a sus requerimientos.

A continuación el código completo, espero sea de utilidad.

Hasta pronto.

Option Explicit On
Option Strict On
' '''''''''''''''''''''''''''''''''''''''''  
Imports System.Data.SqlClient

Public Class Prueba
    Private WithEvents bs As New BindingSource
    Private SqlDataAdapter As SqlDataAdapter
    ' conexión  
    Private Const cs As String = "Data Source=.\sqlexpress;" & _
                                     "Initial Catalog=database;" & _
                                     "Integrated Security=true"
    ' flag para activar la edición en el DGV  
    Private bEdit As Boolean
    ' También actualiza al cerrar el formulario
    Private Sub Prueba_FormClosing(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.FormClosingEventArgs) _
        Handles Me.FormClosing
        If bEdit Then
            If (MsgBox( _
                    "Guardar cambios ?", _
                     MsgBoxStyle.YesNo, _
                    "guardar")) = MsgBoxResult.Yes Then
                Actualizar(False)
            End If
        End If
    End Sub

    Private Sub Prueba_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
        With DataGridView1
            .DataSource = bs
        End With
        TxtPedido.Text = ""
    End Sub

    Private Sub cargar_registros(ByVal sql As String, _
        ByVal dv As DataGridView)
        Try
            SqlDataAdapter = New SqlDataAdapter(sql, cs)
         Dim SqlCommandBuilder As New SqlCommandBuilder(SqlDataAdapter)
            ' carga el DataTable  
            Dim dt As New DataTable()
            SqlDataAdapter.Fill(dt)
            bs.DataSource = dt
            With dv
                .Refresh()
                .FirstDisplayedScrollingRowIndex = bs.Position
            End With
            bEdit = False
        Catch exSql As SqlException
            MsgBox(exSql.Message.ToString)
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub

    ' botón para guardar los cambios y llenar la grilla  
    Private Sub btnGuardar_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btn_update.Click
        Actualizar()
    End Sub

    Private Sub Actualizar(Optional ByVal bCargar As Boolean = True)
        If Not bs.DataSource Is Nothing Then
            Me.SqlDataAdapter.Update(CType(bs.DataSource, DataTable))
            If bCargar Then
cargar_registros("Select PedidoID,ProductoID,”_
“Cantidad,usuario,d_completa as Unidad”_
“From PedidosDetalles Where PedidoId=" & _ Me.TxtPedido.Text, DataGridView1)
            End If
        End If
    End Sub

    Private Sub btnInicio_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
Handles btnInicio.Click, btnAnterior.Click, _   btnSiguinte.Click, btnFinal.Click
        ' Botones de movimientos
        If sender Is btnAnterior Then
            bs.MovePrevious()
        ElseIf sender Is btnInicio Then
            bs.MoveFirst()
        ElseIf sender Is btnSiguiente Then
            bs.MoveNext()
        ElseIf sender Is btnFinal Then
            bs.MoveLast()
        End If
    End Sub

    Private Sub DataGridView1_CellEndEdit( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
            Handles DataGridView1.CellEndEdit
        bEdit = True
    End Sub

Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click
        Try
            If Me.TxtPedido.Text = "" Then
MsgBox("Debe ingresar un Número de Pedido...!",_ MsgBoxStyle.Critical, "Atención")
            Else
cargar_registros("Select PedidoID,ProductoID,_ Cantidad,usuario,fecha as Unidad From _ PedidosDetallesA Where PedidoId=" & _ Me.TxtPedido.Text, DataGridView1)
            End If
        Catch exSql As SqlException
            MsgBox(exSql.Message.ToString)
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub

    Private Sub btnSalir_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSalir.Click
        Me.Close()
    End Sub
End Class


3 comentarios:

  1. si tienes 2 tablas y una guardas el codigo de otra , pero para efectos de mostrar la descripcion de la segunda tabla como se hace para indicarle al SqlDataAdapter.Updateç(CType(bs.DataSource, DataTable)) que no tome en cuenta el campo de mas que indica la descripcion del codigo del a segunda tabla ?

    ResponderEliminar
  2. Gracias por publicar este código me ha sido de mucha utilidad

    Rubén

    ResponderEliminar
  3. Buen dia

    EL codigo me arroja el siguiente error de tipo SQEXCEPTION

    La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave.

    En la consulta estoy llamando al campo id de mi tabla, y mi tabla is tiene una pk definida, cual es el error entonces ?

    Gracias por la atencin

    ResponderEliminar

Sus comentarios son bienvenidos...