none
actualizar db al insertar un dato nuevo en un datagridview RRS feed

  • Pregunta

  • hola estoy trabajando en una aplicacion y necesito ir guardando al momento cada dato q se ingresa a un datagridview.

    tengo este codigo que me guarda todo lo q esta en el datagrid pero solo hasta q estan completamente llenas las lineas y despues de eso ya no actualiza los datos nuevos, y las lineas incompletas no las manda a la base de datos. ademas de que al querer dar clic por segunda vez en el boton actualizar me manda el error que el la imagen esta.

    les pido su ayuda para resolver este problema como les digo necesito q la base de datos se actualize cada que se ingrese un dato nuevo

    gracias de antemano

     Private Sub Actualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Actualizar.Click
            If dgvordenes.Rows.Count = 0 Then
                MessageBox.Show("insertar datos para poder actualizar", "tabla vacia", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End If
            Try
                Using cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\RODRIGO\Documents\control de almacen 1\colorear_Dgv despues de un tiempo\controlalmacen.accdb")
    
                    Dim sql As String = "insert into ENTRADAS(FACTURA,PROVEEDOR,RECIBIÓ,ALMACEN,PIEZAS,INICIO,RECEPCION,VERIFICACION,ETIQUETADO,INGRESO,TRANSCURRIDO,STATUS)VALUES(@FACTURA,@PROVEEDOR,@RECIBIÓ,@ALMACEN,@PIEZAS,@INICIO,@RECEPCION,@VERIFICACION,@ETIQUETADO,@INGRESO,@TRANSCURRIDO,@STATUS)"
                    Dim comando As New OleDbCommand(sql, cnn)
                    For Each row As DataGridViewRow In dgvordenes.Rows
                            comando.Parameters.Clear()
                            comando.Parameters.AddWithValue("@FACTURA", CStr(row.Cells(0).Value))
                            comando.Parameters.AddWithValue("@PROVEEDOR", CStr(row.Cells(1).Value))
                            comando.Parameters.AddWithValue("@RECIBIÓ", CStr(row.Cells(2).Value))
                            comando.Parameters.AddWithValue("@ALMACEN", CStr(row.Cells(3).Value))
                            comando.Parameters.AddWithValue("@PIEZAS", CStr(row.Cells(4).Value))
                            comando.Parameters.AddWithValue("@INICIO", CStr(row.Cells(5).Value))
                            comando.Parameters.AddWithValue("@RECEPCION", CStr(row.Cells(6).Value))
                            comando.Parameters.AddWithValue("@VERIFICACION", CStr(row.Cells(7).Value))
                            comando.Parameters.AddWithValue("@ETIQUETADO", CStr(row.Cells(8).Value))
                            comando.Parameters.AddWithValue("@INGRESO", CStr(row.Cells(9).Value))
                            comando.Parameters.AddWithValue("@TRANSCURRIDO", CStr(row.Cells(10).Value))
                            comando.Parameters.AddWithValue("@STATUS", CStr(row.Cells(11).Value))
                            cnn.Open()
                            comando.ExecuteNonQuery()
                            cnn.Close()
                    Next
    
                End Using
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    sábado, 17 de noviembre de 2012 4:14

Todas las respuestas

  • claro el tema es que alli estas siempre insertando cuando en realidfad deberias agregar logica que valide si el registro existe para realizar un UPDATE

    o sea deberias validar si existen los datos que defines como key y si existe lanzar un UPDATE y no un INSERT

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    en el articulo veras el metodo Exist() que se usa para realziar esta validacion y luego aplciar un insert o update segun corresponda

    si trabjas con metodos para cada accion el codigo quedaria mas prolijo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 17 de noviembre de 2012 23:07
  • Su forma de trabajar no da oportunidad de validar si es un registro nuevo o uno existente que necesita actualización.  Véase http://social.msdn.microsoft.com/Forums/es-ES/winformses/thread/5e9a49e6-48c8-4cdb-acf9-71897ad66a37, donde explico cómo se puede realizar esto correctamente usando una entidad inteligente.

    Jose R. MCP
    Code Samples

    domingo, 18 de noviembre de 2012 0:42
  • gracias por tu ayuda  leandro:

    ahora tengo este codigo:

     Private Sub Actualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Actualizar.Click
            Dim fac, prove, reci, alm, piez, ini, rece, veri, eti, ing, trans, st As String
            If dgvordenes.Rows.Count = 0 Then
                MessageBox.Show("insertar datos para poder actualizar", "tabla vacia", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End If
            Using cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\RODRIGO\Documents\control de almacen 1\colorear_Dgv despues de un tiempo\controlalmacen.accdb")
                Try
                    For Each row As DataGridViewRow In dgvordenes.Rows
                        'If String.IsNullOrEmpty(CStr(row.Cells(0).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(1).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(2).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(3).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(4).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(5).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(6).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(7).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(8).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(9).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(10).Value)) Or String.IsNullOrEmpty(CStr(row.Cells(11).Value)) Then
                        If (row.Cells(6).Value Is DBNull.Value) Or (row.Cells(7).Value Is DBNull.Value) Or (row.Cells(8).Value Is DBNull.Value) Or (row.Cells(9).Value Is DBNull.Value) Then
                            Dim sqln As String = "UPDATE ENTRADAS set FACTURA=@FACTURA,PROVEEDOR=@PROVEEDOR,RECIBIÓ=@RECIBIÓ,ALMACEN=@ALMACEN,PIEZAS=@PIEZAS,INICIO=@INICIO,RECEPCION=@RECEPCION,VERIFICACION=@VERIFICACION,ETIQUETADO=@ETIQUETADO,INGRESO=@INGRESO,TRANSCURRIDO=@TRANCURRIDO,STATUS=@STATUS where id=@FACTURA"
                            Dim comando As New OleDbCommand(sqln, cnn)
                            comando.Parameters.Clear()
                            comando.Parameters.AddWithValue("@FACTURA", CStr(row.Cells(0).Value))
                            comando.Parameters.AddWithValue("@PROVEEDOR", CStr(row.Cells(1).Value))
                            comando.Parameters.AddWithValue("@RECIBIÓ", CStr(row.Cells(2).Value))
                            comando.Parameters.AddWithValue("@ALMACEN", CStr(row.Cells(3).Value))
                            comando.Parameters.AddWithValue("@PIEZAS", CStr(row.Cells(4).Value))
                            comando.Parameters.AddWithValue("@INICIO", CStr(row.Cells(5).Value))
                            comando.Parameters.AddWithValue("@RECEPCION", CStr(row.Cells(6).Value))
                            comando.Parameters.AddWithValue("@VERIFICACION", CStr(row.Cells(7).Value))
                            comando.Parameters.AddWithValue("@ETIQUETADO", CStr(row.Cells(8).Value))
                            comando.Parameters.AddWithValue("@INGRESO", CStr(row.Cells(9).Value))
                            comando.Parameters.AddWithValue("@TRANSCURRIDO", CStr(row.Cells(10).Value))
                            comando.Parameters.AddWithValue("@STATUS", CStr(row.Cells(11).Value))
                        Else
                            Dim sql As String = "INSERT INTO ENTRADAS(FACTURA,PROVEEDOR,RECIBIÓ,ALMACEN,PIEZAS,INICIO,RECEPCION,VERIFICACION,ETIQUETADO,INGRESO,TRANSCURRIDO,STATUS)VALUES(@FACTURA,@PROVEEDOR,@RECIBIÓ,@ALMACEN,@PIEZAS,@INICIO,@RECEPCION,@VERIFICACION,@ETIQUETADO,@INGRESO,@TRANSCURRIDO,@STATUS)"
                            Dim comando As New OleDbCommand(sql, cnn)
                            fac = CStr(row.Cells(0).Value)
                            prove = CStr(row.Cells(1).Value)
                            reci = CStr(row.Cells(2).Value)
                            alm = CStr(row.Cells(3).Value)
                            piez = CStr(row.Cells(4).Value)
                            ini = CStr(row.Cells(5).Value)
                            rece = CStr(row.Cells(6).Value)
                            veri = CStr(row.Cells(7).Value)
                            eti = CStr(row.Cells(8).Value)
                            ing = CStr(row.Cells(9).Value)
                            trans = CStr(row.Cells(10).Value)
                            st = CStr(row.Cells(11).Value)
                            comando.Parameters.AddWithValue("@FACTURA", fac)
                            comando.Parameters.AddWithValue("@PROVEEDOR", prove)
                            comando.Parameters.AddWithValue("@RECIBIÓ", reci)
                            comando.Parameters.AddWithValue("@ALMACEN", alm)
                            comando.Parameters.AddWithValue("@PIEZAS", piez)
                            comando.Parameters.AddWithValue("@INICIO", ini)
                            comando.Parameters.AddWithValue("@RECEPCION", rece)
                            comando.Parameters.AddWithValue("@VERIFICACION", veri)
                            comando.Parameters.AddWithValue("@ETIQUETADO", eti)
                            comando.Parameters.AddWithValue("@INGRESO", ing)
                            comando.Parameters.AddWithValue("@TRANSCURRIDO", trans)
                            comando.Parameters.AddWithValue("@STATUS", st)
                            cnn.Open()
                            comando.ExecuteNonQuery()
                        End If
                    Next
                Catch ex As Exception
                    MessageBox.Show("Error del Sistema" & vbCrLf & ex.Message, "No se puede actualizar la base de datos.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    
                End Try
            End Using
        End Sub

    el problema es q al insertar un nuevo registro en el programa solo se llenan los datos;

    1) FACTURA,PROVEEDOR,RECIBIÓ,ALMACEN,PIEZAS,INICIO,TRANSCURRIDO(lo genera un cronometro) Y STATUS

    conforme pasa el tiempo y se van concluyendo los procesos, se van generando:

    2) RECEPCION,VERIFICACION,ETIQUETADO,INGRESO

    estos son los datos nulos al principo pero necesito q al dar clic en actualizar se guarden los primeros datos y tambien los segundos (en nullos, para despues al dar otra ves clic y ya este generado el dato  sea, se actualize automaticamente en la base de datos)

    el codigo q te muestro lo tome de una respuesta  q diste en este link:http://social.msdn.microsoft.com/Forums/es/vbes/thread/772107d7-e54c-40f5-8ccc-f02b8449112e

    me permite guardar, pero solo hasta q esta completamente llena toda la linea y como te decia antes necesito q se guarde desde un principio aun q le falten los datos q despues de iran generando.

    denuevo te agradesco tu ayuda  ahora con este tema

    saludos....

    lunes, 19 de noviembre de 2012 4:01