miércoles, 3 de julio de 2013

Grabar y Actualizar en la Base de Datos al cambiar de fila o columna en un DataGrid en VB.Net

miércoles, 3 de julio de 2013

El caso:
Tenemos la tarea de llenar los datos requeridos para guardarlos y mostrarlos en una lista. Pero aveces es necesario y práctico realizar cambios, mas específicamente al tratar de guardar en la BD, con solo poquísima necesidad de hacer clic en cuantos botones y controles pudiéramos disponer para que el usuario final pueda interactuar, ya sea por cuestiones de facilitarlo o porque no hay mucho espacio en la ventana que estemos programando en ese momento. Entonces porque no hacer todo este rollo con solo cambiar de fila o columna, es decir con solo tocar la bendita celda?...pues acá les va un ejemplo práctico.

A la práctica:
En mi DataGridView Cuento con 4 COLUMNAS, que corresponden a 3 CAMPOS de la tabla con la que deseo interactuar, y que cada vez que cambie y valide los datos de las celdas se insertaran o actualizaran dependiendo del caso, y en el caso de eliminar tengo una ultima columna que me permitirá hacer clic para eliminar el registro completo. (Ojo el campo que corresponde a la clave primaria esta oculto en el grid)



Para todo esto deberán ubicar el EVENTO donde se desencadene el cambio de un valor dentro de una celda. En DataGridView se llama CellValueChanged

También tienen que considerar el hecho de como esta estructurado la tabla donde se guardaran los datos, es decir si de hecho poseen un clave primaria y si los demás campos permiten valor nulo, por lo que se validará de la siguiente forma.

Private Sub DataGridView_CellValueChanged(ByVal sender AsSystem.Object, ByVal e AsSystem.Windows.Forms.DataGridViewCellEventArgs) HandlesDataGridView.CellValueChanged


' aca indico si la columna de la fila donde estoy escribiendo es diferente a la ultima columna (eliminar)
            If e.ColumnIndex <> 3 Then
                'aca pondras tu codigo que usaras para interactuar con la BASE DE DATOS
                'ademas de la coneccion, tabien se deben definir las variables
                'que serviran como parametros al momento de insertar o actualizar

                    'en un principio capturamos los datos parametro,
                    'sobre todo el de la celda que contiene la clave primaria,
                    'es decir _cod_util que es un campo numerico

                    ._cod_util = dg_utilidades.Item(0, e.RowIndex).Value
                    ._nombre = dg_utilidades.Item(1, e.RowIndex).Value

                    'si estoy dentro de una columna que implica escribir un numero pues lo valido de la siguiente forma
                    If Not DataGridView.Item(2, e.RowIndex).Value Is Nothing Then
                        If IsNumeric(DataGridView.Item(2, e.RowIndex).Value) = False Then
                            ' si no cumple el requisito de un numero, a lo que escribi recientemente
                            'y se remplaza por su valor por defecto ("")
                            'y terminamos este evento para que vuelvan a escribir correctamente
                            DataGridView.Item(2, e.RowIndex).Value = ""
                            Exit Sub
                        End If

                    End If
                    ._tasa = DataGridView.Item(2, e.RowIndex).Value

                    ' esta validadacion es importante
                    'ya que decidira si se insertara o solo se modificara el registro en la BD
                    ' dependiendo de lo que capturo como dato nuestro parametro _cod_util arriba entonces

                    If ._cod_util = 0 Then
                        'es logigo asumir que si se capturo el valor cero o un valor en blanco o nulo, 
                        'esta operacion es para insertar un nuevo registro
                        'y no se olviden de validar si los demas datos son requisito ingresar,
                        'de lo contrario no considerar estos IF
                        If Not ._nombre Is Nothing Then
                            If ._tasa <> 0 Then
                                'aca usas tu codigo para instertar en la base de datos                               
                               
                                    'una ves grabada la data debemos hacer que la clave primaria retorne
                                    'para que la celda contenga el nuevo dato del codigo unico
                                   
                                    DataGridView.Item(0, e.RowIndex).Value = ._cod_util
                                   
                                End If
                            End If
                        End If
                    Else
                        'si se capturo un valor cualquiera menos los valores cero, vacios o nulos, 
                        'es logico asumir que esta operacion ya tiene un registro en la BD
                        'y solo es para actualizar los datos escritos en las celdas
                        'y no se olviden de validar si los demas datos son requisito ingresar,
                        'de lo contrario no considerar estos IF

                        'si no cumple la validacion devolvemos a la celda el valor anterior para esta celda
                        'que obviamente esta en el registro de la BD
                        'por lo deberiamos hacer una consulta para justamente traer el valor

                        If Not ._nombre Is Nothing Then

                            If ._nombre.Trim.Length <> 0 Then
                           
                                If ._tasa <> 0 Then
                                    'aca usas tu codigo para actualizar en la base de datos
                                Else
                                   
                                    DataGridView.Item(2, e.RowIndex).Value = _sql_config.query_registro("tbl_utilidad", "cod_util=" & DataGridView.Item(0, e.RowIndex).Value).Rows(0).Item("tasa")
                                   
                                End If
                            Else
                               
                                DataGridView.Item(1, e.RowIndex).Value = _sql_config.query_registro("tbl_utilidad", "cod_util=" & DataGridView.Item(0, e.RowIndex).Value).Rows(0).Item("nombre")
                               
                            End If
                        Else
                           
                            DataGridView.Item(1, e.RowIndex).Value = _sql_config.query_registro("tbl_utilidad", "cod_util=" & DataGridView.Item(0, e.RowIndex).Value).Rows(0).Item("nombre")
                           
                        End If

                    End If

                   
                    DataGridView.Item(3, e.RowIndex).Value = "ELIMINAR"

            End If
End Sub

ESTE CODIGO ES SOLO PARA ELIMINAR UN REGISTRO DE LA BASE DE DATOS USANDO COMO DESENCADENADOR UN CELDA EN FORMA DE LINK

Private Sub DataGridView_CellContentClick(ByVal sender AsSystem.Object, ByVal e AsSystem.Windows.Forms.DataGridViewCellEventArgs) HandlesDataGridView.CellContentClick
       
            If e.ColumnIndex = 3 Then

'aca validamos si la celda de la columna donde esta la clave primaria tiene valor o no y de acuerdo a esto eliminar en la BD
                If DataGridView.Item(0, e.RowIndex).Value = 0 Then
                    DataGridView.Rows.RemoveAt(e.RowIndex)
                Else
                    'aca usas tu codigo para actualizar en la base de datos
                        ._cod_util = DataGridView.Item(0, e.RowIndex).Value                      
                        If .transact_utilidades = True Then
                            DataGridView.Rows.RemoveAt(e.RowIndex)
                        End If
                    End With
                End If

            End If
        

    End Sub

Leer mas

Buscar

 
Copyright © 2009 .Net Solucion